主题中讨论的其他器件: MSP430F5529、 MSP-EXP430G2、 MSP-EXP430F5529LP
我正在尝试使用 I2C 通信为 MSP430G2553编写代码。 器件是从器件。 代码不起作用。
我使用 MSP430F5529作为主器件、它工作正常。 (我之前开发了从器件和主器件代码)
MSP430G2553有两个中断向量。
状态机中断
2. Rx/TX 缓冲器中断
当我运行代码时、它在第68行停止。 它所做的第一件事是接收由主器件发送的地址。 我检查了这个、它工作正常。 我使用的是海盗总线、我看到一个0x91 、它是主器件、告诉从器件将数据传输到主器件。
我可以看到以下问题:
1. 代码不能识别从机地址。 我不知道代码是否正在检查接收到的地址。 它就停在第68行
2.我不认为它进入了中断。 第68行位于中断之后。 它就像跳过中断一样。 它确实需要检查地址、但我认为它没有正确进入状态机。 我尝试编写一些代码来执行此操作、但它实际上没有任何内容。
许多示例甚至没有概述状态机、因此我不确定在这里要做什么。
任何帮助都很好。
/* i2c.c * ** 作者:Chris * //********* // MSP430G2553 I2C 从设备代码 // //此代码将接收来自单个 I2C 主设备的请求,并将接收 来自该主设备的//数据或将数据发送到主设备。 //这是 MSP430G2553的从器件代码。 //// ********* #include #include #include "i2c_slave.h" unsigned char RXByteCtr; unsigned char * PTxData; volatile unsigned char RxBuffer[32]; //分配128字节的 RAM char i2cdata; unsigned char TXByteCtr、TXSize; const unsigned char TxData[]= //要发送 的数据表{ "R"、 // 0x11、 "X"、 //0x22、 "D"、 //0x33、 'A'、 ///0x44、 "T"、 //0x55"A" 、 //'S' 、 // 'A' // };
void main (void)
{
WDTCTL = WDTPW + WDTHOLD; //停止 WDT
I2C_SLAVE_setup(); //设置 i2c
I2C_Transmit (); //发送数据
}
void i2c_slave_setup (void) { P1SEL |= BIT6 + BIT7; //将 I2C 引脚分配给 USCI_B0 // P1.7 = SDA P1.6 = SCLK 绿色 P1SEL2 |= BIT6 + BIT7; UCB0CTL1 |= UCSWRST; //启用 SW 复位 UCB0CTL0 = UCMODE_3 + UCSYNC; // I2C 从设备,同步模式 UCB0CTL0 &=~UCMST; //从模式 UCB0I2COA = 0x48; //自有地址为048h -> ASCII "H" UCB0CTL1 &=~UCSWRST; //清除 SW 复位,恢复操作 UCB0I2CIE |= UCSTPIE + UCSTTIE; //启用 STT、STP 中断 return; } char i2c_receive (void) { RXByteCtr = 0; //清除 RX 字节计数 _bis_SR_register (CPUOFF + GIE); //输入 LPM0,启用中断 //保持在 LPM0中直到主器件完成 TX 返回"x"; } void i2c_transmit (void) { TXByteCtr = 0; //将 txbuffer 指针设置为第一个字节 UCB0STAT &=~UCSTTIFG; //清除启动条件 UCB0CTL1 &=~UCTR; //清除 UCTR 以接收地址 IE2 |= UCB0TXIE + UCB0RXIE; //启用 TX 和 RX 中断 UCB0TXBUF = TxData[TXByteCTR]; //将数据加载到 TX 缓冲区中,以便它可以发送一个字节 _bis_SR_register (CPUOFF + GIE); //输入 LPM0,启用中断 } // // ////../../--------------- // // 中断 ///////////--------------- #if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector = USCIAB0_I2C_State_ISR
_interrupt void USCIAB0_I2C_State_ISR (void)
#Elif defined (_GNU_)
void __attribute__((interrupt (USCIAB0TX_vector)) USCIAB0TX_ISR (void)
其他
错误编译器不受支持!
#endif
{
//我需要这里的代码吗? 是否清除 UCSSTPIFG? 我不知道是什么。
}
//
//
#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector = USCIAB0TX_vector
_interrupt void USCIAB0TX_ISR (void)
#Elif defined (_GNU_)
void __attribute__((interrupt (USCIAB0TX_vector)) USCIAB0TX_ISR (void)
其他
错误编译器不受支持!
#endif
{ //向量12:TXIFG
UCB0TXBUF = TxData[TXByteCTR]; //发送一个字节
TXByteCtr ++; //将数组指针递增到下一个字节
}
///---------------------------------- // USCI_B0状态 ISR 用于将 CPU 从 LPM0唤醒、以便在 数据传输后在主程序中进行//处理。 当 实际数据被发送时、LPM0只在(重新) START 或 STOP 条件下//退出。 ///----------------------------------
#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector = USCIAB0RX_vector
_interrupt void USCIAB0RX_ISR (void)
#Elif defined (_GNU_)
void __attribute__((interrupt (USCIAB0RX_vector)) USCIAB0RX_ISR (void)
其他
错误编译器不受支持!
#endif
{
RXByteCtr +;
RxBuffer[RXByteCTR]= UCB0RXBUF;
// UCB0STAT &=~(UCSTPIFG + UCSTTIFG); //清除中断标志
_BIC_SR_REGISTER_ON_EXIT (CPUOFF); //如果数据是,则退出 LPM0
//已发送
}






