微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 硬件电路设计 > TI电源管理交流 > 单片机和bq34z100的通讯问题

单片机和bq34z100的通讯问题

时间:10-02 整理:3721RD 点击:

 目前我想用avr的单片机和bq34z100来通讯,把电量读取出来,然后在我自己的上位机上显示出来。

目前我在参考官方提供的代码实例,430&gasgauge,我发现有很多问题我不是很清楚,比如说sha-1算法,还有cmd和byte的在bq的电量计里到底指的是什么?

1.在开发bq34Z100时需要EV2400/EV2300来进行参数配置调试等

2.SHA-1算法主要是用于认证,与计量是独立的,如果只需要读电量信息,IO口模拟I2C的话只需要下列2个文件里的代码:

lib-I2C_GPIO

\MSP430F2xx_bq27541EVM\source

然后对比bq27541和bq34Z100 datasheet 修改bq27541.h文件里面对应的命令

 

那写命令和字节具体指的是什么呢。我现在想把电量soc的值读取出来,那我是不是先要写一些命令,然后在读取该地址的命令就行了,望指导!

// 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

请问主函数这一段代码是不是进行认证的,那我可以不要,对吗

您好,我现在用单片机读取的时候,发现读取出错了,串口上现实的数据乱码,请问我该怎么解决呢

1.对于通信问题,再次建议用示波器抓取波形对比

2.电量最难部分是在于参数配置学习等部分,不知道楼主是否完成了这部分工作(包括CHEM-ID选择,golden learning等)

3.请参考附件程序

4.图片波形为某电量计(08对应的是电压)读取电压的波形,08寄存器连续读2个字节得到5E0E,那么电压值为0x0E5E=3678

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上是有波形!

请用示波器抓取一次读的波形贴上来,然后分析是否有问题。

 

 不知道为什么sda的电压是200mv ,我硬件的上拉也有啊,

建议先排除是否SDA上拉电阻太小或者IO口没有设置成OD(推拉模式下可能会出现这种现象)

谢谢TI技术支持的耐心解答,目前我这边已经把波形调试出来了,我是先发的0xaa,从机没有ack,然后发0x08(读取电压),还是没有ack ,然后发0xab,还是没有ack ,重新sr,读取数据是0xff,主机发nack ,和stop。我目前用逻辑分析仪能够看到波形,就是从机没有ack。请问究竟是哪里出问题了?

  这是我用逻辑分析仪 弄出来的波形,  我是先发的0xb0 然后是0x08  重新开始 sr   再 0xb1读  ,可是你们发现没有,第九个时钟都是高电平,说明从机并没有返回ack给主机啊

先检查下34Z100硬件是否正常,测试REG25电压和TS管脚的波形。I2C速率不要太快,最好小于100K。同时建议先连接我们的EV2400/EV2300看是否能正常工作。

谢谢 问题终于解决了,thanks!附上一张我逻辑分析仪的图

请问你那个BQ34Z100的官方代码哪里找的啊

你好,能否分享一下这个问题的原因是什么?谢谢!

好吧,其实我是用软件模拟的iic,问题的所在是我对时序还是不了解,ti的手册上都写的很明确,但是我却忽略了其中的细节问题,比如延迟多少,比如ack信号返回等等,建议各位 用ev2300和逻辑分析仪来联合调试,各位如果有问题可以加我qq971947289

深刻感受到iic对时序的要求实在是太高了,所以希望大家能用逻辑分析仪来进行数据的分析,然后你用上位机吧scan选择某一个command。然后逻辑分析仪就有波形出来,你对照那个波形来写程序,应该就差不多了

兄弟,最后问题解决了吗?最近也在做同样的工作,是否可以共享一下资料,先谢过了,我的QQ:1013511649,目前我的要求是通过AVR MCU的i2c接口读取gas gauge的电量信息并通过几个LED显示电量,求指导一下!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top