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;
}
|