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.

[参考译文] TMS320F28379D:I2C 问题

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/696088/tms320f28379d-i2c-problem

器件型号:TMS320F28379D

我希望执行以下步骤来读取数据:

但我发送地址两次、我不想这样做:

以下是我的示波器图像:

代码片段如下所示:

I2caRegs.I2CMDR.bit.IRS = 1; //复位 I2C

//确保 I2C 不忙且已停止
while (I2cRegs.I2CSTR.bit.BB = 1); //忙循环
I2caRegs.I2CSTR.bit.SCD = 1; //清除 SCD 位(停止条件位)
while (I2caRegs.I2CMDR.bit.STP==1); //停止位循环

I2caRegs.I2CSAR.ALL = 0x00; // I2C 从地址
I2caRegs.I2CCNT = 1; //假设寄存器地址为一个字节
while (I2cRegs.I2CSTR.bit.BB = 1); //仍然忙?

//I2caRegs.I2CMDR.ALL = 0x2620; //开始、无停止位、主器件、TX、复位 I2C 00100110
I2caRegs.I2CMDR.bit.NACKMOD = 0; // NACK 模式位
I2caRegs.I2CMDR.bit.FREE = 0; //挂起时停止 I2C
I2caRegs.I2CMDR.bit.STT = 1; //起始条件位
I2caRegs.I2CMDR.bit.STP= 0; //停止条件位
I2caRegs.I2CMDR.bit.MST = 1; //主模式
I2caRegs.I2CMDR.bit.TRX = 1; //发送器模式
I2caRegs.I2CMDR.bit.XA = 0; // 7位寻址模式
I2caRegs.I2CMDR.bit.RM = 0; //非重复模式
I2caRegs.I2CMDR.bit.DLB = 0; //数字回送模式被禁用
I2caRegs.I2CMDR.bit.IRS = 1; //启用 I2C 模块
I2caRegs.I2CMDR.bit.STB = 0; // I2C 模块不处于起始字节模式
I2caRegs.I2CMDR.bit.FDF = 0; //禁用自由数据格式模式
I2caRegs.I2CMDR.bit.BC = 0; //每个数据字节8位



while (I2cRegs.I2CSTR.bit.XRDY = 0); //在巴士免费前什么也不做
I2caRegs.I2CDXR.ALL = 0x01; //传感器的寄存器地址(1个字节)

while (!I2cRegs.I2CSTR.bit.ARDY); //准备好了吗?
//I2caRegs.I2CMDR.ALL = 0x2C20; //开始、CNT = 0时的停止位、主器件、Rx、复位 I2C 00101100
I2caRegs.I2CMDR.bit.NACKMOD = 0; // NACK 模式位
I2caRegs.I2CMDR.bit.FREE = 0; //挂起时停止 I2C
I2caRegs.I2CMDR.bit.STT = 1; //起始条件位
I2caRegs.I2CMDR.bit.STP= 1; //停止条件位
I2caRegs.I2CMDR.bit.MST = 1; //主模式
I2caRegs.I2CMDR.bit.TRX = 0; //接收器模式
I2caRegs.I2CMDR.bit.XA = 0; // 7位寻址模式
I2caRegs.I2CMDR.bit.RM = 0; //非重复模式
I2caRegs.I2CMDR.bit.DLB = 0; //数字回送模式被禁用
I2caRegs.I2CMDR.bit.IRS = 1; //启用 I2C 模块
I2caRegs.I2CMDR.bit.STB = 0; // I2C 模块不处于起始字节模式
I2caRegs.I2CMDR.bit.FDF = 0; //禁用自由数据格式模式
I2caRegs.I2CMDR.bit.BC = 0; //每个数据字节8位
I2caRegs.I2CCNT = 1; //只读取一个字节数据

if (I2caRegs.I2CSTR.bit.nack = 1)
{
I2caRegs.I2CSTR.All = I2C_CLR_Nack_bit;// 0x0002
}
I2caRegs.I2CMDR.bit.STP= 1; // CNT=0时停止位

while (!I2cRegs.I2CSTR.bit.SCD); //是否检测到停止位?

DATA[0]= I2caRegs.I2CDRR.ALL; //读取一个字节数据 

那么、如果可能的话、是否有办法可以只写入8位、然后成为不发送地址的主接收器?

谢谢

Sagar

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

    您不需要从主发送器开始、然后转到主接收器。 您可以直接作为主接收器启动。

    此致、
    曼诺伊
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在这里、从器件地址为0x00、控制寄存器为0x3D。 因此、我必须首先是主发送器、然后是主接收器。 但是、当成为主接收器时、我不想发送消息。 我只是想读!

    那么、是否有办法做到这一点?

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

    从机地址0x00保留用于"常规调用"。 因此、请考虑使用非零从器件地址。

    如果必须发送命令、则必须同时使用主发送器、然后将其配置为主接收器。 当您重新配置为主接收器时、它将重新发送总线上的地址+读取位。 没有办法解决这个问题。

    此致、
    曼诺伊