我正在尝试使用PIC16LF1554通过I2C与BQ24259进行通信。该设备的第7个寄存器有一个可用于关闭电池的位。我使用Mplab的MCC配置I2C设置。使用头文件中的示例代码我写了一个类似的功能。
这是代码的相关片段
#define RETRY_MAX 100
#define ON 0x4B //register 7 toggle 5th bit to turn ON/OFF
#define OFF 0x6B
I2C_MESSAGE_STATUS status;
uint16_t timeOut;
uint8_t writeBuffer[1]; // writeBuffer[0] = 07, writeBuffer[1] = data 01001011b(on) 01101011b(off)
uint8_t stat;
uint16_t address = (0x6B/2) ; //Bit shifting to the write, and having '0' for write opertaoin, at MSB
uint8_t bat_fet(uint8_t val){
writeBuffer[0] = 7; //slave's seventh register
writeBuffer[1] = val;
timeOut=0;
while(status != I2C_MESSAGE_FAIL){
I2C_MasterWrite( writeBuffer, // address of data to be sent
2, // number of data bytes
address, // address of the peripheral
&status); // address of status register
while(status == I2C_MESSAGE_PENDING);
if(status == I2C_MESSAGE_COMPLETE){
return 1;
break;
}
if(timeOut == RETRY_MAX){
return 0;
break;
}
else
timeOut++;
}
if(status == I2C_MESSAGE_FAIL)
return 0;
}
但它不起作用,没有任何反应,有时控制器只是冻结,大多数它继续工作。我已将LED连接到未使用的IO引脚,并在程序返回1时对其进行编程以打开,然后将其打开。但电池仍然存在。
同样,我正在尝试使用pic的ADC 1来检查电池电压,
这是代码,
uint16_t check_bat_voltage(){
uint16_t bat_v;
ADC1_StartConversion(01011); //i am using Channel AN11, but no matter what variation of channel and AN11 i passed, it just wouldn't recognize. so i just pass the 5 bit values of the ADCON1 register.
while(ADC1_IsConversionDone());
bat_v = ADC1_GetConversionResult();
//digital value = [analog voltage / (vref+ - vref-)] * 1024
//analog value minimum = 2.5/2, voltage divider network
//vref+ 5
//vref- 0
// 1.25/5 * 1024 = 256
return bat_v;
}
但是没有任何反应。 有人可以评论一下吗?我只是卡住了。感谢。
我也可以附上MCC的屏幕截图,也许我没有正确配置外围设备。
P.S。我在main()中初始化两个模块。
答案 0 :(得分:0)
我相信您的问题是您在循环之前忘记将status
初始化为I2C_MESSAGE_FAIL
以外的其他内容(我假设您的全局stat
是拼写错误 - 它应该是status
)。
除非使用__attribute__((persistent))
(XC16编译器 - 不确定XC8)将变量声明为持久变量,否则启动代码会将所有全局变量初始化为零。因为我猜测常量I2C_MESSAGE_FAIL
不为零,这意味着你的循环永远不会执行。
编译器可能会在初始化之前向您发出有关使用变量的警告。
请尝试使用do {} while
循环。
答案 1 :(得分:0)
也许是你声明中的拼写错误?尝试改变:
uint8_t writeBuffer[1];
到
uint8_t writeBuffer[2];
建议确定scl和sda行的范围,并检查当led开启时实际发送的内容。