尊敬的 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