主题中讨论的其他器件: MSP430G2553
大家好、首先、感谢大家对我的问题给予的关注和时间。
因此、我正在开发一个包含 MSP430F5529的系统、该系统通过 I2C 与 AD5933通信。 之前、我对 MSP430G2553执行了同样的操作、一切都进展顺利、我的代码运行完美。 我确实使用示波器进行了检查、并且正在发送每个数据。 我从新系统的代码开始、并在 G2553至 F5529之间进行了所有必要的更改、端口、中断、寄存器。
无论什么、我的代码都会在验证循环中停止。 特别是这个:
while (UCB0STAT 和 UCBBUSY);
当我用示波器检查总线时、SCL 始终为高电平、SDA 始终为低电平。 因此、总线上没有发生任何事情。
我在代码执行期间使 LED 闪烁、这样就可以正常工作了。
我的代码是波纹波纹的、请检查它、如果您发现错误、或者您有一些想法让我尝试一下、请告知我。
#include #define SLAVE_ADDRESS 0x0D /**< AD5933的地址。 // #define BAUD_RATE 0x12 /**<波特率值。 */ #define SDA_PIN BIT0 // msp430F5529 UCB0SDA 引脚 #define SCL_PIN BIT1 // msp430F5529 UCB.S.引脚 有符号 char byteCtr; 无符号 char * TI_transmit 字段; 无符号 char * TI_receive_field; int main (void) { WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器 //LED 配置 P1DIR |= BIT1; P1OUT |= BIT1; P1OUT ^=(BIT1);//打开 LED 要发送的//MSP 配置 P3SEL |= SDA_PIN + SCL_PIN; //将 I2C 引脚分配给 USCI_B0 UCB0CTL1 |= UCSWRST; //启用 SW 复位 UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC; // I2C 主设备,同步模式 UCB0CTL1 = UCSSEL_2 + UCSWRST; //使用 SMCLK、保持软件复位 UCB0BR0 =波特率; //设置预分频器 UCB0BR1 = 0; UCB0I2CSA = SLAVE_ADDRESS; //设置从器件地址 UCB0CTL1 &=~UCSWRST; //清除 SW 复位,恢复操作 UCB0IE = UCNACKIE; UCB0IE |= UCTXIE; //启用中断 P1OUT ^=(BIT1); //关闭 LED while (UCB0STAT 和 UCBBUSY) //等待先前的通信清除 ; //从机寄存器的配置(发送数据) unsigned char field[2]={0x80、0xB1}; TI_Transmit 字段=字段; byteCtr = 2; UCB0CTL1 |= UCTR + UCTXSTT; // I2C TX、启动条件 while (UCB0STAT 和 UCBBUSY) ; while (1) ; }// 中断 #pragma vector = USCI_B0_vector __interrupt void USCI_B0_ISR (void) { 开关(_偶数_在范围内(UCB0IV、12)) { 情况0: 中断; //向量0:无中断 案例2: 中断; //向量2:ALIFG 案例4: UCB0CTL1 |= UCTXSTP; UCB0IFG &=~UCNACKIFG; 中断; //向量4:NACKIFG 案例6: 中断; //向量6:STTIFG 案例8: 中断; //向量8:STPIFG 案例10: //向量10:RXIFG --我还没有使用它(但我会) IF (byteCtr = 0) { UCB0CTL1 |= UCTXSTP; // I2C 停止条件 * TI_Receive_field = UCB0RXBUF; TI_Receive_field++; } 其他 { * TI_Receive_field = UCB0RXBUF; TI_Receive_field++; 字节 Ctr --; } 中断; 情况12: //向量12:TXIFG IF (byteCtr = 0) { UCB0CTL1 |= UCTXSTP; // I2C 停止条件 UCB0IFG &=~UCTXIFG; //清除 USCI TX int 标志 } 其他 { UCB0TXBUF =* TI_transmit 字段; TI_Transmit 字段++; 字节 Ctr --; } 中断; 默认值: 中断; } }