TI中文支持网
TI专业的中文技术问题搜集分享网站

MSP430FR2433: msp430fr2433在读取bq34z100的数据是一直卡在中断无法跳出怎么解决

Part Number:MSP430FR2433Other Parts Discussed in Thread:BQ34Z100,

msp430fr2433在读取bq34z100的数据是一直卡在中断无法跳出怎么解决

代码

#include <msp430fr2433.h>
#include <stdint.h>

#define DEVICE_ADDR 0x55 //BQ34Z100芯片的地址
#define SDA_PIN BIT7 // 设定SDA数据线使用P1.7引脚
#define SCL_PIN BIT6 // 设定SCL时钟线使用P1.6引脚

//函数声明
void i2c_write(uint8_t reg_addr, uint8_t data);
void i2c_read(uint8_t reg_addr, uint8_t *rx, uint8_t bytes);

uint16_t soc, soh, cc, rm;

int main(void)
{
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗,否则会重置CPU
// 配置 P1.6 和 P1.7 引脚为 I2C 功能模式
P1SEL0 |= SCL_PIN | SDA_PIN;
P1SEL1 &= ~(SDA_PIN | SCL_PIN);

UCB0CTL1 |= UCSWRST; //使能软件复位
UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC; //I2C主机模式,同步通讯模式
UCB0CTL1 = UCSSEL_2 + UCSWRST; //选择SMCLK,保持软件复位
UCB0BR0 = 12; //fSCL = SMCLK/12 = ~100kHz UCB0BR1 = 0;
UCB0I2CSA = DEVICE_ADDR; //BQ34Z100芯片的地址
UCB0CTL1 &= ~UCSWRST; //清除软件复位,恢复操作

//读取SOC
i2c_read(0x02, (uint8_t *)&soc, 2);
//读取SOH
i2c_read(0x2e, (uint8_t *)&soh, 2);
//读取CC
i2c_read(0x2c, (uint8_t *)&cc, 2);
//读取RM
i2c_read(0x04, (uint8_t *)&rm, 2);

return 0;
}

//写寄存器函数
void i2c_write(uint8_t reg_addr, uint8_t data)
{
uint8_t tx_data[2];
tx_data[0] = reg_addr;
tx_data[1] = data;

UCB0CTL1 |= UCTR + UCTXSTT; //发送起始字节并设置为写模式
while(!(UCB0IFG & UCTXIFG));
UCB0TXBUF = tx_data[0]; //设置寄存器地址
while(!(UCB0IFG & UCTXIFG));
UCB0TXBUF = tx_data[1]; //发送数据
while(UCB0STAT & UCBBUSY); //等待传输完成
}

//读寄存器函数
void i2c_read(uint8_t reg_addr, uint8_t *rx, uint8_t bytes)
{
UCB0CTL1 |= UCTR + UCTXSTT; while(!(UCB0IFG & UCTXIFG)); UCB0TXBUF = reg_addr; //设置要读取的寄存器地址

//重新发起START信号并准备接收数据
UCB0CTL1 &= ~UCTR; UCB0CTL1 |= UCTXSTT; while(!(UCB0IFG &=~ UCRXIFG));
uint8_t *data = rx;
int i;
for (i = 0; i < bytes-1; i++)
{
data[i] = UCB0RXBUF;

UCB0CTL1 |= UCTXACK;
while(!(UCB0IFG &=~UCRXIFG)); //等待接收到一个字节
}

//判断是否还需要发送ACK进行读取(根据从设备返回的ACK)
if (bytes > 1) { data[i] = UCB0RXBUF;
UCB0CTL1 |= UCTXSTP; //发送停止位标志
} else {
UCB0CTL1 |= UCTXSTP + UCTXNACK; //只有一个字节则无需再次发送 ACK
}
}

Cherry Zhou:

您好,我们把您的问题升级到英文论坛看下,有答复尽快给您。

,

Cherry Zhou:

> #define SDA_PIN BIT7 // Program the SDA data line to use pin P1.7> #define SCL_PIN BIT6 // Program the SCL clock line to use the P1.6 pin

如datasheet(SLASE59D)表6-17中所说,UCB0SDA/SCL 位于 P1.2/P1.3上。 请尝试改用此方法。 (您可能还必须修复您的接线。) 

> #define SDA_PIN BIT2 // Program the SDA data line to use pin P1.2> #define SCL_PIN BIT3 // Program the SCL clock line to use the P1.3 pin

—————

> while(!(UCB0IFG &=~ UCRXIFG));

这不能满足您的需要–它清除了 RXIFG,然后测试是否设置了任何其他(不相关) IFG。 请尝试以下: 

> while(!(UCB0IFG & UCRXIFG));

读取RXBUF将会为您清除UCRXIFG

—————-

> UCB0CTL1 |= UCTXACK;

I2C 单元为您执行 ACK。 我们不能确定 UCTXACK 在主控模式下会做什么(如果会的话),但建议您删除此行。 

赞(0)
未经允许不得转载:TI中文支持网 » MSP430FR2433: msp430fr2433在读取bq34z100的数据是一直卡在中断无法跳出怎么解决
分享到: 更多 (0)

© 2024 TI中文支持网   网站地图 鲁ICP备2022002796号-1