您好!
我尝试将 BM180模块与在 MSP430G2553芯片上运行的 MSP430超值系列 Launchpad 相连。 BM180模块安装了上拉电阻、因此我不使用其他上拉电阻。 由于 BM180在1.8V 至3.6V 之间上电、我将 launchpad 的 Vcc 连接到 BM180的 Vcc。 将 Launchpad 的 P1.6连接到 BM180的 SCL、将 P1.7连接到 BM180的 SDA。 我使用 了 msp430g2xx3_uscib0_i2c_8.c 和 msp430g2xx3_uscib0_i2c_10.c 中的代码示例、并将它们组合在一起以编写以下代码。 我的第一步是在 Rx 处获取中断并检查调试器中的缓冲区(如果发生这种情况、其余步骤更容易实现)。 下面的代码不起作用,当我调试时,我看到我只获得一个 Tx 中断一次,然后它一直保持在 TransmitI2C()中。 这意味着未发送停止位、然后我没有获得 Rx 中断。 我在这里停留了两天。 请帮我继续吗? 请指出可能出现的任何明显错误。
#include INT RXByteCtr、RPT_Flag = 0; //在1 个 volatile unsigned char RxBuffer[64]时启用重复启动; //分配128字节的 RAM unsigned char TxBuffer[64]; unsigned char * PRxData; //指向 RX 数据的指针 unsigned char TXByteCtr、RX = 0; unsigned char * PTxData; //指向 TX 数据 的指针 unsigned char TXByteCtr; int I2C_Init (int slaveaddr) { WDTCTL = WDTPW + WDTHOLD; //停止 WDT P1SEL |= BIT6 + BIT7; //将 I2C 引脚分配给 USCI_B0 P1SEL2|= BIT6 + BIT7; //将 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 = slaveaddr; //从器件地址为048h UCB0CTL1 &=~UCSWRST; //清除 SW 复位,恢复操作 IE2 |= UCB0TXIE; //启用 TX 中断 IE2 |= UCB0RXIE; //启用 RX 中断 返回0; } int TransmitI2C (unsigned char * TxData、int TxData_size) { PTxData =(unsigned char *) TxData; // TX 数组起始地址 TXByteCtr = TxData_size; //加载 TX 字节计数 器 while (UCB0CTL1 & UCTXSTP); //确保停止条件已发送 UCB0CTL1 |= UCTR + UCTXSTT; // I2C TX、起始条件 _ bis_SR_register (CPUOFF + GIE); //输入带中断的 LPM0 //保持在 LPM0中直到所有数据 //是 TX 返回0; } int ReceiveI2C (int RxData_size) { PRxData =(unsigned char *) RxBuffer;// RX 缓冲区的开始 RXByteCtr = RxData_size; //加载 RX 字节计数 器 while (UCB0CTL1 & UCTXSTP); //确保发送了停止条件
UCB0CTL1 &=~UCTR; //设置为从模式 UCB0CTL1 |= UCTXSTT; // I2C 启动条件 __bis_SR_register (CPUOFF + GIE); //输入带中断的 LPM0 //保持在 LPM0中直到所有数据 //是 RX'd __no_operation(); //设置断点>>此处<<并 返回0; } int main() { I2C_Init (0x77); TxBuffer[0]= 0xAA; TransmitI2C ((unsigned char *) TxBuffer、1); ReceiveI2C (2); TxBuffer[0]= 0xAC; TransmitI2C ((unsigned char *) TxBuffer、1); ReceiveI2C (2); TxBuffer[0]= 0xAE; TransmitI2C ((unsigned char *) TxBuffer、1); ReceiveI2C (2); TxBuffer[0]= 0xB0; TransmitI2C ((unsigned char *) TxBuffer、1); ReceiveI2C (2); TxBuffer[0]= 0xB2; TransmitI2C ((unsigned char *) TxBuffer、1); ReceiveI2C (2); TxBuffer[0]= 0xB4; TransmitI2C ((unsigned char *) TxBuffer、1); ReceiveI2C (2); TxBuffer[0]= 0xB6; TransmitI2C ((unsigned char *) TxBuffer、1); ReceiveI2C (2); TxBuffer[0]= 0xB8; TransmitI2C ((unsigned char *) TxBuffer、1); ReceiveI2C (2); TxBuffer[0]= 0xBA; TransmitI2C ((unsigned char *) TxBuffer、1); ReceiveI2C (2); TxBuffer[0]= 0xBC; TransmitI2C ((unsigned char *) TxBuffer、1); ReceiveI2C (2); TxBuffer[0]= 0xBE; TransmitI2C ((unsigned char *) TxBuffer、1); ReceiveI2C (2); 返回0; }//------------------ // USCIAB0TX_ISR 的结构使其可用于通过 预加载带有字节计数的 TXByteCtr 来发送任何//字节数。 此外、TXData //指向要发送的下一个字节。 ///---------------------------------- #pragma vector = USCIAB0TX_VECTOR _INTERRUPT void USCIAB0TX_ISR (void) { IF (TXByteCtr) //检查 TX 字节计数 器{ UCB0TXBUF =* PTxData++; //加载 TX 缓冲区 TXByteCtr --; //减量 TX 字节计数 器} 否则 { UCB0CTL1 |= UCTXSTP; // I2C 停止条件 IFG2 &=~UCB0TXIFG; //清除 USCI_B0 TX int 标志 _BIC_SR_REGISTER_ON_EXIT (CPUOFF); //退出 LPM0 } }-->----------------- // USCI_B0数据 ISR 用于将接收到的数据从 I2C 从器件//移动 到 MSP430存储器。 它的结构使得它能够通过 预先载入带有字节计数的 RXByteCtr 来被用来接收//任一2+数量的字节。 ///---------------------------------- #pragma vector = USCIAB0RX_Vector __interrupt void USCIAB0RX_ISR (void) { RXByteCtr --; //减量 RX 字节计数 器 if (RXByteCtr) { * PRxData++= UCB0RXBUF; //将 RX 数据移动到地址 PRxData IF (RXByteCtr = 1) //只剩下一个字节? UCB0CTL1 |= UCTXSTP; //生成 I2C 停止条件 } 否则 { * PRxData = UCB0RXBUF; //将最终 RX 数据移动到 PRxData _BIC_SR_REGISTER_ON_EXIT (CPUOFF); //退出 LPM0 }