我`m 2个 BQ76PL536A 来管理5个电池。 `m 与电路板通信、我使用 Arduino Uno。 `s I`m 使用以下代码:
#include #include // // teste com dois 卡通 // const 字节 crcTable[256]={ 0x00、0x07、0x0E、0x09、0x1C、 0x1b、0x12、0x15、0x38、0x3F、 0x36、0x31、0x24、0x23、0x2A、 0x2D、0x70、0x77、0x7E、0x79、 0x6C、0x6B、0x62、0x65、0x48、 0x4F、0x46、0x41、0x54、0x53、 0x5A、0x5D、 0xE0、0xE7、0xEE、 0xE9、0xFC、0xFB、0xF2、0xf5、 0xD8、0xDF、0xD6、0xD1、0xC4、 0xC3、0xCA、0xCD、0x90、 0x97、 0x9E、0x99、0x8C、0x8B、0x82、 0x85、0xA8、0xAF、0xA6、0xA1、 0xB4、0xB3、0xBA、0xBD、0xC7、 0xC0、 0xC9、0xCE、0xDB、0xDC、 0xD5、0xD2、0xFF、0xf8、0xF1、 0xF6、0xE3、0xE4、0xED、0xEA、 0xB7、0xB0、0xB9、 0xBE、0xAB、 0xAC、0xA5、0xA2、0x8F、0x88、 0x81、0x86、0x93、0x94、0x9D、 0x9A、0x27、0x20、0x29、0x2E、 0x3B、0x3C、0x35、0x32、0x1F、 0x18、0x11、0x16、0x03、0x04、 0x0D、0x0A、0x57、0x50、0x59、 0x5E、0x4B、 0x4C、0x45、0x42、 0x6f、0x68、0x61、0x66、0x73、 0x74、0x7D、0x7A、0x89、0x8E、 0x87、0x80、0x95、0x92、 0x9B、 0x9C、0xB1、0xB6、0xBF、0xB8、 0xAD、0xAA、0xA3、0xA4、0xF9、 0xFE、0xF7、0xF0、0xE5、0xE2、 0xEB、 0xEC、0xC1、0xC6、0xCF、 0xC8、0xDD、0xDA、0xD3、0xD4、 0x69、0x6E、0x67、0x60、0x75、 0x72、0x7B、0x7C、 0x51、0x56、 0x5F、0x58、0x4D、0x4A、0x43、 0x44、0x19、0x1E、0x17、0x10、 0x05、0x02、0x0B、0x0C、0x21、 0x26、0x2F、0x28、0x3D、0x3A、 0x33、0x34、0x4E、0x49、0x40、 0x47、0x52、0x55、0x5C、0x5B、 0x76、0x71、 0x78、0x7F、0x6A、 0x6D、0x64、0x63、0x3E、0x39、 0x30、0x37、0x22、0x25、0x2C、 0x2B、0x06、0x01、0x08、 0x0F、 0x1A、0x1D、0x14、0x13、0xAE、 0xA9、0xA0、0xA7、0xB2、0xB5、 0xBC、0xBB、0x96、0x91、0x98、 0x9F、 0x8A、0x8D、0x84、0x83、 0xDE、0xD9、0xD0、0xD7、0xC2、 0xC5、0xCC、0xCB、0xE6、0xE1、 0xE8、0xEF、0xFA、 0xFD、0xF4、 0xF3 }; #define DEVICE_STATUS 0x00 #define GPAI 0x01 #define VCELL1 0x03 #define VCELL2 0x05 #define VCELL3 0x07 #define VCELL4 0x09 #define VCELL5 0x0B #define VCELL6 0x0D #define Temperature1 0x0F #define TEMPRATURE2 0x11 #define ALERT_STATUS 0x20 #define FAULT_STATUS 0x21 #define COV_FAULT 0x22 #define CUV_FAULT 0x23 #define PRESULT_A 0x24 #define PRESULT_B 0x25 #define ADC_CONTROL 0x30 #define IO_CONTROL 0x31 #define CB_CTRL 0x32 #define CB_TIME 0x33 #define ADC_convert 0x34 #define Shdw_CTRL 0x3A #define ADDRESS_CONTROL 0x3B #define RESET 0x3C #define TEST_SELECT 0x3D #define E_EN 0x3F #define FUNCING_CONFIG 0x40 #define IO_CONFIG 0x41 #define ALERT_PIN 3 #define FAULT_PIN 4 #define CONV_PIN 5 #define DRDY_PIN 6 #define SLAVE_SELECT_PIN 10 #define MOSI11 #define MISO12 #define DISCOVERY_ADDR 0x00 #define broadcast 0x3F #define ADDRESS_MAP 0x3F #define AC_ADDR_RQST 0x80 #define RESET_COMMAND 0xA5 #define dev1 1 #define dev2 2 静态 int devices_used = 2; void setup(); void loop(); void setup(){ //编程 延迟延迟(2000); pinMode (slave_select_PIN、输出); pinMode (fault_PIN、输入); 引脚模式(ALERT_PIN、输入); 引脚模式(DRDY_PIN、输入); 引脚模式(CONV_PIN、 输出); //写入初始引脚状态 digitalWrite (CONV_PIN、low); digitalWrite (slave_select_PIN、HIGH); //开始串行通信以进行串行调试 Serial.begin(57600); delay (100); //设置 SPI 首选项 SPI.begin(); SPI.setClockDivider(SPI_CLOCK_DIV32); SPI.setBitOrder(MSBFIRST); //连接到 BMS SHIELD setupDevices(); } void loop (){ delay (1000); } void setupDevices() { int num_dev; num_dev=setAddresses(); if (num_dev == devices_used ) { Serial.print ("Found all ");Serial.print (nnum_dev); serial.println ("设备。"); } 否则 serial.println ("查找设备时出错..."); } int setAddresses(){ 字节 lear_for=0; 字节 n; 字节 temp; byte* verify; int mystatus; serial.println ("初始化设备"); 执行 { bqWrite (广播、RESET、RESET_COMMAND); 查找++; N=0; 操作 { N++; bqWrite (discovery_ADDR、address_control、n); *verify_bqRead (n、address_control、1); //验证 ADDRESS_CONTROL 的位7是否设置正确 temp=(* verify)& ac_ADDR_RQST; 如果(temp!= 0) {Serial.print ("bit 7 ADRRESS_control set OK=");Serial.println (temp); serial.print("Addrres=");serial.println(*verify & address_map); } 其他 {Serial.println ("错误:位7 (ADRRESS_CONTROL)未设置。"); serial.print("Verify=");serial.println(*verify); serial.print("Address stored=");serial.println(*verify & address_map); 返回 n-1; } } while (n < lare_for); }while (n < device_used); return n; } void bqWrite (byte deviceAddress、byte regAddress、byte regData){ SPI.setDataMode(SPI_MODE1); //移位器件位并设置位0 字节 logicalAddress = deviceAddress << 1; logicalAddress |= 1 << 0; //设置位0、测试位集(x、n) 字节 crcInput[3]={ logicalAddress、regAddress、regData }; //将 SS 引脚置于低电平以选择芯片 digitalWrite (slave_select_PIN、low); //发送和接收 SPI spi.transfer (logicalAddress); spi.transfer (regAddress); spi.transfer (regData); spi.transfer (pec (crcInput)); //采用 SPI .digbyte SPI.setDataMode(SPI_MODE1);(regbyte);SPI.setDataMode(SPI_MODE0);选择芯片高字节从器件地址;degbyte (regbyte) //移动器件位并清除位0 字节逻辑地址= deviceAddress << 1; logicalAddress &=~(1 <<0);//清除位0、测试 bitClear (x、n) //创建用于接收数据的缓冲区并清除静态 字节接收数据[20]; memset (sizeData、0、receiveof ( ss)://选择低字节接收数据;//将芯片选为低字节 digitalWrite (slave_select_PIN、low); //发送和接收 SPI spi.transfer (logicalAddress); spi.transfer (regAddress); spi.transfer (length); for (int i = 0;i < length + 1;i++){ receivedData[i]= SPI.transfer (0x00); } //将 SS 引脚置为高电平来取消选择芯片: digitalWrite (slave_select_PIN、HIGH); SPI.setDataMode(SPI_MODE0); //从寄存器读取的数据 返回 receivedData; } 字节 PEC (byte crcBuffer[]){ byte CRC = 0; int temp = 0; for (i < 1 + creBuffer);for (i < 1 + i +(cre+) temp = CRC ^ crcBuffer[i]; CRC = crcTable[temp]; } 返回 CRC; }
遗憾的是、我甚至无法正确设置器件地址。 在输出下方、我得到:
===========================
正在初始化设备。
错误:位7 (ADRRESS_CONTROL)未设置。
验证=61
地址存储= 61
查找设备时出错...
===========================
是否有任何关于从何处开始调试的建议?
非常感谢、
Cesar。