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.

[参考译文] BQ27220:通过 cc2640通过 i2c 通信配置 bq27220电量监测计

Guru**** 2329180 points
Other Parts Discussed in Thread: BQ27220, CC2640
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/588541/bq27220-bq27220-fuel-gauge-configuration-through-cc2640-via-i2c-communication

器件型号:BQ27220
主题中讨论的其他器件: CC2640
您好!
我们正在项目中使用 bq27220电量监测计、电池(18000mAh)组中的6个电池3000mAh 并联。

我正在尝试通过 i2c 接口通过 TI 的 CC2640 BLE 模块更新其参数。 我尝试使用 http://www.ti.com/general/docs/lit/getliterature.tsp?baseLiteratureNumber=sluubd4&fileType=pdf 中提供的示例代码进行编码 、但仍然无法更新电池的设计容量。 您能不能指导我如何配置电池电量监测计的参数。
我要添加尝试更改电池参数(设计容量)的代码。  


//100ms 延迟时间
#define MS_2_tick                            ((((100)* 1000)/ Clock_tickPeriod)
// bq27220地址
静态 uint8_t slaveaddr_guage = 0x55;

静态 uint8_t control_staus[2]      =   {0x00、0x01};
静态 uint8_t device_id[2]         =   {0、0};
静态 uint8_t unseale_1[2]             =   {0x00、0x14};
静态 uint8_t unseale_2[2]             =   {0x01、0x04};
静态 uint8_t unseale_3[2]             =   {0x00、0x72};
静态 uint8_t unseale_4[2]             =   {0x01、0x36};

静态 uint8_t full_access_1_[2]      =   {0x00、0xFF};
静态 uint8_t full_access_2[2]      =   {0x01、0xFF};
静态 uint8_t full_access_3[2]      =   {0x00、0xFF};
静态 uint8_t full_access_4[2]      =   {0x01、0xFF};

静态 uint8_t enter_cfg_up_1_[2]      =   {0x00、0x90};
静态 uint8_t enter_cfg_up_2[2]      =   {0x01、0x00};

静态 uint8_t 标志                =   0;

静态 uint8_t MSB_design_cap_1_[2]      =   {0x3E、0x9F};
静态 uint8_t lsb_design_cap_2[2]      =   {0x3F、0x92};
静态 uint8_t OLD_CHECKSUM         =   0;
静态 uint8_t data_len             =   0;
静态 uint8_t OLD_dc_MSB;
静态 uint8_t old_dc_lsb;
静态 uint8_t design_capacy_1[2]   ={0x40、0x46};
静态 uint8_t design_capacy_2[2]   ={0x41、0x50};
静态 uint8_t temp;
uint8_t write_new_checks[2]={0、0};
静态 uint8_t new_checksum;
静态 uint8_t CHECKSUM_DATA_len;
静态 uint8_t exit_cfg_update_1[2]   ={0x00、0x92、0x00};
静态 uint8_t exit_cfg_update_2[2]   ={0x01、0x00};
静态 uint8_t SEALED_1[3]         ={0x00、0x30};
静态 uint8_t SEALED_2[2]         ={0x01、0x00};


void battery_gauge 初始化(void)

            /*选择 i2c 从设备*/

            I2C_STATUS = bspI2cOpen();

            if (i2c_status =true)
            {
                while (bspI2cSelect (interface_0、slaveaddr_guage)== true)
                {
                  Task_sleep (ms_2_tick);
                }

            if (bspI2cWrite (unseal_1、2)=true)
            {
             /*成功*/
            }

            Task_sleep (ms_2_tick);

            if (bspI2cWrite (unseal_2、2)=true)
            {
             /*成功*/
            }

            Task_sleep (ms_2_tick);

            if (bspI2cWrite (unseal_3、2)=true)
            {
             /*成功*/
            }

            Task_sleep (ms_2_tick);

            if (bspI2cWrite (unseal_4、2)=true)
            {
             /*成功*/
            }

      /*提供对数据存储器的完全访问*/

            Task_sleep (ms_2_tick);

            if (bspI2cWrite (full_access_1、2)=true)
            {
            /*成功*/
            }

            Task_sleep (ms_2_tick);

            if (bspI2cWrite (full_access_2、2)=true)
            {
             /*成功*/

            }

            Task_sleep (ms_2_tick);

            if (bspI2cWrite (full_access_3、2)=true)
            {
             /*成功*/

            }

            if (bspI2cWrite (full_access_4、2)=true)
            {
             /*成功*/

            }


            Task_sleep (ms_2_tick);

      /*输入配置更新*/

            if (bspI2cWrite (enter_cfg_up_1、3)= true)
            {
             /*成功*/

            }

            Task_sleep (ms_2_tick);

            if (bspI2cWrite (enter_cfg_up_2)=true)
            {
             /*成功*/

            }

            //延迟1秒
            Task_sleep (ms_2_tick);
            /*检查配置更新是否已更新*/

            while (!(flag & 0x20))
            {
               if (bspI2cWriteRead (0x3B、1、&flag、1)=true)
               {
                /*成功*/

                     Task_sleep (2*MS_2_tick);
               }
            }

            /*获取数据特性的 MSB 访问*/
            Task_sleep (ms_2_tick);

            if (bspI2cWrite (MSB_design_cap_1、2)= true)
            {
             /*成功*/

            }

            Task_sleep (ms_2_tick);

            /*获取数据容性 LSB 的访问*/

            if (bspI2cWrite (lsb_design_cap_2)=true)
            {
                   /*成功*/

            }

            Task_sleep (ms_2_tick);
            /*读取校验和的一个字节*/

            if (bspI2cWriteRead (0x60、1、&OLD_CHECKSUM、1)= true)
            {
            
                   /*成功*/
            }

            Task_sleep (ms_2_tick);
            /*校验和的读取块长度*/


            if (bspI2cWriteRead (0x61、1、&data_len、1)=true)
            {
                   /*成功*/
         }

            Task_sleep (ms_2_tick);
            /*读取两个设计 Capicity 字节*/

            if (bspI2cWriteRead (0x40、1、&OLD_dc_MSB、1)= true)
                  {
                         /*成功*/
                  }

            Task_sleep (ms_2_tick);

            if (bspI2cWriteRead (0x41、1、&old_dc_lsb、1)= true)
                  {
                         /*成功*/
                  }

            Task_sleep (ms_2_tick);
            /*在此处写入两个符号性字节18000mAh = 4650 */

            if (bspI2cWrite (design_capicity、1、2)= true)
                  {
                         /*成功*/
                  }

            Task_sleep (ms_2_tick);

            if (bspI2cWrite (design_capicity _ 2、2)= true)
                  {
                         /*成功*/
                  }

            Task_sleep (ms_2_tick);

            /*计算新的校验和*/

            温度= 256 %(255 - OLD_CHECKSUM - OLD_dc_lsb - OLD_dc_MSB);
            new_checksum = 255 -(256 %(temp + 0x4D + 0x58));

            WRITE_NEW _CHECKSUM_[0]   = 0x60;
            write_new_checkS[1]  = new_checkSum;

            /*写入新的校验和*/

            if (bspI2cWrite (write_new_checksum、2)=true)
                  {
                         /*成功*/
                  }

            Task_sleep (ms_2_tick);

            /*读取校验和数据长度*/

            if (bspI2cWriteRead (0x61、1、&CHECKSUM_DATA_Len、1)= true)
                  {
                         /*成功*/
                  }

            Task_sleep (ms_2_tick);
            /*退出函馆配置*/

            if (bspI2cWrite (exit_cfg_update_1、2)= true)
                  {
                         /*成功*/
                  }

            Task_sleep (ms_2_tick);

            if (bspI2cWrite (exit_cfg_update_2)=true)
                  {
                         /*成功*/
                  }

            /*配置更新的会议*/
            Task_sleep (ms_2_tick);

            while (flag & 0x20)
            {
               if (bspI2cWriteRead (0x3B、1、&flag、1)=true)
                     {
                            /*成功*/

                        Task_sleep (ms_2_tick);
                     }
               Task_sleep (5 * MS_2_tick);
            }

         /*返回密封模式*/

            if (bspI2cWrite (sensed_1、2)=true)
                  {
                         /*成功*/
                  }

            Task_sleep (ms_2_tick);
            if (bspI2cWrite (sensed_2,2)=true)
                  {
                         /*成功*/
                  }

            if (bspI2cWriteRead (control_staus、2、device_id、2)=true)
                  {
                         /*成功*/
                  }
            Task_sleep (ms_2_tick);

            bspI2cDeselect ();
         }

         bspI2cClose ();