工具/软件:Code Composer Studio
大家好、
我已经在 MSP430FR2633 (MSP-CAPT-FR2633板)上编写了 I2C 函数、以与外设 MAX77818电池充电器电量监测芯片进行通信。
我的读取函数在重复起始条件下挂起。 我的意思是清除 UCTXSTT 的检查。 我复制了下面的 I2C 读取函数代码。 我的写入函数似乎正常工作。 因此、我将消除使用硬件的可能性。 我在 SDA 和 SCL 上具有2.2k 的上拉电阻器。 我还在调试中检查了寄存器、确认 NACKIFG 未被置位。
void read_I2C_Reg (unsigned char Slave_Addr、unsigned char Reg、unsigned char ReadLength) { UCB0IFG = 0x00; PRxDataPtr = 0;//初始化 rxBuffer PRxData 的起始索引=(unsigned char *) RxBuffer[0];//初始化 PRxData 指针到 RX 缓冲区的开始 RXByteCtr = ReadLength; //将 argumement ReadLength 加载到 RXByteCtr 中,该值表示要读取 的字节数(UCB0STAT 和 UCBBUSY); //确保总线不忙 UCB0I2CSA = Slave_Addr >> 1; //从地址是 Slave_Addr 的7个 MSB 写入 UCB012CSA UCB0CTLW0 |= UCTR;// I2C TX 模式 UCB0CTLW0 |= UCTXSTT;//起始条件 UCB0TXBUF =寄存器;//要读取的寄存器地址。 这将是传输的数据的第一个字节。 while (UCB0CTLW0 & UCTXSTT);//等待 I2C STT 发送 、同时(!(UCB0IFG & UCTXIFG); //已发送注册 器 UCB0CTLW0 &=~UCTR;//切换到接收模式 UCB0CTLW0 = UCTXSTT;//发送重复起始条件。 while (UCB0CTLW0和 UCTXSTT);//等待 I2C STT 被发送<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< UCTXSTT 不会被清除。 在这里等候。 while (RXByteCtr > 0)//如果我们已请求读取多个字节,循环 {while (!(UCB0IFG & UCRXIFG));//等待 RX 标志上升。 那么 UCB0RXBUF 有数据 RxBuffer[PRxDataPTR]= UCB0RXBUF; //用接收到的 UCB0RXBUF PRxDataPtr++在索引 PRxDataPtr 处填充 RxBuffer;//递增 PRxDataPtr RXByteCtr --;//递减 RXByteCtr } while (!(UCB0IFG & UCRXIFG); * PRxData = UCB0RXBUF;//将最终 RX 数据移动到 PRxData UCB0CTLW0 |= UCTXNACK;//停止 UCB0CTLW0之前的 NACK |= UCTXSTP;//在 (!(UCB0CTL1 & UCTXSTP)时发出停止条件;//确保已设置停止条件 }
我的 I2C 初始化如下所示。 16MHz DCO 源自 SMCLK:
void Init_MSP430_I2C (void) { P1SEL0 |= BIT2 | BIT3;//将 I2C 引脚分配给 USCI_B0 UCB0CTLW0 |= UCSWRST; //启用 SW 复位 UCB0CTLW0 |= UCMST | UCMODE_3 | UCSYNC;//I2C 主器件、同步模式、默认为7位模式 UCB0CTLW0 &=~UCMM;//多主器件 I2C 的~,不相关,但作为预防措施&“d” UCB0CTLW0 = UCSSEL_3; //使用 SMCLK, UCB0BR0 = 160; // fSCL = SMCLK/160 =~100kHz以上100kHz 至400kHz'快速 I2C UCB0BR1 = 0; UCB0I2CSA = 0x00; //为初始化目的设置为 AA。 读取和写入函数中接受从器件地址作为参数。 UCB0CTLW0 &=~UCSWRST; //清除 SW 复位,恢复操作 UCB0IFG |= 0x00; }
另一个 bizzare 观察结果:直到它到达 UCTXSTT 的永无休止检查时,我的寄存器设置将保持初始化状态。 当它在突出显示的行挂起时、我暂停并通过调试器观察到一些寄存器发生了变化。 在 USCI_B0_I2C 寄存器下、最重要的是 UCB0CTLW0显示0x01D2。 这意味着 UCMODEx 位是00b、不再处于 I2C 模式! UCTR 已重新打开、尽管它之前已关闭。
是否有人能够帮助我修复、并理解为什么代码会在重复启动时停止? 我们非常感谢您提供任何指导。
此致、谢谢!
Guyan