大家好,
我设置它的方式是MSP430将与 辅助电池增压器组进行主通信。 我已经开发了源代码,它有两个函数用于初始化I2C通信,另一个函数用于获取电池容量。 代码运行,我可以在逻辑上看到它也获得了正确的读取和写入地址。 这是我第一个使用I2C的项目,所以我 对它不是很了解。 在命令代码的第二个字节上,我收到NAK。 我 也没有收到任何返回的数据。 我们将非常感谢您提供任何帮助,帮助您找出问题所在。 提前感谢!
/*
初始化MSP430F5529 LP和Battery
* Booster pack
*/
static void ioport_i2c_init(void)
{
//分配I2C引脚WFP 4.2 (SCL)和WFP 4.1 (SDA)
P4SEL ||(BIT2 | BIT1);
// P4DIR ||(BIT1);
// SMCLK,软件重置启用
UCB1CTL1 || UCSSEL_2 | UCSSWRST;
//主模式,I2C模式,同步模式,10位地址从属模式
UCB1CTL0 = UCMST | UCMODE_3 | UCSYNC;//| UCSLA10;
//波特率:SMCLK (25MHz)/(400kHz)= 62.5 = 0x3E
UCB1BR0 = 0x3E;
UCB1BR1 = 0x00;
//从属地址
UCB1I2CSA = 0x55;
//清除软件重置,以启用操作
UCB1CTL1 ==~UCSWRST;
}/*
此功能获取剩余电池容量。
*
**@返回
*补偿电池剩余容量。 单位为mAh。
*/
uint8_t ioport_GET_BATTERY_capacity (void)
{
//发送器,发送启动条件
UCB1CTL1 || UCTR | UCTXSTT;
//传送中断标志轮询。
while (!(UCB1IFG和UCTXIFG)) //如果UCTXIFG == 0,则等待
{
; //等待TXBUF为空
}
IF (UCB1IFG和UCTXIFG)
{
//发送数据的第一个字节
UCB1TXBUF = 0x02;
printf("sent 0x0d \n");
}
否则
{
printf("Transmit Interrupt pending \n");}
//传送中断标志轮询。
while (!(UCB1IFG和UCTXIFG)) //如果UCTXIFG == 0,则等待
{
; //等待TXBUF为空
}
IF (UCB1IFG和UCTXIFG)
{
//发送数据的第二个字节
UCB1TXBUF = 0x03;
printf("sent 0x0c \n");
}
否则
{
printf("Transmit Interrupt pending \n");}
/*
//传送中断标志轮询。
while (!(UCB1IFG和UCTXIFG)) //如果UCTXIFG == 0,则等待
{
; //等待TXBUF为空
}
IF (UCB1IFG和UCTXIFG)
{
//发送第三个字节的数据
UCB1TXBUF = 0x01;
printf("sent 0x01 \n");
}
否则
{
printf("Transmit Interrupt pending \n");}
*/
//发送停止条件
UCB1CTL1 || UCTXSTP;
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//接收到响应时的接收部分
//将主机设置为接收模式,发送启动条件
UCB1CTL1 &=~UCTR;
UCB1CTL1 || UCTXSTT;
//轮询开始位以完成
While (UCB1CTL1和UCTXSTT)
{
;}
//如果RXIE未启用,则轮询RXIFG0
While (UCB1IFG和UCRXIFG)
{
//从收到的数据中读取一个字节
unsigned char PRxData = UCB1RXBUF;
printf ("接收的数据:%c \n",PRxData);
}
//发送停止条件。
UCB1CTL1 || UCTXSTP;
//等待停止完成
While (UCB1CTL1和UCTXSTP)
{
;}
返回0;}




