文件
phonerail/firmware/components/phonerail_hal/include/hal_i2c.h
T
zhou yang和Claude Opus 5 cac6ce47ce A2:HAL 接口(i2c/gpio/pwm/time)+ sim 与 ESP 两套实现
接口在 components/phonerail_hal/include/,宿主机链 sim/、ESP32-S3 链 esp/
(IDF v5.4 新版 i2c_master / gpio / LEDC / esp_timer)。

sim 提供 A3 起要用的假板子控制面:假 I²C 器件(寄存器表 + 大端 + 指针自增)、
可注入 NAK / 器件失联、GPIO 外部驱动与写计数、虚拟时钟。

组件名不叫 hal —— ESP-IDF 自己有 components/hal(driver 依赖它),同名会盖掉。

验收:bash host/test.sh → 3 条 ctest 全过;build_idf.ps1 → 编过且零警告。

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01QYuExfgyYa6DzRRcUso8M8
2026-09-06 18:33:26 +08:00

45 行
1.6 KiB
C
原始文件 Blame 文件历史

此文件含有模棱两可的 Unicode 字符
此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。
/* I²C 主机事务。板上挂着 6 片 INA226 + 2 片 DAC63204 + PCA9555(+ 载板 LM75),
见设计文档 §8.2 的地址表。
刻意只抽象「事务」这一层:不暴露 start/stop/ack,也不暴露时钟延展 ——
驱动层需要的全部就是「往这个地址写这几个字节 / 从这个地址读这几个字节」。 */
#ifndef HAL_I2C_H
#define HAL_I2C_H
#include <stddef.h>
#include <stdint.h>
#include "hal_err.h"
#ifdef __cplusplus
extern "C" {
#endif
typedef struct {
int sda_gpio;
int scl_gpio;
uint32_t freq_hz; /* 0 = 用默认 400 kHz */
} hal_i2c_cfg_t;
/* 幂等:重复调用直接返回 HAL_OK,不会重建总线。
sim 实现忽略 cfg 的内容,但仍然要求先 init —— 让「忘了 init」在宿主机上就暴露。 */
hal_err_t hal_i2c_init(const hal_i2c_cfg_t *cfg);
/* 地址一律是 7 位(0x00~0x7F),不含读写位。 */
hal_err_t hal_i2c_write(uint8_t addr, const uint8_t *data, size_t len);
hal_err_t hal_i2c_read(uint8_t addr, uint8_t *data, size_t len);
/* 写后重复起始再读 —— INA226 / LM75 / PCA9555 读寄存器都是这个形状。
拆成 write + read 两次事务在多主机总线上会被插进来,所以单列一个接口。 */
hal_err_t hal_i2c_write_read(uint8_t addr, const uint8_t *wr, size_t wr_len,
uint8_t *rd, size_t rd_len);
/* 只发地址看有没有 ACK。需求 §12.1 步 2「I²C 扫到 10 个器件」用它。 */
hal_err_t hal_i2c_probe(uint8_t addr);
#ifdef __cplusplus
}
#endif
#endif /* HAL_I2C_H */