代碼、高清pdf版在我的下載下傳裡可以找到
基于上一章,我們知道要0x80--0xE3--0x81--讀取資料這樣的發送讀取方式,是以我們需要明白生成代碼函數的參數意義!
1、發送函數,找到如下函數,各個參數的意思如圖;注意wait這個參數,我們就給0xff,這個是等待起始條件的時長,不能太短,是以給個0xff。比如我要發送1個長度的指令:
R_IICA0_Master_Send(TH06_ADDER,TH06_CMD,1u,0xffu);
2、接收函數,找到如下函數,各個參數的意思如圖,比如我要接收2個長度的資料:
R_IICA0_Master_Receive(TH06_ADDER,TH06_TEMP,2u,0xffu);
這兩個函數懂了,下面我們開始程式設計!
變量常量定義
- 首先我們需要位址常量,宏定義一個位址
#define TH06_ADDER 0x80u
- 存放讀取溫度的指令數組
unsigned char TH06_CMD[1]={0xE3u};
- 存放讀取的溫度數值數組,16位,2個位元組
unsigned char TH06_TEMP[2];
- 注意,為了不使總線的狀态錯亂掉,我們需要一個全局變量來訓示目前的總線狀态,定義一個全局變量,以及5個狀态,
unsigned char I2C_STATE;
#define IDLE 0u //空閑
#define Sending 1u //正在發送
#define SendEnd 2u //發送完成
#define Recving 3u //正在接收
#define RecvEnd 4u //接收完成
上面的代碼定義在檔案的位置如下圖紅框内:
主函數編寫
I2C總線狀态初始化,然後再狀态切換!
上面就是在對于的狀态下,實作對應的操作。
白話流程:
目前總線空閑,我進入空閑狀态,然後向TH06C發送E3指令,就是發送寫操作,狀态切為正在發送,
然後一直等到發送完成(這裡的狀态切換在發送完成函數裡,下面會講),進入發送完成狀态,接下來準備讀操作,狀态切為正在接受,
然後一直等到接收完成(這裡的狀态切換在接收完成函數裡,下面會講),切為空閑。
以上不斷循環就ok了
下面講解發送完成、接收完成函數中的操作
在函數中,加入圖中紅色方框的代碼,這樣就完成狀态的切換。
接下來是重點,非常重要的一點;
我們重新看一下通信的時序圖,
因為生成的接收函數,發送函數被調用時,都會産生一個起始信号,有些I2C是要檢測到停止信号才允許産生起始信号,是以如果我們在發送完成的時候不做處理,這個就會出現錯誤,下面找到主晶片的資料手冊,我們找到設定這個的寄存器,就是把STCENn置位1。
是以我們在發送完成函數中要這樣處理:
停止總線運作(IICE0=0),然後運作不産生停止條件就可以生成其實條件(STCEN0=1),總線開始運作(IICE0=1)。
是以還需在發送完成函數中添加如下紅色框的語句:
這樣整個代碼就完成了!
下載下傳仿真,得的資料如下
代入換算公式:
差不多為15.01攝氏度,跟今天天氣差不多,有點冷!!
這裡說一句,我實際項目不會這麼做,實際項目會改寫成一個函數調用實作,這樣的話就需要改生成的代碼,這樣就需要了解生成的代碼,這樣太麻煩,是以我不記錄這個詳細的過程。不過你看懂了生成代碼,改代碼也就1小時的事情! 哈哈