130 lines
3.6 KiB
Python
130 lines
3.6 KiB
Python
#!/usr/bin/env python3
|
|
# test_power_with_init.py
|
|
|
|
from maix import i2c, time
|
|
import sys
|
|
|
|
# INA226 register addresses
|
|
INA226_ADDR = 0x40
|
|
REG_CONFIGURATION = 0x00
|
|
REG_BUS_VOLTAGE = 0x02
|
|
REG_CURRENT = 0x04
|
|
REG_CALIBRATION = 0x05
|
|
|
|
# Configuration values
|
|
CONFIG_VALUE = 0x4527 # Configuration: 16 averages, 1.1ms conversion time, continuous mode
|
|
CALIBRATION_VALUE = 0x1400 # Calibration value
|
|
|
|
def write_register(bus, reg, value):
|
|
"""Write to INA226 register"""
|
|
data = [(value >> 8) & 0xFF, value & 0xFF]
|
|
bus.writeto_mem(INA226_ADDR, reg, bytes(data))
|
|
|
|
def read_register(bus, reg):
|
|
"""Read from INA226 register"""
|
|
data = bus.readfrom_mem(INA226_ADDR, reg, 2)
|
|
return (data[0] << 8) | data[1]
|
|
|
|
def init_ina226(bus):
|
|
"""Initialize INA226 chip"""
|
|
try:
|
|
# Write configuration register
|
|
write_register(bus, REG_CONFIGURATION, CONFIG_VALUE)
|
|
time.sleep_ms(10)
|
|
|
|
# Write calibration register
|
|
write_register(bus, REG_CALIBRATION, CALIBRATION_VALUE)
|
|
time.sleep_ms(10)
|
|
|
|
# Verify configuration by reading it back
|
|
config_read = read_register(bus, REG_CONFIGURATION)
|
|
if config_read != CONFIG_VALUE:
|
|
print(f" Warning: Config readback mismatch: 0x{config_read:04X} != 0x{CONFIG_VALUE:04X}")
|
|
|
|
return True
|
|
except Exception as e:
|
|
print(f" Init failed: {e}")
|
|
return False
|
|
|
|
def read_voltage(bus):
|
|
"""Read bus voltage"""
|
|
raw = read_register(bus, REG_BUS_VOLTAGE)
|
|
voltage = raw * 1.25 / 1000
|
|
return voltage
|
|
|
|
def read_current(bus):
|
|
"""Read current"""
|
|
raw = read_register(bus, REG_CURRENT)
|
|
# Handle signed value
|
|
if raw & 0x8000:
|
|
raw = raw - 0x10000
|
|
current_lsb = 0.001 * CALIBRATION_VALUE / 4096
|
|
current = raw * current_lsb * 1000 # mA
|
|
return current
|
|
|
|
def test_i2c_bus(bus_num):
|
|
"""Test a single I2C bus with full initialization"""
|
|
print(f"\n{'='*60}")
|
|
print(f"Testing I2C Bus {bus_num}")
|
|
print(f"{'='*60}")
|
|
|
|
try:
|
|
# Step 1: Initialize I2C bus
|
|
print(f" 1. Initializing I2C bus...")
|
|
bus = i2c.I2C(bus_num, i2c.Mode.MASTER)
|
|
print(f" OK")
|
|
|
|
# Step 2: Initialize INA226
|
|
print(f" 2. Initializing INA226...")
|
|
if not init_ina226(bus):
|
|
print(f" FAILED")
|
|
return False
|
|
print(f" OK")
|
|
|
|
# Step 3: Read voltage multiple times
|
|
print(f" 3. Reading voltage...")
|
|
for i in range(5):
|
|
try:
|
|
voltage = read_voltage(bus)
|
|
current = read_current(bus)
|
|
print(f" Read {i+1}: {voltage:.3f}V, {current:.1f}mA")
|
|
time.sleep_ms(100)
|
|
except Exception as e:
|
|
print(f" Read {i+1} failed: {e}")
|
|
|
|
print(f" SUCCESS")
|
|
return True
|
|
|
|
except Exception as e:
|
|
print(f" FAILED: {e}")
|
|
import traceback
|
|
traceback.print_exc()
|
|
return False
|
|
|
|
def main():
|
|
"""Test all I2C buses"""
|
|
print("INA226 Test with Proper Initialization")
|
|
print("=" * 60)
|
|
|
|
# Test buses in order of likelihood
|
|
test_order = [5, 1, 3, 4, 0, 2]
|
|
|
|
success_buses = []
|
|
|
|
for bus_num in test_order:
|
|
if test_i2c_bus(bus_num):
|
|
success_buses.append(bus_num)
|
|
# If we found a working bus, stop testing others
|
|
break
|
|
|
|
print(f"\n{'='*60}")
|
|
print(f"Summary:")
|
|
print(f" Working buses: {success_buses}")
|
|
if not success_buses:
|
|
print(f" ERROR: No working I2C bus found!")
|
|
return 1
|
|
|
|
return 0
|
|
|
|
if __name__ == "__main__":
|
|
sys.exit(main()) |