【海思】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进行设配。常规流程如下:

  1. datasheet中确认从设备的SPI是哪一种模式;
  2. 从设备支持的时钟范围;
  3. 确实数据的传输方向,MSB或者LSB,这一步出问题可能导致数据处理异常,有些SPI从设备会根据MSB是0还是1决定此次通信是读取还是设置;
  4. 数据交换时的位宽。

根据以上的关键信息做SPI主设备的设配。

海思中使用的注意事项:

  1. 将SPI用到的引脚做SPI功能复用;
  2. 确认用到的片选脚;
  3. 海思将SPI LSADC UART OTP PWM相关时钟开关在同一个寄存器配置,需要打开SPI时钟.

问题定位

当出现通信效果不达预期时,可以参考使用以下方法定位问题:

  1. 确认四个脚均复用成SPI功能,海思使用himm读取相关寄存器如时钟,片选,复用是否正确;
  2. 用示波器或者逻辑分析仪确认时钟配置正确,时钟数值在从设备的可接受范围内;
  3. 波形确认SPI通信发生瞬间,所有波形是否如从设备datasheet描述;
  4. 了解主设备是否支持回声测试,如果支持,则将MISO和MOSI短接,验证自发自收是否正常;
  5. 确认数据格式及传输方式是否正确;
  6. 如果以上都是正常的,仅仅出现MISO或者MOSI没有波形,大概率是MISO和MOSI接线反了,有些名称是相对的,对调接线尝试。
posted @ 2022-03-05 22:04  刘锐滨  阅读(256)  评论(0)    收藏  举报