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

单片机和bq34z100的通讯问题

 目前我想用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。请问究竟是哪里出问题了?

赞(0)
未经允许不得转载:TI中文支持网 » 单片机和bq34z100的通讯问题
分享到: 更多 (0)