您好!
我尝试与特定的基于 I2C 的 IC 通信、并希望从寄存器中读取一些值。 通过 I2C 读取 PAGE 的过程是首先向 Salve 地址发送写入命令、然后发送寄存器编号 这将由从器件确认,然后在不发送停止条件的情况下,发送带有从器件地址的读取命令,该地址将再次被从器件确认。 之后、我们需要发送突发读取命令来持续读取从器件数据、并且在末尾主器件将确认并发送停止位。
我尝试使用以下代码执行此操作。 但是、我没有得到正确的确认、有时我尝试写入寄存器的数据会损坏。 我出了什么问题?
//
//读取消耗的功率
//
void I2C8ReadPower (uint8_t ui8SlaveAddr )
{
uint32_t ERROR = 0;
//
//设置 I2C 基地址的从器件地址
//
I2CMasterSlaveAddrSet (I2C8_BASE、ui8SlaveAddr、false);
//
//发送 I2C 地址总线(power)和要读取的寄存器值
//
//
I2CMasterDataPut (I2C8_BASE、READ_POWER_ADDRESS);
I2CMasterControl (I2C8_BASE、I2C_MASTER_CMD_BURST_SEND_START);
SysCtlDelay (10000);
while (I2CMasterBusy (I2C8_BASE))
{
}
错误|= I2CMasterErr (I2C8_BASE);
如果(错误= 0x16)
{
//
//仲裁错误
//
while (1)
{}
}
//
//读取功率
//
I2CMasterSlaveAddrSet (I2C8_BASE、ui8SlaveAddr、true);
I2CMasterControl (I2C8_BASE、I2C_MASTER_CMD_BURST_Receive_start);
SysCtlDelay (10000);
while (I2CMasterBusy (I2C8_BASE))
{
}
gui8_power[2]= I2CMasterDataGet (I2C8_BASE);
I2CMasterControl (I2C8_BASE、I2C_MASTER_CMD_BURST_Receive_CONT);
SysCtlDelay (10000);
while (I2CMasterBusy (I2C8_BASE))
{
}
gui8_power[1]= I2CMasterDataGet (I2C8_BASE);
I2CMasterControl (I2C8_BASE、I2C_MASTER_CMD_BURST_Receive_finish);
SysCtlDelay (10000);
while (I2CMasterBusy (I2C8_BASE))
{
}
gui8_power[0]= I2CMasterDataGet (I2C8_BASE);
I2CMasterControl (I2C8_BASE、I2C_MASTER_CMD_BURST_SEND_STOP);
SysCtlDelay (10000);
while (I2CMasterBusy (I2C8_BASE))
{
}
在这里、逻辑分析仪的结果为:
0x23和0x48前面的数据应该是 NACK 的、0xA0应该由主器件应答

