This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

单片机和bq34z100的通讯问题

Other Parts Discussed in Thread: BQ34Z100, EV2400

 目前我想用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

    BQ27421 MSP430.zip
  • 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显示电量,求指导一下!