您好,
我终于实现了I2C驱动程序,但是我希望有一个超时控制,以防传输时间过长。
我将当前代码发布在下面。 如果XRDY寄存器未准备好太长时间,我只想让传输停止并释放总线。 我尝试重置模块,从硬件角度看它工作正常(总线已简单释放),但软件不发送停止条件,因此无法传输下一个字节( I2CMDR的STP位未就绪)。 如何强制停止条件?
I2C_Error_e I2C_writeData (I2C_handle i2cHandle,Int16_t地址,uint16_t数据[],uint16_t bytesToSend_no) { 静态Int16_t iByte,cntTimeout = 0; //检查总线是否未等待停止状态 IF (i2cHandle->I2CMDR.bit.stp ==1) { 返回I2C_Error_StpNotReady; } //检查总线是否繁忙 IF (i2cHandle->I2CSTR.bit.BB ==1) { 返回I2C_Error_Busy ;} //设置从属地址 I2C_setSlaveAddress (i2cHandle,地址); //设置要发送的字节数 I2C_setDataBytesNumber (i2cHandle,bytesToSend_no); //在生成停止条件后,将主模式设置为自动切换为从属模式 I2C_setMode (i2cHandle,I2C_Mode_Master_Transmitter); //准备在传输结束后发送的停止条件 I2C_STOP (i2cHandle); //发送启动条件 I2C_START (i2cHandle); for (iByte = 0;iByte<bytesToSend_no;iByte++) {
//在巴士免费之前不做任何事情 while ( i2cHandle->I2CSTR.bit.XRDY ==0) { IF (cntTimeout++> 1000)//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 在此处松开总线 { I2C_RESET (i2cHandle); I2C_ENABLE (i2cHandle); 返回I2C_Error_timeout; } }; //将数据发送到传输寄存器 i2cHandle->I2CDXR =数据[iByte]; } 返回I2C_Error_NoError; }

