天天看點

基于Renesas晶片的 TH06C溫濕度的嵌入式開發 (五)

                                 代碼、高清pdf版在我的下載下傳裡可以找到

基于上一章,我們知道要0x80--0xE3--0x81--讀取資料這樣的發送讀取方式,是以我們需要明白生成代碼函數的參數意義!

1、發送函數,找到如下函數,各個參數的意思如圖;注意wait這個參數,我們就給0xff,這個是等待起始條件的時長,不能太短,是以給個0xff。比如我要發送1個長度的指令:

 R_IICA0_Master_Send(TH06_ADDER,TH06_CMD,1u,0xffu);

基于Renesas晶片的 TH06C溫濕度的嵌入式開發 (五)

2、接收函數,找到如下函數,各個參數的意思如圖,比如我要接收2個長度的資料:

R_IICA0_Master_Receive(TH06_ADDER,TH06_TEMP,2u,0xffu);

基于Renesas晶片的 TH06C溫濕度的嵌入式開發 (五)

這兩個函數懂了,下面我們開始程式設計!

變量常量定義

  1. 首先我們需要位址常量,宏定義一個位址

   #define TH06_ADDER  0x80u

  1. 存放讀取溫度的指令數組

          unsigned char TH06_CMD[1]={0xE3u};

  1. 存放讀取的溫度數值數組,16位,2個位元組

   unsigned char TH06_TEMP[2];

  1. 注意,為了不使總線的狀态錯亂掉,我們需要一個全局變量來訓示目前的總線狀态,定義一個全局變量,以及5個狀态,

unsigned char I2C_STATE;

#define IDLE      0u  //空閑

#define Sending   1u  //正在發送

#define SendEnd   2u  //發送完成

#define Recving   3u  //正在接收

#define RecvEnd  4u  //接收完成

上面的代碼定義在檔案的位置如下圖紅框内:

基于Renesas晶片的 TH06C溫濕度的嵌入式開發 (五)
基于Renesas晶片的 TH06C溫濕度的嵌入式開發 (五)

主函數編寫

I2C總線狀态初始化,然後再狀态切換!

基于Renesas晶片的 TH06C溫濕度的嵌入式開發 (五)

上面就是在對于的狀态下,實作對應的操作。

白話流程:

目前總線空閑,我進入空閑狀态,然後向TH06C發送E3指令,就是發送寫操作,狀态切為正在發送,

然後一直等到發送完成(這裡的狀态切換在發送完成函數裡,下面會講),進入發送完成狀态,接下來準備讀操作,狀态切為正在接受,

然後一直等到接收完成(這裡的狀态切換在接收完成函數裡,下面會講),切為空閑。

以上不斷循環就ok了

下面講解發送完成、接收完成函數中的操作

在函數中,加入圖中紅色方框的代碼,這樣就完成狀态的切換。

基于Renesas晶片的 TH06C溫濕度的嵌入式開發 (五)

接下來是重點,非常重要的一點;

我們重新看一下通信的時序圖,

基于Renesas晶片的 TH06C溫濕度的嵌入式開發 (五)

因為生成的接收函數,發送函數被調用時,都會産生一個起始信号,有些I2C是要檢測到停止信号才允許産生起始信号,是以如果我們在發送完成的時候不做處理,這個就會出現錯誤,下面找到主晶片的資料手冊,我們找到設定這個的寄存器,就是把STCENn置位1。

基于Renesas晶片的 TH06C溫濕度的嵌入式開發 (五)

是以我們在發送完成函數中要這樣處理:

停止總線運作(IICE0=0),然後運作不産生停止條件就可以生成其實條件(STCEN0=1),總線開始運作(IICE0=1)。

是以還需在發送完成函數中添加如下紅色框的語句:

基于Renesas晶片的 TH06C溫濕度的嵌入式開發 (五)

這樣整個代碼就完成了!

下載下傳仿真,得的資料如下

基于Renesas晶片的 TH06C溫濕度的嵌入式開發 (五)

代入換算公式:

基于Renesas晶片的 TH06C溫濕度的嵌入式開發 (五)

差不多為15.01攝氏度,跟今天天氣差不多,有點冷!!

這裡說一句,我實際項目不會這麼做,實際項目會改寫成一個函數調用實作,這樣的話就需要改生成的代碼,這樣就需要了解生成的代碼,這樣太麻煩,是以我不記錄這個詳細的過程。不過你看懂了生成代碼,改代碼也就1小時的事情! 哈哈