求教:
项目需求:使用RA-08模块作为I2C主站,读取传感器数据,传感器数据接口IIC接口,之前应用于STM32主板,在STM32应用时使用硬件I2C接口,应用正常。
目前使用RA-08模块的IIC接口,从RA-08参考手册中获得信息:15.3 数据传输顺序
I2C 以 1 字节递增的方式传输数据,遵循以下顺序:
1. Start
2. 7 位从机地址
3. R/nW 位
4. ACK
5. 8 位数据
6. Acknowlegement
7. 重复步骤 5 和步骤 6
8. Repeat Start(重复步骤 1)或 Stop
参考手册:P144页描述: RA-08从机寻址:
作为主机设备,I2C 必须要构建和发送一次事务的第一个字节。这个字节由 7 位的从机地址和 1 位的 R/nW 组成。第一个字节的发送必须要得到从设备的 ACK 响应。如果是写事
务,I2C 保持在主机发送模式,同时从机保持在接收模式。如果是读事务,I2C 在收到ACK 后马上切换到主机接收模式,同时从机切换到发送模式。如果收到 NAK,I2C 自动发
送 Stop 条件并且把 I2Cx_SR{BED}置 1 来中止当前事务。
目前在测试疑问在于:RA-08作为主站发送7bit从机地址和R/W位后,需要等待从机的ACK信号,目前从tremo_i2c.c底层驱动库以及参考手册中没有找到明细的配置RA-08在发送从机地址后如何接收或者判断从机ACK响应的代码和信息。而代码例程库中均为较为简单的函数操作。
目前主要的函数应用涉及到以下:
【1】i2c_master_send_start(I2C1, YL_SLAVE_ADDR, I2C_WRITE);
i2c_clear_flag_status(I2C1, I2C_FLAG_TRANS_EMPTY);
i2c_get_flag_status(I2C1, I2C_FLAG_TRANS_EMPTY);
发送7bit从机地址+1为读写,共计8位。并等待这8位数据发送完毕。之后按照流程应该要接收来自从机的ACK响应
【2】 // read data
i2c_set_receive_mode(I2C0, I2C_NAK);
位 2 ACKNAK:主机接收模式 ACK/NAK 控制位。
1:接收完成一个字节后发送 NAK
0:接收完成一个字节后发送 ACK
从机模式,从地址匹配或者接收完成时,I2C 单元自动发送一个 ACK,不论 ACKNAK 是否置 1。
while (i2c_get_flag_status(I2C0, I2C_FLAG_RECV_FULL) != SET)
;
i2c_clear_flag_status(I2C0, I2C_FLAG_RECV_FULL);
data = i2c_receive_data(I2C0);
这个则是主机切换到接收模式,接收来自从机的数据之后主动发送ACK/NAK的配置操作。
同比以上则疑问点在于:RA-08处于主机模式时,发送数据之后没有找到如何配置判断从机响应ACK的操作,但是RA-08处于从机模式接收来自从机数据的时候则有配置RA-08模块发送ACK/NAK的操作。
以上代码实际测试时发现:读不到从机数据,且程序类似死机,卡死在 while (i2c_get_flag_status(I2C0, I2C_FLAG_RECV_FULL) != SET)。
|