主题中讨论的其他器件: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