代码、高清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小时的事情! 哈哈