This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TM4C1294NCPDT:I2C 通信:如何写入从器件地址并从同一从器件地址读取、而不会在两者之间出现停止条件(TM4c 是主控制器)?

Guru**** 2480665 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/698239/tm4c1294ncpdt-i2c-communication-how-to-do-a-write-to-slave-address-and-read-from-the-same-slave-address-without-a-stop-condition-in-between-tm4c-is-the-master-controller

器件型号:TM4C1294NCPDT

您好!

我尝试与特定的基于 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应该由主器件应答

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Apoorv:

    [引用 USER="APOORV 寄存器"] 0x23和0x48前面的数据应该是 NACK,0xA0应该由主控方应答[/QUERPLET]

    我不确定我是否跟随。 这适用于阅读页面协议、对吧? 如果是这样、我看到的唯一 NACK 位于接收到的最后一个字节上、其他所有内容都是 ACK。 这是您的捕获显示的内容。 因此我不确定问题是什么。

    此外、您似乎有 Saleae 逻辑分析仪、您能否将完整的捕捉数据上传到 E2E 以便我查看它? 这可能会帮助我了解转接不正确的地方。

    最后、您是否曾参考我们有关 TM4C129x 器件的 I2C 应用手册? http://www.ti.com/lit/an/spma073/spma073.pdf -它将对您非常有帮助(即使您超出此特定问题)。