- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- Permalink
- 印刷
- 不適切なコンテンツを報告
FX3をマスタとして、スレーブとなるセンサに対してI2C通信をしようとしています。
コマンド列としては、下記のようなものです。
FX3で、このようなコマンドのやり取りを実施する方法をご教示ください。
例1)
Start(1bit) - SlaveID(0xDA) - Protocol Ver. (0xF2) - API Code (0x20) - Write data(0x02, 0x00, 0x00) - Read Data (0x01) - Checksum (0x15)
Start(1bit) - SlaveID Read(8bit) - Ack/NAck(8bit) - Read Data(8bit) - Return Value (8bit) - Checksum(8bit) - Stop(1bit)
(ACKからChecksumまではSlaveが応答)
例2)
Start(1bit) - SlaveID(0xDA) - Protocol Ver. (0xF2) - API Code (0x20) - Write data(0x03, 0x02, 0x9F, 0x03) - Read Data (0x00) - Checksum (0xB9)
Start(1bit) - SlaveID Read(8bit) - Ack/NAck(8bit) - Read Data(8bit) - Checksum(8bit) - Stop(1bit)
(ACKからChecksumまではSlaveが応答)
CX3 I2C Communication with OV5640 Directly
に資料が付加されており拝見しましたが、スレーブIDを含めたリードとライトが8byte以下になる
必要があるような記載になっており、やりたい事は実現できないのでは?と思っている次第です。
以上、よろしくお願いします。
解決済! 解決策の投稿を見る。
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- Permalink
- 印刷
- 不適切なコンテンツを報告
例1)
Start(1bit) - SlaveID(0xDA) - Protocol Ver. (0xF2) - API Code (0x20) - Write data(0x02, 0x00, 0x00) - Read Data (0x01) - Checksum (0x15) までがI2C Write命令で、
Start(1bit) - SlaveID Read(8bit) - Ack/NAck(8bit) - Read Data(8bit) - Return Value (8bit) - Checksum(8bit) - Stop(1bit) までがI2C Read命令であるならば実装が可能です
例2)
Start(1bit) - SlaveID(0xDA) - Protocol Ver. (0xF2) - API Code (0x20) - Write data(0x03, 0x02, 0x9F, 0x03) - Read Data (0x00) - Checksum (0xB9) までがI2C Write命令で、
Start(1bit) - SlaveID Read(8bit) - Ack/NAck(8bit) - Read Data(8bit) - Checksum(8bit) - Stop(1bit) までがI2C Read命令であるならば実装が可能です。
FX3 API GuideにてI2C命令の書き方については記載があります。プリアンブルについてはFX3 API GUide p69, p70をご参照ください。
例1の場合、以下のような記述で通信が実現できます。
Code snippet for 例1 |
---|
data[0] = Protocol Version data[1] = API code data[2] = Write Data data[3] = Write Data1 data[4] = Write Data2 data[5] = Read Data Size data[6] = Check-sum preamble.length = 1; preamble.buffer[0] = SlaveID; preamble.ctrlMask = 0x0000; CyU3PI2cTransmitBytes(&preamble, data, 7 , 0); preamble.length = 2; preamble.buffer[0] = SlaveID; preamble.buffer[1] = SlaveID | 0x01; preamble.ctrlMask = 0x0001; CyU3PI2cReceiveBytes(&preamble, data, 4, 0); |
よろしくお願い致します。
Hirotaka Takayama
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- Permalink
- 印刷
- 不適切なコンテンツを報告
FX3でI2C通信を行う際の通信は、スタートビット送信後、主に、プリアンブルと、データ送信/受信で構成されます。
プリアンブルは、アドレスの指定に使われ、スレーブアドレス(スレーブID)の指定と、スレーブ内部アドレス空間のアドレス指定ができます。Read通信のために、スタートコンディションを再送することも可能です。
このプリアンブルのために0xE000041C (I2C_PREAMBLE_DATA)から8バイト分データレジスタが確保されており、FWでプリアンブルバッファにデータを格納した際、ここに格納されます。8バイトよりも多いプリアンブルは指定できません。
プリアンブルの後に、I2C Writeであれば、実際に送信したいデータが続きます。I2C Readであれば、スレーブがデータを返します。
いただいている情報だけですと、実現可否についてはまだわかりません。
どこからどこまでがWriteで、どこからがReadなのかを明確にしていただけますと助かります。
(Protocol Ver, API code, ChecksumはI2C slaveに書き込まれる値ですか?Writeの後のRead Dataというのはどのような処理をしますか?FX3がI2C Readを実行しますか?「ACKからCheckSumまではSlaveが応答」とのことですが、これはその手前までのフォーマットに従ってI2Cスレーブに対してWrite/(Read)を行った後、Readするとその形式で送られてくるということでしょうか?など。)
よろしくお願い致します。
Hirotaka Takayama
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- Permalink
- 印刷
- 不適切なコンテンツを報告
例1)
Start(1bit) - SlaveID(0xDA) - Protocol Ver. (0xF2) - API Code (0x20) - Write data(0x02, 0x00, 0x00) - Read Data (0x01) - Checksum (0x15) までがI2C Write命令で、
Start(1bit) - SlaveID Read(8bit) - Ack/NAck(8bit) - Read Data(8bit) - Return Value (8bit) - Checksum(8bit) - Stop(1bit) までがI2C Read命令であるならば実装が可能です
例2)
Start(1bit) - SlaveID(0xDA) - Protocol Ver. (0xF2) - API Code (0x20) - Write data(0x03, 0x02, 0x9F, 0x03) - Read Data (0x00) - Checksum (0xB9) までがI2C Write命令で、
Start(1bit) - SlaveID Read(8bit) - Ack/NAck(8bit) - Read Data(8bit) - Checksum(8bit) - Stop(1bit) までがI2C Read命令であるならば実装が可能です。
FX3 API GuideにてI2C命令の書き方については記載があります。プリアンブルについてはFX3 API GUide p69, p70をご参照ください。
例1の場合、以下のような記述で通信が実現できます。
Code snippet for 例1 |
---|
data[0] = Protocol Version data[1] = API code data[2] = Write Data data[3] = Write Data1 data[4] = Write Data2 data[5] = Read Data Size data[6] = Check-sum preamble.length = 1; preamble.buffer[0] = SlaveID; preamble.ctrlMask = 0x0000; CyU3PI2cTransmitBytes(&preamble, data, 7 , 0); preamble.length = 2; preamble.buffer[0] = SlaveID; preamble.buffer[1] = SlaveID | 0x01; preamble.ctrlMask = 0x0001; CyU3PI2cReceiveBytes(&preamble, data, 4, 0); |
よろしくお願い致します。
Hirotaka Takayama