安信可开源AiPi-SCBB通用外设驱动库
01 同一颗驱动,你到底重写了几遍
先问一个可能有点扎心的问题,同一颗温
湿度传感器
的驱动,你到底重写过几遍?
你的办公桌上大概率也有这样的场景。
一颗温湿度传感器,跟了三个项目,换过三颗不同的
MCU
,读时序你手写了三遍。
第一遍是打样,用手头顺手的板子,第二遍是量产,采购同事说原型号缺货,换,第三遍是年度降本,又换了一颗。
业务逻辑一行没动,还是读温度,还是传云端。
变的是那层读
寄存器
、封
I2C
时序、拆
UART
帧的底层适配代码。
在这个行业待过的都懂,这不是技术问题,是行业惯性。
但,这种重写,真的必要吗?
02 被重写的从来不是驱动,是适配层
把「读一颗温湿度传感器」这件小事拆开,你会发现里面有两层。
上层是业务逻辑,读值、滤波、上报、触发告警,这部分换个项目一行都不用动。
下层是适配代码(行业内也常叫胶水代码,glue code),I2C 怎么起止、字节怎么读写、CRC 怎么校验、UART 帧怎么解析,这部分换个芯片就全部推倒重来。
所以一次驱动重写的真实工作量,大头其实落在下层那层适配代码上。
驱动从来没错,错的是我们习惯了把业务逻辑焊死在一颗具体的芯片上。
每换一次 MCU,就是一轮移植加一轮回归测试,花掉的是排期,磨掉的是团队的耐心。
也就是说,如果适配层可以写一次、跨芯片复用,重写这件事的大半工作量会自然消失。
问题是,这层适配代码谁来写,谁来长期维护?
适配层混乱 vs 统一
接口
整洁
03 有个开源库,想干的正是这件事
最近我们开源组织
Ai
-Thinker-Open 新添了一个成员,叫 Ai
Pi
-SCBB,一个用 C 语言写的通用外设驱动库。
官方定位原话是这样,「Ai-Thinker 通用外设驱动库,为 I2C、SPI、PWM+
DMA
、UART、GPIO、单总线等协议的外部器件提供统一的硬件抽象层。」
它的思路分两层,上层 axk_ 统一接口不动,下层 BSP 平台层按 MCU 各写一份。
你只要把 I2C 读写、UART 收发这几个函数按你的芯片实现进 BSP 层,上面所有驱动直接可用。
仓库走 MIT 协议,条款宽松,对商业项目很友好。
纸面上听都像是抽象层的标准话术,这种话你能信吗?
代码不会说谎,直接看。
04 代码就在这,两行加一行
先看温湿度传感器 DHT11,RE
AD
ME 里的示例,逐字照搬。
int ret = axk_dht11_read(&
te
mp, &humi);
返回 0 即成功,温度与湿度已经放进 temp 与 humi。
两行读温湿度,业务逻辑直接往上叠,单总线时序一次都不用碰。
再看我们自己家的 2
4G
Hz
毫米波雷达
Rd-03_V2,出厂带人体存在检测固件,能检测静止、运动、微动的人体。
它的头文件 axk_rd03_v2.h,整个接口只有两个函数,逐字照搬。
int axk_rd03_v2_init(void); // 初始化 UART,波特率 115200,返回 0 成功
int axk_rd03_v2_read(int *distance); // 1=有人(距离cm写入*distance) 0=无人 -1=错误
调一次 axk_rd03_v2_read,人体在不在、距离多少厘米,直接写进指针给你。
就这么多,第一次看到这个接口时我愣了一下。
一行读人体存在与距离,这就是统一接口的底气。
最后来个让我意外的,
USB
-PD 取电芯片 CH224A。
axk_ch224_set_vout 的枚举覆盖 5V/9V/12V/15V/20V/28V/PPS/AVS。
想调得更细,axk_ch224_set_pps_vout 收一个浮点电压,范围 5.0 到 28.0V,精度 0.1V。
你以为统一接口只是给
传感器
用的?
电源
协商芯片也一并收编了。
这些只是几个切片,完整清单有多长?
05 11 个模块,都盖住了什么
把现在的清单过一遍,共 11 个模块。
SHT3x 系列温湿度(I2C 地址 0x44,覆盖 SHT30、SHT31、SHT35,带 CRC-8 校验)
DHT11 温湿度(单总线)。
Rd03_V2 毫米波雷达(UART)
HXD039B2
红外
空调遥控(UART 加 GPIO)。
ST7789V 液晶屏(SPI,1.47 寸、1.69 寸、1.9 寸、2.0 寸四个尺寸)
0.96 寸
OLED
(S
SD
1306,128x64,SPI)。
WS2812 灯珠(最多 60 颗,GRB 格式,axk_ws2812_set_pixel_color 点亮单颗,也有 HSV 版本,全局亮度 0.0 到 1.0 可调)。
INA226 电压
电流
功率监测(I2C 地址 0x40)
DS1302
实时时钟
(GPIO 三线)
RELAY 继电器(GPIO 高电平有效)
CH224A USB-PD(I2C 地址 0x22)。
清单还在长,LLCC68 的
LoRa
驱动 8 月 6 日才合入,而这个仓库 7 月 13 日才创建,前后不到一个月。
从感知、显示、执行到电源,一台
智能硬件
的外围基本铺满了。
不过清单再长,你肯定想问,接进项目费不费劲?
06 接进来,三步走
第一步:pip install kconfiglib windows-cu
rs
es,装好配置工具。
第二步:跑
python
menuconfig.py,弹出图形界面,想要哪个模块按 Y 勾选。勾完自动生成 scbb_config.h,一个配置宏都不用手写。
第三步:cmake -B build && cmake --build build,编译完成。
pip install kconfiglib windows-curses
python menuconfig.py
cmake -B build && cmake --build build

menuconfig 图形配置界面
README 里有句话值得抄出来,CMake 会自动读取该文件,无需手动传递 -D 参数。
集成方式也不挑,CMake 的 add_
sub
directory 或 FetchContent 都行,手动加源文件也可以,
Keil
、IAR、Makefile 都兼容。
唯一要自备的是一个 log.h,部分模块可选接入
FreeRTOS
。
工作流轻到这个程度,试错成本几乎为零,那它能移植多远?
07移植出去,写一份 BSP 就行
仓库自带两份 BSP 平台层,BSP/Ai-M6x 对应博流 SDK 的 BL616、BL618,BSP/
stm32
f10x 对应 STM32 的 HAL。
顺带说一句,如果你的项目已经深度绑在 STM32 HAL 上,也不冲突,SCBB 是一个并存选项,不是来替代谁的。
平台无关的设计意味着,想跑在任何 MCU 上,写一份自己的 BSP 就行。
适配成本只付一次,之后 11 个模块在新芯片上全部直接可用。
连命名权都在你手里,menuconfig 里可以配置 BSP 头文件名与函数前缀,比如 my_platform_i2c.h,比如 my_i2c。
也就是说,这层适配代码不是强加给你的规范,是递到你手上的模板。
问题绕回来了,这一切到底能帮你省下什么?
回到开头那个问题,同一颗传感器的驱动,你重写过几遍?
希望看完这篇,这个数字能停止增长。
适配代码写一次就封存,业务逻辑站在原地不动,省下的不只是排期,是研发团队的精力,被放回到真正创造价值的部分上。
驱动库只是手段,让业务逻辑站定不动才是目的。
AiPi-SCBB 是我们开源组织的新成员,MIT 协议的开源库,也是一次方向性动作,把底层适配代码交给统一接口,把
开发者
的时间还给开发本身。
仓库在 GitHub 上,搜Ai-Thinker-Open/AiPi-SCBB,欢迎来踩一踩,更欢迎提 PR。
想上手 Rd-03_V2 雷达的,样品通道已经开放,点击阅读原文,和我们联系。
愿你的下一个项目,驱动只写一遍。
传感器
传感器
+关注
关注
2581
文章
57148
浏览量
804422
开源
开源
+关注
关注
3
文章
4805
浏览量
47606
安信可
安信可
+关注
关注
0
文章
252
浏览量
5428
原文标题:安信可又开源了一套AiPi-SCBB,这是什么?
文章出处:【微信号:安信可科技,微信公众号:安信可科技】欢迎添加关注!文章转载请注明出处。
