60歳からの電子工作ノート

生涯学習として取り組んでいます。

I2C通信とSPI通信(I2C通信 プロトコルとRIIC割り込み未使用プログラム)

 本ボードで使用しているCPU(RX23E-A)にはI2C通信としてRIICと簡易I2Cがあります。(資料1*1の「29. I2Cバスインターフェイス(RIICa)」と「28.7 簡易I2Cモードの動作」)

プロトコルとしては、マスタ送信(書き込み)、マスタ受信(読み出し)、マスタ送受信(書き込み後読み出し)があります。
(資料2*2と資料3*3 )

 温湿度センサ(AHT25)(ASAIR (Guangzhou Aosong Electronic)製)(I2C通信付き) とサーモパイル型赤外線センサ(A3D01S-FU-50-60)(日本セラミック製)(SMBus付き)用に、RIICのプログラムを作成しました。最初なので「RIIC割り込み」は使用していません。

 


温湿度センサ(AHT25)

温湿度センサ(AHT25)は、「マスタ送信」でコマンドを発行し、その後「マスタ受信」で温湿度データを得ます。

マスタ送信

i図1. マスタ送信

マスタ受信

図2. マスタ受信(1byte)

図3. マスタ受信(7byte受信)

マスタ送信フロー

図4. マスタ送信フロー(割り込み未使用)



マスタ受信フロー

図5. マスタ受信フロー(割り込み未使用)


RIIC初期設定フロー

図6. RIIC初期設定フロー

図7. RIIC初期設定フロー(補足)



温湿度データの読み出し

「マスタ送信」と「マスタ受信」については、資料4*4の7.4 Sensor Reading Processと、資料5*5に記載されています。

測定を頻繁に行うとセンサ自体の温度上昇により精度に影響がでるそうです。測定周期は2秒が推奨されています。(資料4の4.4 Temperature Effect )

Calibration status check(ステータスの1バイト読み出し)は電源投入時に1度だけ実施すればよいようです。(資料4の7.4 Sensor Reading Process)

受信データのCRC多項式は、 x^{8}+x^{5}+x^{4}+1 (0x31) (初期値=0xff)です。演算は資料5にあります。ここではCRCを含めた受信データ(合計7byte)を演算し、0であればデータに誤り無しとしています。

この「マスタ送信」「マスタ受信」では、RIIC割り込みを使用していません。送信または受信が完了するまで待ちます。

電源は3.3[V]または5[V]です。

図8. 温湿度データの読み出しフロー


サーモパイル型赤外線センサ(A3D01S-FU-50-60)

サーモパイル型赤外線センサは「マスタ送受信」を使用して温度データを得ます。通信形式がSMBusとなっています。

マスタ送受信

図9. マスタ送受信

マスタ送受信フロー

図10.マスタ送受信フロー

温度データの読み出し

「マスタ送受信」によりコマンド(0x70)を送信すると、センサ周辺温度が得られます。コマンド(0x71)により測定対象物の温度が得られます。(資料6*6 )

PEC(packet error code)の8ビットCRC多項式は、 x^{8}+x^{2}+x+1(0x07)(CRC-8-ATM)です。
マイコンCRC演算器(資料1の「32. CRC 演算器(CRC)」)を使用します。

電源は、5[V]です。

図11. 温度データ読み出しフロー(サーモパイル型赤外線センサ)

図12. マイコンCRC演算器によるCRCチェック


プログラム

温湿度センサとサーモパイルのテストプログラムです。

図13. ファイル一覧

GitHub登録場所: https://github.com/vABCWork/RIIC_no_intr

ルネサス提供ファイルとは、CS+の新規プロジェクトで作成されるファイルです。

詳細は、https://vabc.hatenadiary.jp/entry/2021/12/18/111954

実験

オシロの波形(温湿度センサ)

 温湿度センサ(AHT25)のマスタ送信、マスタ受信時の波形です。

ノイズのためか、データ(SDA)に0.5[usec]程度のグリッチが見られます。

図14. マスタ送信 (温湿度センサ)

 

図15. マスタ送信 グリッチ(0.5 [usec])

 

図16. マスタ受信 7バイト (温湿度センサ)

図17. マスタ受信 7バイト グリッチ(0.5usec)

オシロの波形(サーモパイル)

マスタ送受信時の波形です。データに影響はありませんが、データ(SDA)に2[usec]程度の大きなグリッチが見られました。測定条件は温湿度センサと同じです。原因はわかりません。

 

図18. マスタ送受信(サーモパイル)

図19. マスタ送受信 グリッチ(2[usec])

図20. マスタ送受信 グリッチ (ACK受信前)

変数の値

読み出しデータから温度(湿度)を計算した値です。

図21. 温度(湿度)の変数の値

実験風景

 センサボードと接続しているUSBケーブルは約30[cm]です。

図22. 実験風景

追記 (2022年8月30日)

 上記の実験ではSCLクロックが100[KHz]を超えています。 これはRIICの通信速度の設定で、資料1の「表 29.5 転送速度に対する ICBRH、ICBRLレジスタの設定例」をそのまま使用したためです。この設定例ではSCL0ラインの立ち上がり時間(tr)を1000 ns、立ち下がり時間(tf)を300 nsを前提としています。実際の波形(図17)を見ると、立ち上がり時間(tr)は1000ns(1us)ありません、100ns程度です。立下り時間(tf)はほぼ0です。前提とした周期より実際の周期が短いので、周波数が高くなりました。

転送速度(Bps)の計算式は、(資料1の「29.2.14 I2C バスビットレートHigh レジスタ(ICBRH)」より)

  Bps = \dfrac{1}{\dfrac{(ICBRH+1)+(ICBRL+1)}{IICΦ}+tr +tf}

ICBRH: SCL High幅 (b4-b0), b7-b5は1

ICBRL: SCL Low幅 (b4-b0), b7-b5は 1

IICΦ :  内部基準クロック

tr:立ち上がり時間 0.3xVCCから0.7xVddまでの時間。(Vdd=5Vでは、1.5Vから3.5Vまで)

tf:立ち下がり時間 0.7xVCCから0.3xVddまでの時間

設定例の値で実際に計算すると、

SCL High幅 = 15 (ICBRH= 0xEF )

SCL Low幅 = 18 (ICBRL= 0xF2 )

IICΦ=  32/8 = 4[MHz]  (RIIC0.ICMR1.BIT.CKS = 3)    

tr=1000[ns], tf=300[ns]

  Bps = \dfrac{1}{\dfrac{(15+1)+(18+1)}{4 MHz}+ 1us + 0.3us}   

 99.5 [Kbps]となります。

立ち上がり時間(tr)=120[ns],立ち下がり時間(tf)=0[ns]として計算すると、112[Kbps]となります。(オシロによる実測値は103[Kbps]でした。一致しない原因はクロックの精度や測定法が影響していると思いますがよくわかりません。) 

図23. RIICのタイミング

(資料1の「39.4.5.6 RIIC」の表39.38 RIICタイミングと図39.61 RIIC バスインタフェース入出力タイミング/ 簡易I2C バスインタフェース入出力タイミング」及び、

資料7*7の 「6. I/O ステージとバスラインの電気特性とタイミング」の表10と図38)より作成。)

 

*1:資料1「RX23E-Aグループ ユーザーズマニュアル ハードウェア編 ( R01UH0801JJ0120 Rev.1.20)」

*2:資料2「RX ファミリ I2C バスインタフェース(RIIC)モジュール Firmware Integration Technology (R01AN1692JJ0249 Rev.2.49)」

*3:資料3「RX ファミリ 簡易 I2C モジュール Firmware Integration Technology (R01AN1691JJ0249 Rev.2.49)」

*4:資料4「AHT25 データシート」 "akizukidenshi.com/download/ds/aosong/AHT25.pdf"

*5:資料5「STM32 の AHT20ルーチン (aht20_stm32demov1_4)」"www.aosong.com/class-36.html "

*6:資料6「A3D01S-FU-50-60 データシート」akizukidenshi.com/download/ds/nicera/A3D01S-FU-50-60.pdf

*7:資料7「UM10204 I2C バス仕様およびユーザーマニュアル」 Rev. 5.0J — 2012 年10 月9 日