11// FILE: INA229.cpp
22// AUTHOR: Rob Tillaart
3- // VERSION: 0.2 .0
3+ // VERSION: 0.3 .0
44// DATE: 2025-01-22
55// PURPOSE: Arduino library for the INA229, SPI, 20 bit, voltage, current and power sensor.
66// URL: https://github.com/RobTillaart/INA229
@@ -193,7 +193,7 @@ double INA229::getEnergy()
193193 // read 40 bit unsigned as a double to prevent 64 bit integers
194194 // double might be 8 or 4 byte, depends on platform
195195 // 40 bit ==> O(10^12)
196- double value = _readRegisterF (INA229_ENERGY, 5 );
196+ double value = _readRegisterF (INA229_ENERGY);
197197 // PAGE 31 (8.1.2)
198198 return value * (16 * 3.2 ) * _current_LSB;
199199}
@@ -205,7 +205,7 @@ double INA229::getCharge()
205205 // read 40 bit unsigned as a float to prevent 64 bit integers
206206 // double might be 8 or 4 byte, depends on platform
207207 // 40 bit ==> O(10^12)
208- double value = _readRegisterF (INA229_CHARGE, 5 );
208+ double value = _readRegisterF (INA229_CHARGE);
209209 // PAGE 32 (8.1.2)
210210 return value * _current_LSB;
211211}
@@ -650,32 +650,45 @@ uint32_t INA229::_readRegister(uint8_t reg, uint8_t bytes) // bytes = 2 or 3.
650650}
651651
652652
653- double INA229::_readRegisterF (uint8_t reg, uint8_t bytes )
653+ double INA229::_readRegisterF (uint8_t reg)
654654{
655655 // Dedicated SPI code
656656 double value = 0 ;
657+ int32_t ival = 0 ;
657658 uint8_t addr = (reg << 2 ) + 1 ; // 1 = Read flag. P18 datasheet
658- uint8_t count = bytes;
659+
659660 digitalWrite (_select, LOW);
660661 if (_hwSPI)
661662 {
662663 _mySPI->beginTransaction (_spi_settings);
663- value += _mySPI->transfer (addr);
664- while (count--)
664+ ival = _mySPI->transfer (addr);
665+ // fetch 4 MSB bytes
666+ for (int i = 0 ; i < 4 ; i++)
665667 {
666- value *= 256 ;
667- value + = _mySPI->transfer (0x00 );
668+ ival <<= 8 ;
669+ ival | = _mySPI->transfer (0x00 );
668670 }
671+ value = ival;
672+ value *= 256 ;
673+ // fetch last LSB byte
674+ uint8_t n = _mySPI->transfer (0x00 );
675+ value += n;
669676 _mySPI->endTransaction ();
670677 }
671678 else // Software SPI
672679 {
673- value += swSPI_transfer (addr);
674- while (count--)
680+ ival = swSPI_transfer (addr);
681+ // fetch 4 MSB bytes
682+ for (int i = 0 ; i < 4 ; i++)
675683 {
676- value *= 256 ;
677- value + = swSPI_transfer (0x00 );
684+ ival <<= 8 ;
685+ ival | = swSPI_transfer (0x00 );
678686 }
687+ value = ival;
688+ value *= 256 ;
689+ // fetch last LSB byte
690+ uint8_t n = swSPI_transfer (0x00 );
691+ value += n;
679692 }
680693 digitalWrite (_select, HIGH);
681694 return value;
0 commit comments