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.

[参考译文] F28M36P63C2:C28中的 I2C 仅发送地址字节

Guru**** 2933120 points

Other Parts Discussed in Thread: F28M36P63C2

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/819246/f28m36p63c2-i2c-in-c28-sending-only-address-byte

器件型号:F28M36P63C2

您好!

我正在尝试将 F28M36P63C2中的 C28配置为 I2C 主发送器、以向 DAC 发送地址和两个字节。 我可以看到随示波器发送的地址、但不能看到其余字节、有什么原因?

我正在执行以下操作:

1.使用以下命令初始化 I2C 模块:

I2CA_Init ()

   I2caRegs.I2CPSC.all = 14;//对于 CPU_FRQ_150MHz、SYSCLK/(I2CPSC+1)

    I2caRegs.I2CCLKL = 45;          //SCL 100kHz 50%占空比

   I2caRegs.I2CCLKH = 45;           //SCL 100kHz 50%占空比

   I2caRegs.I2CMDR.ALL = 0x0020;   //使 I2C 退出复位

   DELAY_c28 (); //在使模块退出复位后延迟大约为10ms

   返回;

 

2.在上面的初始化之后,我按如下方式执行单次传输:

void I2C_write_new_nofifo()

   uint16 i = 0;

 while (I2cRegs.I2CSTR.bit.BB = 1){}

//设置从地址

I2caRegs.I2CSAR = 0x60;  //由我的 DAC 指定的地址

    I2caRegs.I2CCNT = 2;             //在地址字节后发送两个字节、地址为7位

   I2caRegs.I2CMDR.bit.TRX = 1;                //设置为发送模式

   I2caRegs.I2CMDR.bit.STP= 1;               //一旦 Tx 完成,即 I2CCNT =0,主器件必须释放总线

   I2caRegs.I2CMDR.bit.MST = 1;               //设置为主模式

   I2caRegs.I2CMDR.bit.FREE = 1;             //调试器不会在断点上停止总线

   I2caRegs.I2CMDR.bit.STT = 1;                //发送起始位、传输将跟随

   

    

    for (i=0;i<2;i++)//发送两个字节

   {

       while (I2cRegs.I2CSTR.bit.XRDY = 0){};//在 XSR 寄存器准备就绪前不执行任何操作

       I2caRegs.I2CDXR = 0x05;///Next 数据字节、只是一个虚拟0x05

   }

   delay_c28();

之后、CPU 保持在一个永久循环中。 因此、在运行该代码并暂停 CPU 之后、光标将保持在此行中:

   while (I2cRegs.I2CSTR.bit.XRDY = 0){};//在 XSR 寄存器准备就绪前不执行任何操作:

    我=1、这意味着它显然会发送第一个字节、但我在使用示波器时只会看到地址字节以及首次传输的 R/W 和 ACK、但之后不会发送0x05字节、这似乎是模块卡住了、无法传输更多数据。 为什么会这样?、任何帮助都非常感谢。

谢谢你

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

    我知道您说过您可以在线路上看到 ACK、但您能否检查以确保 I2CSTR 中的 NACK 位未设置?

    惠特尼

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

    感谢 Whitney、

    在进一步调试并通过查看示波器观察到从器件响应中的一个奇怪 ACK、其中信号不会一直下降、然后我们确定问题是硬件问题。 我们在从器件和主器件之间使用了一个单向隔离器(出于此处超出范围的原因需要进行隔离)、因此主器件(C28)在另一侧看不到被从器件下拉的 SDA 线 (同样、因为该线路是单向的、会进入从器件侧)。 我们直接连接主设备和从设备(当然有适当的上拉电阻)进行故障诊断、问题消失了、C28现在在看到 ACK 后发送其余数据。 因此、我们计划改用 I2C 隔离器、专门为此目的而设计的 IS01541。

    我们感到困惑、因为同一芯片中的 M3与同一单向隔离器分开、并不关心 ACK (或 NACK)的缺失、也不关心是否存在应答、而是继续发送其余数据、无论在线路上看到 NACK、 我们当时认为这是 C28问题、但不是硬件问题。 现在、我不确定 C28也可以像这样运行(即忽略 nacks 并继续)、我知道这不是理想情况、但我想知道我们是否可以让 C28仅发送数据并忽略 nacks、 我似乎没有看到该选项、因此我想知道 M3为什么会忽略其余数据、而忽略从站的 Nacks、C28的行为方式也不同; M3是否可配置为忽略 nacks?或者两者都可以配置为忽略 nacks?

    此问题无论如何都已解决

    再次感谢您、

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

    很高兴您能找到问题。

    M3忽略 NACK (或将其解释为 ACK?)、这是奇怪的。 我对 C28 I2C 的行为更熟悉、但我希望 M3 I2C 也能以类似的方式处理它。 两个 I2C 都不可配置为忽略 NACK。

    惠特尼