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 返答(返信)
HirotakaT_91
Moderator
Moderator
Moderator
500 replies posted 250 replies posted 100 replies posted

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

0 件の賞賛

例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 件の賞賛