Initial rough start to the BQ76PL536A (or BQ76PL536A-Q1) code. Free to use as long as you make any changes/improvements publicly available. Please notify me of any improvements.

Files at this revision

API Documentation at this revision

Comitter:
dmwahl
Date:
Sun Jul 25 18:15:36 2021 +0000
Parent:
2:7083c7257556
Commit message:
Initial rough start to the BQ76PL536A (or BQ76PL536A-Q1) code

Changed in this revision

bq76pl536a.cpp Show annotated file Show diff for this revision Revisions of this file
bq76pl536a.h Show annotated file Show diff for this revision Revisions of this file
bq76pl536a_typedefs.h Show annotated file Show diff for this revision Revisions of this file
diff -r 7083c7257556 -r a0e12d12f780 bq76pl536a.cpp
--- a/bq76pl536a.cpp	Thu Jul 30 01:55:05 2020 +0000
+++ b/bq76pl536a.cpp	Sun Jul 25 18:15:36 2021 +0000
@@ -1,3 +1,13 @@
+///-----------------------------------------------------------------
+///   Description:      BQ76PL536A Driver
+///   Author:           David Wahl
+///   Date:             13-JUL-2021
+///   Notes:            Initial release
+///
+///   Revision History:
+///   Name:           Date:        Description:
+///-----------------------------------------------------------------
+
 #include "bq76pl536a.h"
 //===========================================================================
 // Default constructor. Setup spi interface and run init functions
@@ -14,7 +24,7 @@
     DigitalOut cs(_cs);
     cs = 1;
     spi.format(8,1);
-    spi.frequency(500000);
+    spi.frequency(2.5e6);
 
     cs=0;
     wait_ms(1);
@@ -26,6 +36,17 @@
 };
 
 
+//===========================================================================
+// Convert raw values to cell voltage
+float BQ76PL536A::cellVolts(u8t lobyte, u8t hibyte)
+//===========================================================================
+{
+    float cv = (((((u16t)lobyte << 8) + (u16t)hibyte)*6250/16383)/1000.0); // [V]
+    //float cv = (((lobyte * 256) + hibyte)*6250/16383); // [mV]
+
+    return cv;
+};
+//===========================================================================
 
 
 //===========================================================================
@@ -51,15 +72,10 @@
 {
     for(u8t i=0; i<numDev; i++)    {
         write(DISCOVERY_ADDR, ADDRESS_CONTROL_REG, i+1);
-
-        //write(DISCOVERY_ADDR, ADDRESS_CONTROL_REG, i); //Write address to first discovered address
-        // write 1 then 0 to Alert Status Reg to remove alert
-        //write(i, ALERT_STATUS_REG, 0b10000000); //Write 1 to address bit of alert register
-        //write(i, ALERT_STATUS_REG, 0b00000000); //Write 0 to address bit of alert register to clear alert
     }
 }
 
-//===========================================================================
+/*//===========================================================================
 // Device status
 u8t BQ76PL536A::devStatus()
 //===========================================================================
@@ -69,15 +85,25 @@
     read(1,DEVICE_STATUS_REG,1,currentStatus);
     return currentStatus[0];
 }
-//===========================================================================
-
+//===========================================================================*/
 
 //===========================================================================
 // Read one or more bytes from the BQ76 device stack. Count does not include CRC byte.
-bool *BQ76PL536A::read(u8t deviceAddress, u8t regAddress, u8t count, u8t *pRegisterValue)
+bool BQ76PL536A::readAll(u8t deviceAddress)
+//===========================================================================
+{
+    //error = 0;
+    read(deviceAddress,0,64,bqPackData);
+    return false;
+}
+
+//===========================================================================
+// Read one or more bytes from the BQ76 device stack. Count does not include CRC byte.
+bool BQ76PL536A::read(u8t deviceAddress, u8t regAddress, u8t count, u8t *pRegisterValue)
 //===========================================================================
 {
     error = 0;
+    bool crcGood = true;
     u8t logicalAddress = (deviceAddress << 1 | 0); // Shift address left 1 bit
     u8t crcInput[3+count];
     crcInput[0] = logicalAddress;
@@ -96,12 +122,14 @@
             crcInput[3+i] = pRegisterValue[i];
         }
         if (i == count) {
-            if (pec(crcInput,3+count) != pRegisterValue[i])
+            if (pec(crcInput,3+count) != pRegisterValue[i]) {
                 error = 1;
+                crcGood = false;
+            }
         }
     }
     cs = 1; //End of transmission, slave select high
-    return false;
+    return crcGood;
 }
 
 //===========================================================================
diff -r 7083c7257556 -r a0e12d12f780 bq76pl536a.h
--- a/bq76pl536a.h	Thu Jul 30 01:55:05 2020 +0000
+++ b/bq76pl536a.h	Sun Jul 25 18:15:36 2021 +0000
@@ -1,3 +1,13 @@
+///-----------------------------------------------------------------
+///   Description:      BQ76PL536A Driver
+///   Author:           David Wahl
+///   Date:             13-JUL-2021
+///   Notes:            Initial release
+///
+///   Revision History:
+///   Name:           Date:        Description:
+///-----------------------------------------------------------------
+
 #ifndef BQ76PL536A_H
 #define BQ76PL536A_H
 
@@ -9,14 +19,12 @@
 protected:
     SPI spi;
     DigitalOut cs;
-    
-    bool *read(u8t deviceAddress, u8t regAddress, u8t count, u8t *pRegisterValue);
-    void write(u8t deviceAddress, u8t regAddress, u8t regData);
-    
-    void adcConvert();
+
+
+
     void setAddresses();
     void softReset();
-    
+
     u8t pec(u8t crcBuffer[], u8t crcLength);
 
 public:
@@ -25,12 +33,21 @@
     //BQ76PL536A(SPI _spi, PinName _cs);
 
     BQ76PL536A();
+
+    bool read(u8t deviceAddress, u8t regAddress, u8t count, u8t *pRegisterValue);
+    void write(u8t deviceAddress, u8t regAddress, u8t regData);
+
+    void adcConvert();
+    bool readAll(u8t deviceAddress);
+
     u8t error, balanceTimeout;
     u16t cov, cuv;
     bool balanceEnabled;
     u8t numDev, attachedCells[];
-    
-    u8t devStatus();
+
+    u8t bqPackData[65];
+
+    float cellVolts(u8t lobyte, u8t hibyte);
 };
 
 #endif
\ No newline at end of file
diff -r 7083c7257556 -r a0e12d12f780 bq76pl536a_typedefs.h
--- a/bq76pl536a_typedefs.h	Thu Jul 30 01:55:05 2020 +0000
+++ b/bq76pl536a_typedefs.h	Sun Jul 25 18:15:36 2021 +0000
@@ -1,3 +1,13 @@
+///-----------------------------------------------------------------
+///   Description:      BQ76PL536A Driver
+///   Author:           David Wahl
+///   Date:             13-JUL-2021
+///   Notes:            Initial release
+///
+///   Revision History:
+///   Name:           Date:        Description:
+///-----------------------------------------------------------------
+
 #ifndef BQ76PL536A_TYPEDEFS_H
 #define BQ76PL536A_TYPEDEFS_H
 
@@ -72,12 +82,12 @@
   0x8A,0x8D,0x84,0x83,0xDE,0xD9,0xD0,0xD7,0xC2,0xC5,0xCC,0xCB,0xE6,0xE1,0xE8,0xEF,0xFA,
   0xFD,0xF4,0xF3};
 
-//*BQ Pack special addresses*/
+//*BQ76PL536A special addresses*/
 #define BROADCAST_ADDR            0x3F
 #define DISCOVERY_ADDR            0x00
-#define BQ76PL536_RESET           0xa5
+#define BQ76PL536A_RESET           0xa5
 
-//Definition of the BQ76PL536 registers
+//Definition of the BQ76PL536A registers
 typedef enum BQ_DEV_REGS
 {
   DEVICE_STATUS_REG=0x00,
@@ -130,12 +140,6 @@
   BQ_SPI_REG_MAX=0x4F
 } bq_dev_regs_t;
 
-
-//*BQ Pack special addresses*/
-#define BROADCAST_ADDR 0x3F
-#define DISCOVERY_ADDR 0x00
-#define BQ76PL536A_RESET 0xa5
-
 //delay after bq calls
 #define BQDELAY 10
 //----------------------------------------------------------------------------------------