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.
Diff: bq76pl536a.cpp
- Revision:
- 0:47a258755906
- Child:
- 1:4ae1a58697d7
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bq76pl536a.cpp Sun May 14 20:40:36 2017 +0000 @@ -0,0 +1,109 @@ +#include "bq76pl536a.h" +//=========================================================================== +// Default constructor. Setup spi interface and run init functions +BQ76PL536A::BQ76PL536A(SPI _spi, PinName _cs, u8t _numDev, u16t _cov, u16t _cuv, u8t _balanceTimeout, bool _balanceEnabled) +//=========================================================================== +: spi(_spi), + cs(_cs), + numDev(_numDev), + cov(_cov), + cuv(_cuv), + balanceTimeout(_balanceTimeout), + balanceEnabled(_balanceEnabled) +{ + cs = 1; + softReset(); + setAddresses(); +}; + + + + +//=========================================================================== +// Start conversion on all devices +void BQ76PL536A::adcConvert() +//=========================================================================== +{ + write(BROADCAST_ADDR, ADC_CONVERT_REG, 1); +} + +//=========================================================================== +// Address devices +void BQ76PL536A::setAddresses() +//=========================================================================== +{ + // Address devices + for(u8t i=1; i<numDev; i++) { + 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 + } +} + +//=========================================================================== +// Reset all devices in stack +void BQ76PL536A::softReset() +//=========================================================================== +{ + write(BROADCAST_ADDR, RESET_REG, BQ76PL536A_RESET); +} + +//=========================================================================== +// 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; + u8t logicalAddress = (deviceAddress << 1 | 0); // Shift address left 1 bit + //static u8t receivedData[length]; + //memset(receivedData, 0, length); + static u8t crcInput[3] = {logicalAddress,regAddress,count}; + + cs = 0; + spi.write(logicalAddress); + spi.write(regAddress); + spi.write(count); + + //Read data. Last byte is CRC data. + for (int i = 0; i <= count; i++) { + pRegisterValue[i] = spi.write(0x00); + if (i == count) { + if (pec(crcInput) != pRegisterValue[i]) + error = 1; + } + } + cs = 1; //End of transmission, slave select high + + return false; +} + +//=========================================================================== +// Write one byte to the BQ76 device stack +void BQ76PL536A::write(u8t deviceAddress, u8t regAddress, u8t regData) +//=========================================================================== +{ + u8t logicalAddress = ((deviceAddress << 1) | 1); // Shift address left one bit and set LSB + u8t crcInput[3] = {logicalAddress, regAddress, regData}; + + cs = 1; + spi.write(logicalAddress); + spi.write(regAddress); + spi.write(regData); + spi.write(pec(crcInput)); + cs = 1; +} + +//=========================================================================== +// Calculate CRC byte to verify data integrity +u8t BQ76PL536A::pec(u8t crcBuffer[]) +//=========================================================================== +{ + u8t crc = 0; + int temp = 0; + for (int i = 0; i < sizeof(crcBuffer)/sizeof(crcBuffer[0]) + 1; i++) { + temp = crc ^ crcBuffer[i]; + crc = crcTable[temp]; + } + return crc; +} \ No newline at end of file