/* CH224A 驱动(只读)。只经 hal_i2c_*,不碰任何平台头文件。契约见 ch224a.h。 ⚠️ 本文件里**没有任何写寄存器的函数**,那是有意的(头文件那个框)。 */ #include "ch224a.h" #include #include "hal_i2c.h" /* 0x50 的单位是 50 mA/LSB(R2 §36.2)。 */ uint32_t ch224a_ma_from_reg(uint8_t reg) { return (uint32_t)reg * 50u; } uint32_t ch224a_power_limit_mw(uint32_t ma) { /* 20 V × ma(mA) = mW。20000 mV × mA / 1000 = 20 × mA。 */ return (uint32_t)((uint64_t)CH224A_FIXED_MV * ma / 1000u); } bool ch224a_addr_ok(uint8_t addr) { /* 主干上的器件 + 刀片支路上的两个。任何一个撞上都会让「选到通道 5」 之后的读写打到错的器件上。 */ static const uint8_t others[] = { 0x20, 0x40, 0x43, 0x4A, 0x4B, 0x70 }; if (addr > 0x7f) { return false; } for (size_t i = 0; i < sizeof(others); i++) { if (others[i] == addr) { return false; } } return true; } static hal_err_t read_reg(uint8_t addr, uint8_t reg, uint8_t *val) { return hal_i2c_write_read(addr, ®, 1, val, 1); } hal_err_t ch224a_probe(uint8_t addr) { uint8_t st = 0; return read_reg(addr, CH224A_REG_STATUS, &st); } hal_err_t ch224a_read_status(uint8_t addr, uint8_t *status) { if (status == NULL) { return HAL_ERR_ARG; } return read_reg(addr, CH224A_REG_STATUS, status); } hal_err_t ch224a_read_max_ma(uint8_t addr, uint32_t *ma) { if (ma == NULL) { return HAL_ERR_ARG; } uint8_t reg = 0; const hal_err_t err = read_reg(addr, CH224A_REG_CURRENT, ®); if (err != HAL_OK) { return err; /* 读失败时不动调用方的值:旧的上限比一个 0 可信 */ } *ma = ch224a_ma_from_reg(reg); return HAL_OK; }