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:I2C 传输被挂起 TXIFG

Guru**** 2589245 points
Other Parts Discussed in Thread: MSP430F5438A

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/758490/msp430f5438a-i2c-transmission-get-hang-txifg

器件型号:MSP430F5438A

尊敬的 TI 团队:

我正在尝试通过 MSP430F5438A 中的 I2C 发送数据。 我使用的是 TI 给出的示例代码。

一旦第一个字节被放置在 TX 缓冲区中、它就会被挂起。

通过使用断点、在 这个代码被挂起后、它进入 ISR -> UCB0TXBUF = TXData;//加载 TX 缓冲区。   

请帮助我解决该问题。  

使用的代码:

#include

unsigned char TXData;
unsigned char TXByteCtr;

int main (空)

WDTCTL = WDTPW + WDTHOLD;//停止 WDT
P3SEL |= 0x06;//将 I2C 引脚分配给 USCI_B0
UCB0CTL1 |= UCSWRST;//启用 SW 复位
UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC;// I2C 主器件、同步模式
UCB0CTL1 = UCSSEL_2 + UCSWRST;//使用 SMCLK、保持软件复位
UCB0BR0 = 12;// fSCL = SMCLK/12 =~100kHz
UCB0BR1 = 0;
UCB0I2CSA = 0xAA;//从器件地址为048h
UCB0CTL1 &=~UCSWRST;//清除 SW 复位,恢复运行
UCB0IE |= UCTXIE;//启用 TX 中断

TXData = 0x01;//保留 TX 数据

while (1)

TXByteCtr = 1;//加载 TX 字节计数器

while (UCB0CTL1 & UCTXSTP);//确保发送了 STOP 条件
UCB0CTL1 |= UCTR + UCTXSTT;// I2C TX、启动条件

_bis_SR_register (LPM0_bits + GIE);//输入 LPM0、带中断
_NO_OPERATION ();//保持在 LPM0中直到所有数据
//是 TX

TXData++;//递增数据字节

///----------------------------------
// USCIAB0_ISR 的结构使其可用于传输任何数据
//预加载带有字节计数的 TXByteCtr 的字节数。
///----------------------------------
#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector = USCI_B0_vector
_interrupt void USCI_B0_ISR (void)
#Elif defined (_GNU_)
void __attribute__((中断(USCI_B0_vector)) USCI_B0_ISR (void)
其他
错误编译器不受支持!
#endif

switch (__evo_in_range (UCB0IV、12))

情况0:中断;//向量0:无中断
情况2:中断;//向量2:ALIFG
情况4:中断;//向量4:NACKIFG
情况6:中断;//向量6:STTIFG
情况8:中断;//向量8:STPIFG
情况10:中断;//向量10:RXIFG
情况12://向量12:TXIFG
if (TXByteCtr)//检查 TX 字节计数器

UCB0TXBUF = TXData;//加载 TX 缓冲区
TXByteCtr -;//减量 TX 字节计数器

其他

UCB0CTL1 |= UCTXSTP;// I2C 停止条件
UCB0IFG &=~UCTXIFG;//清除 USCI_B0 TX 内部标志
_BIC_SR_REGISTER_ON_EXIT (LPM0_BITS);//退出 LPM0

中断;
默认值:break;

谢谢

Siva B

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

    您描述的症状与从从设备获取 NACK 是一致的。

    >UCB0I2CSA = 0xAA;//从地址为048h
    从机地址仅为7位(R/W 位不是地址的一部分)、因此0xAA 不能是从机地址。 错误的地址将导致 NACK。

    我的第一个猜测是您需要的地址是0x55 (0xAA >> 1)。