FX3とセンサとのI2C通信について

Tip / ログイン to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
TeMa_2997106
Level 6
Level 6
Distributor - TED (Japan)
10 likes received 10 solutions authored 250 replies posted

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以下になる

必要があるような記載になっており、やりたい事は実現できないのでは?と思っている次第です。

以上、よろしくお願いします。

0 件の賞賛
1 解決策

例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

元の投稿で解決策を見る

0 件の賞賛
2 返答(返信)