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.

[参考译文] MSP430F5438A:MSP430F5438A 无法与 TI ADC TLA2024建立 I2C 通信

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/720070/msp430f5438a-msp430f5438a-cannot-establish-i2c-communication-with-ti-adc-tla2024

器件型号:MSP430F5438A
主题中讨论的其他器件:TLA2024

您好!

 

我正在调试使用 MSP430F5438A 控制 TI ADC TLA2024对外部输入信号进行采样的电路板、现在基本 I2C 通信无法建立、我在 TLA2024线程上询问了这个问题但没有答案、是否有 MSP430F5438A 专家可以帮助我解决这个问题?

以下是软件代码(因为只有很少的数据需要传输、请勿使用中断)

 /* UCB2启动*/

P9DIR |= 0x06;                 //P9.1 UCB2SDA、P9.2 UCB.S.

P9OUT |=0x06;
for (i=0;i<20;i++){}
P9OUT &=~0x06;
for (i=0;i<20;i++){}

P9SEL |= 0x06;               //将 I2C 引脚分配给 USCI_B2


UCB2CTL1 |= UCSWRST;
UCB2CTL0 = UCMST + UCMODE_3 + UCSYNC;            //I2C 主设备、同步模式
UCB2CTL1 = UCSSEL_2 + UCTR + UCSWRST;             //SMCLK、启用软件复位

UCB2BR0 = 0x32;                    //SMCLK/50 (0x32)=80kHz
UCB2BR1 = 0;  

UCB2I2CSA = 0x48;                  //从 ADC (TLA2024) Addr:100 1000 (ADDR = 0)

UCB2CTL1 &=~UCSWRST;  

for (i=0;i<100;i++){}

 

/*开始传输数据*/

UCB2CTL1 |= UCTR;               // UART 处于 TX 模式

while (IIC2_Start());

(笑声) (笑声) 省略其他传输代码

 

/*子函数*/

UINT8 IIC2_Start (空)

 {

  UCB2CTL1 |= UCTXSTT;          // I2C 启动条件          --注 A

  RETURN (UCB2IFG 和 UCNACKIFG);                            --注 B

 }

 

问题现象描述-

UCB2CTL1始终不能置位 UCTXSTT=1 、这意味着无法正确触发启动条件、然后无法在数据传输之后继续。

 

问题现象详细信息-

在执行注释 A 的触发启动条件之前、UCB2寄存器的值为

UCB2CTL0 = 0x0F;

UCB2CTL1 = 0x90;

UCB2IFG = 0x00;

UCB2STAT = 0x00;

执行 UCB3CTL1 |= UCTXSTT 以触发 注释 A 位置的启动条件后、这些寄存器的值变为  

UCB2CTL0 = 0x0F;

UCB2CTL1 = 0x90;

UCB2IFG = 0x022;

UCB2STAT = 0x50;

此时、如下图所示的 SCL 和 SDA 信号波

由于这是 MSP430F5438A 的标准 I2C 通信序列、并且下降斜率相当急剧、因此只需测量 SCL 和 SDA 信号的上升斜率、

从30%到70%的幅值上升时间都大约为780ns,小于其数据表描述的最大1000ns。

然后执行   注释 B 的下一个命令返回(UCB2IFG 和 UCNACKIFG)、 然后这些寄存器的值变为  

UCB2CTL0 = 0x0F;

UCB2CTL1 = 0x90;

UCB2IFG = 0x22;

UCB2STAT = 0x50;

由于 UCB3IFG 的 UCNACKIFG =1、 while (IIC2_Start())命令成为一个死循环。

 

为了检查是否存在 UCB2配置问题或任何 UCB2硬件问题、我将这个 I2C 连接更改为 UCB3、UCB3也能与另一个 I2C 组件正常工作、代码几乎相同、除了从器件地址、 然后将地址更改为0x48作为 TLA2024硬件、结果为:

在执行注释 A 的触发启动条件之前、UCB2寄存器的值为

UCB3CTL0 = 0x0F;

UCB3CTL1 = 0x90;

UCB3IFG = 0x00;

UCB3STAT = 0x00;

执行 UCB3CTL1 |= UCTXSTT 以触发 注释 A 位置的启动条件后、这些寄存器的值变为  

UCB3CTL0 = 0x0F;

UCB3CTL1 = 0x92;

UCB3IFG = 0x02;

UCB3STAT = 0x50;

下面是该时刻的 SCL 和 SDA 波、

    3.然后执行   注释 B 的下一个命令返回(UCB2IFG & UCNACKIFG)、 然后这些寄存器的值变为  

UCB3CTL0 = 0x0F;

UCB3CTL1 = 0x90;

UCB3IFG = 0x22;

UCB3STAT = 0x50;

 

由于 UCB3IFG 的 UCNACKIFG =1、COMAND while (IIC2_Start ())成为一个死循环。

硬件原理图如下所示、

提前感谢您的支持!

此致!

QM

 

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

    置位 UCTXSTT 后、必须等待 UCTXIFG、然后将第一个字节写入 TXBUF。

    如波形所示、主器件已发送从器件地址和 W 位、但在 ACK 前时钟保持低电平。 当 TXBUF 仍然为空时会发生这种情况。

    请参阅用户指南的图38-12:

    您也可以检查 UCNACKIFG。 但是、您必须确保在开始交易之前将其清除。

    (kΩ I²C Ω 上拉时、10k Ω 相当大;kΩ 值为4.7k Ω 或更小。)

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

    大家好、Clemens、

    非常感谢您的回复。

    置位 UCTXSTT 后、如果使用 UCTXIFG 来确定是否可以向 TXBUF 写入字节、那么我就像下面那样更改了数据传输部分代码、

                  /*开始传输数据*/

                  UCB2CTL1 |= UCTR;              // UART 处于 TX 模式

                  UCB2CTL1 |= UCTXSTT; // I2C 启动条件  

                   对于(i=0;i<4;i++)

                     {

                        UCB2TXBUF = TXBUf[i];

                        while (!(UCB2IFG 和 UCTXIFG))          注 C

                            {

                            }

                     }               

                   (笑声) (笑声) 省略其他传输代码

    与我之前的测试结果一样、在设置 UCTXSTT、UCB2IFG=0x22、这意味着 UCTXIFG=1、然后我可以将第一个字节放置到 TXBUF、然后清除 UCTXIFG、UCB2IFG=0x20;然后代码在注释 C 位置变成死循环、 因为 UCTXIFG 总是=0、这意味着传输失败。

    因此、我认为问题仍然是 MSP430未与 TLA2024建立 I2C 通信、另一个正常工作的 I2C 组件 UCBxCTL1将变为0x92、这意味着 UCTXSTT 位被置位、MSP430和 TLA2024已成功生成一个启动条件、 UCBxIFG 的 UCNACKIFG 也会被清零、因为当接收到一个开始条件时、该位会自动清零。

    我测试其他工作正常 I2C 通信端口信号波、在设置 UCTXSTT 时、波形为

    然后、当将第一个字节放入 TXBUF 时、

    然后停止、

    但 TLA2024并不像这样、无论我将 TLA2024 I2C SCL 和 SDA 线连接到 UCB3或 UCB2、因为我都使用 UCB1和 UCB3成功驱动其他2个 I2C 组件。

    我很难理解 TI 的 I2C 组件(TLA2024)为何无法轻松连接 TI MCU (MSP430)、而无法轻松连接其他公司的 I2C 组件。 我在这方面已经花了大约3周的时间、我们也遇到了很高的项目进度压力、您可以帮我与 TLA2024支持专家核实如何配置相应的 I2C 寄存器和设计软件代码吗? 或者、您能找到一些演示代码供我参考吗?

    我非常感谢您的大力支持!

    BTW、对于上拉电阻器值、由于我们希望硬件尽可能降低功耗、因此选择10k、并测试信号质量是否满足组件技术要求、因为根据您的建议、我将降低其值。

    再次感谢您的支持!

    此致!

    QM

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

    在写入 TXBUF 之前、必须等待 TXIFG。 (请让它不间断运行并显示整个波形。)

    (这与 TLA2024无关;主器件会在从器件有机会进行 ACK 之前停止总线。)

    (如果您希望降低功耗、请考虑使用恒流源替代上拉电阻器、或添加 LTC1694/ISL88694/LTC4311。 但这可能太贵了。)

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

    在 UCB2CTL1设置 UCTXSTT |= UCTR 后、UCB2IFG 立即= 0x22、这意味着 UCTXIFG 和 UCNACKIFG 已设置为1、这意味着 UCTXIFG 已到达吗?

    谢谢!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    "立即"是什么意思? 您是在代码中读取 UCB2IFG 还是使用调试器读取 UCB2IFG?

    为什么要检查 UXNACKIFG? 该位在第一个 ACK 预计完成后才有意义。