平台:i.MX6ULL
今天学习 SPI,写了 ECSPI3 驱动 ADXL345 三轴加速度传感器,顺便回顾之前学的 IIC、串口 UART,把这三种嵌入式最常用串行总线做横向对比,记录原理、代码和踩坑点。
一、硬件信息
使用开发板引脚:17、18、19、20,映射到 ECSPI3
- 17:ECSPI3_SCLK
- 18:ECSPI3_MOSI
- 19:ECSPI3_MISO
- 20:GPIO1_IO20,软件控制 CS 片选(不是硬件 NSS,GPIO 模拟片选)
重点:i.MX6ULL 的 ECSPI 片选这里我们用普通 GPIO 来控制,而不是 ECSPI 自带硬件片选,灵活性更高。
二、SPI 底层驱动代码spi.c
![]()
三、ADXL345 传感器驱动adxl345.c
![]()
![]()
驱动要点小结
- SPI 是全双工,
spi3_read_write发的同时收,读传感器必须发 Dummy 字节0xFF用来提供时钟。- ADXL345 SPI 协议规定:地址最高位为 1 代表读,0 代表写。
- CS 使用普通 GPIO 软件控制,通信前拉低,通信结束拉高。
- 原始数据是 16 位有符号数,乘以 0.0039 转换成重力加速度 g。
四、SPI / IIC / UART 三种总线横向对比
![]()
五、学习感悟
最近串行总线学习路线:UART → IIC → SPI。
- UART 是异步,不需要时钟线,靠双方约定波特率,做调试打印最常用。
- IIC 只需要两根线,依靠地址来区分设备,但是半双工,速度比较慢,适合低速外设。
- SPI 同步全双工,速度最快,但是引脚多,靠 CS 片选管理多个从机。本次 i.MX6ULL ECSSPI 驱动 ADXL345,对 SPI 全双工的特性理解更深刻:SPI 不存在单纯读或者单纯写,只要 SCK 时钟在跑,就会一边发一边收。