【海思】SPI使用
概述
SPI(serial peripheral interface,串行外设接口)是一种同步串行外设接口。可以用于主控SoC和外设SoC通信,正常的SPI通信只需要4条线即可,分别是SCLK(时钟),MISO(主机M输入I从机S输出O,DI),MOSI(主机M输出O从机S输入I,DO),nCS(片选)。
主机能够控制的从机数量由该主机的SPI控制器有几个CS脚决定。
SPI的数据传输涉及对传输方向的设置,有以下两种:
MSB、LSB
Most Significant Bit,最高有效位,可以理解为对该数据产生影响最大的那一位。
Least Significant Bit,最低有效位,可以理解位对该数据影响最小的那一位。
比如0xA2,二进制表示为10100010,其中左边的一位对整个数据影响最大,当最左边的数据变成0时,整个数据变成0x22,相差很大。当最左边的数据变成1时,该数据仅变成0xA3,差别只有1。
所以0xA2的0xA2的MSB和LSB分别时1,0。如下
(MSB)10100010(LSB)
MSB的传输顺序是 10100010, LSB的传输顺序是 01000101
时钟极性(CPOL)、时钟相位(CPHA)
SPI通过CPOL和CPHA控制着主从设备间,何时交换数据以及何时对接收到的数据进行采样, 来保证主从设备的数据同步。
CPOL = 0 时,时钟空闲状态是低电平;
CPOL = 1 时,时钟空闲状态是高电平;
CPHL = 0 时,在时钟的第一个跳变沿开始数据采样;
CPHL = 1 时,在时钟的第二个跳变沿开始数据采样;
由上可以引申出SPI存在4中模式,分别是:
- Mode 0 CPOL=0, CPHA=0
- Mode 1 CPOL=0, CPHA=1
- Mode 2 CPOL=1, CPHA=0
- Mode 3 CPOL=1, CPHA=1
数据传输
SPI的不存在读写的概念,每发生一次SPI通信,都是数据的交换,可以理解为读写是同时发生的。有些代码在实现SPI通信时,由于业务需要,可能有spi_read_data()和spi_write_date()等类似接口的实现,实际上实现是一致的,只是spi_read_data()会关注MISO的返回值。
由于SPI不存在读写的概念,但是从设备的业务逻辑可能有区分读写操作的需要,所以从设备会对读写操作做不同的数据格式规定,可能用MSB或者LSB做的值来做区分。
使用
SPI开发经常是根据SPI从设备厂商提供的datasheet进行设配。常规流程如下:
- datasheet中确认从设备的SPI是哪一种模式;
- 从设备支持的时钟范围;
- 确实数据的传输方向,MSB或者LSB,这一步出问题可能导致数据处理异常,有些SPI从设备会根据MSB是0还是1决定此次通信是读取还是设置;
- 数据交换时的位宽。
根据以上的关键信息做SPI主设备的设配。
海思中使用的注意事项:
- 将SPI用到的引脚做SPI功能复用;
- 确认用到的片选脚;
- 海思将SPI LSADC UART OTP PWM相关时钟开关在同一个寄存器配置,需要打开SPI时钟.
问题定位
当出现通信效果不达预期时,可以参考使用以下方法定位问题:
- 确认四个脚均复用成SPI功能,海思使用himm读取相关寄存器如时钟,片选,复用是否正确;
- 用示波器或者逻辑分析仪确认时钟配置正确,时钟数值在从设备的可接受范围内;
- 波形确认SPI通信发生瞬间,所有波形是否如从设备datasheet描述;
- 了解主设备是否支持回声测试,如果支持,则将MISO和MOSI短接,验证自发自收是否正常;
- 确认数据格式及传输方式是否正确;
- 如果以上都是正常的,仅仅出现MISO或者MOSI没有波形,大概率是MISO和MOSI接线反了,有些名称是相对的,对调接线尝试。
本文来自博客园,作者:刘锐滨,转载请注明原文链接:https://www.cnblogs.com/liuruibin/articles/15969253.html

浙公网安备 33010602011771号