SPI是嵌入式里常用的高速同步串行总线,和I2C形成很好的互补。本文基于i.MX6ULL平台,梳理SPI子系统架构、通信特点,并完整讲解ADXL345三轴加速度传感器从硬件、设备树配置到内核驱动、上层测试的开发流程。
一、SPI子系统基础框架
SPI驱动采用分层解耦设计,分为SPI Master控制器驱动、总线核心层、SPI设备驱动三部分。控制器驱动依托Platform总线,在设备树匹配成功后注册为SPI适配器(Adapter),一份控制器驱动可以挂载多个不同SPI外设,复用性强。
SPI标准四线包含SCLK时钟线、MOSI主机输出从机输入、MISO主机输入从机输出、CS片选线,每个从设备需要独立片选引脚。SPI依靠CPOL时钟极性、CPHA时钟相位组合出4种通信模式,开发时要严格对照器件手册选择模式。
SPI和I2C对比:SPI支持全双工收发,传输速度高,适合大批量高速数据;I2C只有一根数据线,属于半双工,硬件接线更少。大数据场景下SPI经常搭配DMA搬运数据,数据传输过程不需要CPU参与,降低CPU占用,I2C、UART速率偏低,一般很少使用DMA。
二、ADXL345传感器基础
ADXL345是低功耗三轴加速度传感器,同时支持SPI、I2C两种通信接口,输出为13位分辨率。器件供电范围2.0V~3.6V,禁止接入5V电源 。
核心寄存器要点:
- 0x00:设备ID寄存器,正常读取值为0xE5,用来校验通信是否正常;
- 0x31:量程与分辨率配置寄存器,配置为0x0B时开启全分辨率模式,量程±16g;
- 0x2D:电源控制寄存器,Bit3置1,开启测量采集;
- 0x32~0x37:X、Y、Z三轴加速度原始数据,低字节在前、高字节在后,数据是补码格式。
SPI读写该传感器时,地址最高位标记读写方向,第6位用来开启连续多字节读取。
三、i.MX6ULL ECSPI3硬件与设备树配置
本次选用ECSPI3外设,硬件引脚分配:SCLK、MOSI、MISO、CS。硬件没有原生片选时,可以使用普通GPIO模拟CS信号,在设备树通过cs-gpios属性指定。
设备树配置要点:
- 将ECSPI3节点设置
status = "okay"; - 增加adxl345子节点,填写compatible匹配字符串;
- 指定SPI通信速率、SPI模式、片选GPIO。本次通信参数:速率1MHz,SPI Mode3(CPOL=1,CPHA=1),8位数据。
四、ADXL345 SPI驱动开发流程
- 驱动注册:使用
spi_register_driver注册spi_driver结构体,填充probe、remove函数以及of_match_table匹配表,匹配规则和I2C驱动一致,依靠设备树compatible属性匹配。匹配成功进入probe函数,在probe中注册混杂设备misc_register,提供file_operations操作接口。 - 传感器初始化:调用
spi_write_then_read读取设备ID,校验硬件;写入配置寄存器设置量程、分辨率,最后开启测量模式。 - 数据读取:单寄存器读写可以直接使用
spi_write_then_read;连续读取三轴数据时,使用spi_message组装多条消息批量传输。读取地址0x32时,同时置位读标志和连续读取标志,一次性读出6字节XYZ原始数据,再进行高低字节拼接、补码转换。
五、硬件接线与测试验证
硬件接线:VCC接3.3V,GND接GND,CS、SCLK、MISO、MOSI依次接到对应GPIO。
测试步骤:
- 编译驱动模块,insmod加载;
- 内核打印确认SPI参数(速率、模式、片选)和设备树配置一致;
- 应用层打开生成的adxl345设备节点,调用read读取三轴加速度;
- 转动传感器,观察X/Y/Z轴数值随姿态变化,验证功能正常。
六、学习规划补充
SPI+ADXL345驱动完成后,会进入为期一周的综合项目实战阶段。项目可以结合AI相关功能丰富简历内容;同时需要持续复习数据结构、嵌入式面试八股,为后续双选会、面试做好准备。