diff --git a/design_doc/debug.md b/design_doc/debug.md new file mode 100644 index 0000000..1acbab1 --- /dev/null +++ b/design_doc/debug.md @@ -0,0 +1,36 @@ +1. 问题描述:开机失败,一直遇到Traceback (most recent call last): + File "/tmp/maixpy_run/main.py", line 525, in + cmd_str() + File "/tmp/maixpy_run/main.py", line 102, in cmd_str + camera_manager.init_camera(640, 480) + File "/tmp/maixpy_run/camera_manager.py", line 59, in init_camera + self._camera = camera.Camera(width, height) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + RuntimeError: : Runtime error: mmf vi init failed + 解决方案: + 根据过往经验,极有可能是摄像头的接线有问题。因为在测试环境,摄像头是通过一个24针转22针的线出来的,然后再通过一个接线中继,连接到一个22针 + 的fpc线到Maixcam。接线中继如果是24针的,多了两针,需要选好一边然后对连。但这里很容易出错或者松动。可以先用摄像头本身的金色接线直接接到 + Maixcam,然后跑test目录下的test_cammera.py,看看能不能正常启动,如果正常,就确定是中继接线的问题。 + +2. 问题描述:202609 批次的拓展版,在连接 202601 批次的电源板,或者不链接电源板的时候,开机后不久,出错,程序退出,日志是: + [v1.2.10] [INFO] network.py:1078 - [NET] TCP主线程启动 + [v1.2.10] [INFO] network.py:406 - [NET] WiFi不可用或无法连接服务器,使用4G网络 + [v1.2.10] [INFO] network.py:475 - 连接到服务器,使用4G... + [v1.2.10] [INFO] network.py:527 - [4G-TCP] AT+MIPCLOSE=2 response: + OK + +MIPCLOSE: 2 + -- [E] read failed + Trigger signal, code:SIGSEGV(11)! + maix multi-media driver released. + ISP Vipipe(0) Free pa(0x8a52c000) va(0x0x3fbeb5e000) + program exit failed. exit code: 1. + + 解决方案: + 从日志看,就是开始发送登录信息之后就崩溃了。出发了底层的read failed。经过排查,是一定要插上电源板的数据连线,以及电源板要插上电池。这个应该是 + 登录时需要读电源电压数据, + +3. 问题描述:202609 批次的拓展版,有一块maixcam的蓝灯常亮,询问maixcam的人,他们觉得应该是卡没有插好。但是拓展版上的激光口挡住了数据卡的出口, + 没法拔出检查, + 解决方案:需要做拓展版的公司(深链鑫创)在做好板子之后,确定系统能正常启动 +4. + diff --git a/test/test_i2c.py b/test/test_i2c.py new file mode 100644 index 0000000..25f985e --- /dev/null +++ b/test/test_i2c.py @@ -0,0 +1,61 @@ +#!/usr/bin/env python3 +# test_i2c_devices.py + +import os +from maix import i2c + +def list_i2c_devices(): + """List available I2C device nodes""" + print("Available I2C devices:") + + # Check /dev directory + try: + dev_files = os.listdir("/dev") + i2c_devices = [f for f in dev_files if "i2c" in f] + if i2c_devices: + for dev in sorted(i2c_devices): + print(f" /dev/{dev}") + else: + print(" No /dev/i2c-* devices found!") + except Exception as e: + print(f" Error listing /dev: {e}") + +def try_i2c_bus(bus_num): + """Try to initialize an I2C bus""" + try: + bus = i2c.I2C(bus_num, i2c.Mode.MASTER) + print(f" I2C bus {bus_num}: OK") + return True + except RuntimeError as e: + print(f" I2C bus {bus_num}: {e}") + return False + except Exception as e: + print(f" I2C bus {bus_num}: Unexpected error: {e}") + return False + +def main(): + print("=" * 60) + print("I2C Device Diagnostic") + print("=" * 60) + + # List kernel devices + list_i2c_devices() + + # Try common bus numbers + print("\nTesting I2C buses:") + working_buses = [] + for bus_num in range(10): + if try_i2c_bus(bus_num): + working_buses.append(bus_num) + + print(f"\nWorking buses: {working_buses}") + + if not working_buses: + print("\nERROR: No I2C buses available!") + print("Possible causes:") + print(" 1. I2C kernel driver not loaded") + print(" 2. Device tree doesn't enable I2C") + print(" 3. Different kernel version with different device naming") + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/test/test_power.py b/test/test_power.py new file mode 100644 index 0000000..812debf --- /dev/null +++ b/test/test_power.py @@ -0,0 +1,130 @@ +#!/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()) \ No newline at end of file