目前我想用avr的单片机和bq34z100来通讯,把电量读取出来,然后在我自己的上位机上显示出来。
目前我在参考官方提供的代码实例,430&gasgauge,我发现有很多问题我不是很清楚,比如说sha-1算法,还有cmd和byte的在bq的电量计里到底指的是什么?
Sheldon Cai:
1.在开发bq34Z100时需要EV2400/EV2300来进行参数配置调试等
2.SHA-1算法主要是用于认证,与计量是独立的,如果只需要读电量信息,IO口模拟I2C的话只需要下列2个文件里的代码:
lib-I2C_GPIO
\MSP430F2xx_bq27541EVM\source
然后对比bq27541和bq34Z100 datasheet 修改bq27541.h文件里面对应的命令
user3608626:
回复 Sheldon Cai:
那写命令和字节具体指的是什么呢。我现在想把电量soc的值读取出来,那我是不是先要写一些命令,然后在读取该地址的命令就行了,望指导!
user3608626:
回复 Sheldon Cai:
// Perform my own SHA1 (Host side) read = (UINT8)TI_getRandomIntegerFromVLO();// Use instability of VLO for rand srand(read); // Plant seed based on random value for (i = 0; i < RANDMESGNUMBYTES; i++) // Initialize random challenge bytes { Message[i] = rand(); // Generate 1 random challenge byte } SHA1_authenticate(); // Execute SHA-1/HMAC algorithm // Authenticate the bq27541 MSP430_bq27541_cmdWrite(bq27541CMD_DFDCNTL, 1); // BlockDataControl() = 0x01 // Write block of random challenge to bq27541 (starting at location ADF) bytes = 0; TxData[bytes++] = bq27541CMD_ADF; for (i = 1; i <= RANDMESGNUMBYTES; i++) { TxData[bytes++] = Message[i-1]; } MSP430_bq27541_blockWrite(TxData, bytes); // Write checksum for the challenge to the bq27541 sum = 0; for (i = 0; i < RANDMESGNUMBYTES; i++) // Compute the checksum of the block { sum += Message[i]; // Calculate the sum of the values } checksum = (0xFF – (sum & 0x00FF)); // Compute checksum based on the sum MSP430_bq27541_cmdWrite(bq27541CMD_ACKSDFD, checksum); // Read back the digest from the bq27541 MSP430_bq27541_read(bq27541CMD_ADF, RANDMESGNUMBYTES);// Read digest contents
请问主函数这一段代码是不是进行认证的,那我可以不要,对吗
user3608626:
回复 Sheldon Cai:
您好,我现在用单片机读取的时候,发现读取出错了,串口上现实的数据乱码,请问我该怎么解决呢
Sheldon Cai:
回复 user3608626:
1.对于通信问题,再次建议用示波器抓取波形对比
2.电量最难部分是在于参数配置学习等部分,不知道楼主是否完成了这部分工作(包括CHEM-ID选择,golden learning等)
3.请参考附件程序
4.图片波形为某电量计(08对应的是电压)读取电压的波形,08寄存器连续读2个字节得到5E0E,那么电压值为0x0E5E=3678
user3608626:
回复 Sheldon Cai:
void main(){ unsigned int i, bytes; unsigned int sum = 0; unsigned char checksum; unsigned char read; unsigned char msb, lsb; _asm("sim"); uart_init(); //_asm("rim"); hy4145_init(); while(1){
hy4145_read(hy4145_cmd_soh_LSB, 2); soc = transBytes2UnsignedInt(RxData[1], RxData[0]); send_char(soc/10+0x30); send_char(soc%10+0x30); hy4145_read(hy4145_cmd_fcc_LSB, 2); fcc = transBytes2UnsignedInt(RxData[1], RxData[0]); send_char(fcc/1000+0x30); send_char(fcc%1000%100+0x30); send_char(fcc%1000%100/10+0x30); send_char(fcc%1000%100%10+0x30); }
}
我现在只需要读取电量,但是串口上显示fcc和soc的值是
不知道是通讯出问题了。还是怎么,SDA上是有波形!
Sheldon Cai:
回复 user3608626:
请用示波器抓取一次读的波形贴上来,然后分析是否有问题。
user3608626:
回复 Sheldon Cai:
不知道为什么sda的电压是200mv ,我硬件的上拉也有啊,
Sheldon Cai:
回复 user3608626:
建议先排除是否SDA上拉电阻太小或者IO口没有设置成OD(推拉模式下可能会出现这种现象)
user3608626:
回复 Sheldon Cai:
谢谢TI技术支持的耐心解答,目前我这边已经把波形调试出来了,我是先发的0xaa,从机没有ack,然后发0x08(读取电压),还是没有ack ,然后发0xab,还是没有ack ,重新sr,读取数据是0xff,主机发nack ,和stop。我目前用逻辑分析仪能够看到波形,就是从机没有ack。请问究竟是哪里出问题了?