HC32F005, 参考hc32f005_ddl_Rev1.9.0 Lite的i2c_bl24c08_poll, 请教个问题:
如果往BL24C08写一个字节,时序是这样的:
我理解的状态跳转是从0x08 => 0x18=>0x28=>产生stop位,对吗?
如果理解正确,那么产生stop位是在哪里实现的?代码中I2C_SetFunc(I2CX,I2cStop_En)执行条件:
1. 进入0x30状态。但进入0x30的条件是收到从机NACK,这里不满足。
2. 满足u8i>u32Len。但只写了1个字节,u8i=1, u32Len=1,不满足。
- en_result_t I2C_MasterWriteData(M0P_I2C_TypeDef* I2CX,uint8_t u8Addr,uint8_t *pu8Data,uint32_t u32Len)
- {
- en_result_t enRet = Error;
- uint8_t u8i=0,u8State;
- I2C_SetFunc(I2CX,I2cStart_En);
- while(1)
- {
- while(0 == I2C_GetIrq(I2CX))
- {;}
- u8State = I2C_GetState(I2CX);
- switch(u8State)
- {
- case 0x08: ///< 已发送起始条件
- I2C_ClearFunc(I2CX,I2cStart_En);
- I2C_WriteByte(I2CX,I2C_SLAVEADDR); ///< 从设备地址发送
- break;
- case 0x18: ///< 已发送SLA+W,并接收到ACK
- I2C_WriteByte(I2CX,u8Addr); ///< 从设备内存地址发送
- break;
- case 0x28: ///< 上一次发送数据后接收到ACK
- I2C_WriteByte(I2CX,pu8Data[u8i++]); ///< 继续发送数据
- break;
- case 0x20: ///< 上一次发送SLA+W后,收到NACK
- case 0x38: ///< 上一次在SLA+读或写时丢失仲裁
- I2C_SetFunc(I2CX,I2cStart_En); ///< 当I2C总线空闲时发送起始条件
- break;
- case 0x30: ///< 已发送I2Cx_DATA中的数据,收到NACK,将传输一个STOP条件
- I2C_SetFunc(I2CX,I2cStop_En); ///< 发送停止条件
- break;
- default:
- break;
- }
- if(u8i>u32Len)
- {
- I2C_SetFunc(I2CX,I2cStop_En); ///< 此顺序不能调换,出停止条件
- I2C_ClearIrq(I2CX);
- break;
- }
- I2C_ClearIrq(I2CX); ///< 清除中断状态标志位
- }
- enRet = Ok;
- return enRet;
- }
|