您好!
通过 i2c 总线发送数据时、似乎需要在各个通信之间实现短延迟。
例如、i2c 接口忙于发送数据。 i2c 接口完成传输后立即执行
(最后一个字节已发送且接口空闲)新通信开始。 现在、需要短延迟
i2c 接口之前。 否则、i2c 接口会卡住并停止工作。 对接口进行软复位没有任何帮助。
然后需要对接口进行硬复位。 延迟时间约为2毫秒。
这是我在向从器件发送数据时所做的操作。
[...] ///等待主器件准备就绪。 DRV_i2c2_WAIT_BUSY (); //主设备从现在开始处于忙状态。 BO_BUSY = true; //插入延迟时间。 否则主器件会卡住。 DRV_i2c2_delay (com_delay_loops); //设置工作变量。 ui8_len = ui8_len; pu8_data = pu8_data; ui32_action = I2C_MASTER_CMD_SINGLE_SEND; ui8_MODE = SINGLE_SEND; //如果只有一个参数使用单发送命令。 if (ui8_len > 1) { ///设置操作。 ui32_action = I2C_MASTER_CMD_BURST_SEND_START; ui8_mode = burse_send; } //启用中断。 ROM_IntEnable (INT_I2C2); ROM_I2CMasterIntEnableEx (I2C2_base、I2C_MASTER_INT_DATA); //向主器件告知从器件地址以及我们要写入的数据。 ROM_I2CMasterSlaveAddrSet (I2C2_base、u8_addr、false); //交出第一个字节。 ROM_I2CMasterDataPut (I2C2_base、*(pu8_data++)); //开始发送数据。 ROM_I2CMasterControl (I2C2_base、ui32_action); //等待主机完成数据发送。 ///注:发送数据在 ISR 中完成。 DRV_i2c2_WAIT_BUSY (); //返回 (I2C_ERR_NONE); }
数据的发送在中断服务例程中完成。 标志指示主器件是忙还是空闲。 传输时的延迟。 标志在新传输开始时置1、在发送/接收完最后一个字节后清零。
微控制器以120MHz 的频率运行。 i2c 接口以400kHz 的快速模式运行、总线上有一个主器件和三个从器件。
是否有什么想法会导致上述行为?
此致
Marco