在函数i2c_eeprom_write_byte中,它首先等待eeprom就绪。在i2c_wait_until_eeprom_ready ();它重复,如果不是ACK。但是,它只在i2c数据总线上发送0x08而不是设备地址。车上不应该有AKC。然后它会在这里无限循环。
当我进入SEND_I2C_COMMAND(0x08)时,运行按钮是灰色的,似乎cpu停止了。然后我点击停止按钮,指针仍然在SEND_I2C_COMMAND。
有人知道如何解决这个问题吗?
Void i2c_eeprom_write_byte(uint32_t address, uint8_t wr_data)
{
i2c_wait_until_eeprom_ready ();
i2c_send_address(地址);
WAIT_WHILE_I2C_FIFO_IS_FULL ();//如果I2C Tx FIFO是满的,等待
SEND_I2C_COMMAND (wr_data & 0 xff);//发送写数据
WAIT_UNTIL_I2C_FIFO_IS_EMPTY ();//等待直到Tx FIFO为空
WAIT_UNTIL_NO_MASTER_ACTIVITY ();//等待直到没有主活动
}
空白i2c_wait_until_eeprom_ready(空白)
{
uint16_t abort_SR_Status;// TX终止源寄存器
//轮询直到EEPROM ACK检测忙周期
{做
SEND_I2C_COMMAND (();//创建一个虚拟访问
WAIT_UNTIL_I2C_FIFO_IS_EMPTY ();//等待直到Tx FIFO为空
WAIT_UNTIL_NO_MASTER_ACTIVITY ();//等待直到没有主活动
abort_SR_Status = GetWord16 (I2C_TX_ABRT_SOURCE_REG);//读取Tx终止源寄存器
GetWord16 (I2C_CLR_TX_ABRT_REG);//清除Tx终止标志
} while((abort_SR_Status & abt_7b_addr_noack) != 0);//如果没有ACK则重复
}
你好,
SEND_I2C_COMMAND()简单地写入DA14580寄存器,因此它不应该无缘无故地在该行停止。也许你想再检查一下硬件连接?
也在SEND_I2C_COMMAND()上。如果执行正确,它将发送从地址和数据(0x08)。代码是正确的,所以我的建议与之前一样。检查DA14580芯片的硬件连接和EEPROM的连接。如果可能,在示波器上观察I2C总线。
祝你好运。