1.SPI通信原理
SPI是串行外设接口(Serial Peripheral Interface)的缩写。是 Motorola 公司推出的一 种同步串行接口技术,是一种高速的,全双工,同步的通信总线。
SPI的通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以(单向传输时)。也是所有基于SPI的设备共有的,它们是SDI(数据输入)、SDO(数据输出)、SCLK(时钟)、CS(片选)。
1.MOSI/SDI – SerialData In,串行数据输入;
2.MISO/SDO – SerialDataOut,串行数据输出;
3.SCLK – Serial Clock,时钟信号,由主设备产生;
4.CS – Chip Select,从设备使能信号,由主设备控制。
其中,CS是从芯片是否被主芯片选中的控制信号,也就是说只有片选信号为预先规定的使能信号时(高电位或低电位),主芯片对此从芯片的操作才有效。这就使在同一条总线上连接多个SPI设备成为可能。
接下来就负责通讯的3根线了。通讯是通过数据交换完成的,这里先要知道SPI是串行通讯协议,也就是说数据是一位一位的传输的。这就是SCLK时钟线存在的原因,由SCLK提供时钟脉冲,SDI,SDO则基于此脉冲完成数据传输。数据输出通过 SDO线,数据在时钟上升沿或下降沿时改变,在紧接着的下降沿或上升沿被读取。完成一位数据传输,输入也使用同样原理。因此,至少需要8次时钟信号的改变(上沿和下沿为一次),才能完成8位数据的传输。
(图1)SPI通信结构图
(图2)SPI常规读操作
(图3)SPI常规写操作
2.SPI的四种模式
根据SPI时钟极性(CPOL)和时钟相位(CPHA)配置的不同可分为4种模式。
时钟极性是指SPI通信设备处于空闲状态时(或SPI通信开始时,即SS为低电平时),SCK的电平信号CPOL=0时,SCK空闲状态为低电平,CPOL=1时则相反。
时钟相位是指数据采样的时刻,当CPHA=0时,MOSI或MISO数据线会在时钟线第一个边沿开始采样(奇数边沿)。
当CPHA=1时,MOSI或MISO数据线会在时钟线第二个边沿开始采样(偶数边沿)。
详细如下:
1.CPOL=0,CPHA=0:此时空闲态时,SCLK处于低电平,数据采样是在第1个边沿,也就是 SCLK由低电平到高电平的跳变,所以数据采样是在上升沿,数据发送是在下降沿。
2.CPOL=0,CPHA=1:此时空闲态时,SCLK处于低电平,数据发送是在第1个边沿,也就是 SCLK由低电平到高电平的跳变,所以数据采样是在下降沿,数据发送是在上升沿。
3.CPOL=1,CPHA=0:此时空闲态时,SCLK处于高电平,数据采集是在第1个边沿,也就是 SCLK由高电平到低电平的跳变,所以数据采集是在下降沿,数据发送是在上升沿。
4.CPOL=1,CPHA=1:此时空闲态时,SCLK处于高电平,数据发送是在第1个边沿,也就是 SCLK由高电平到低电平的跳变,所以数据采集是在上升沿,数据发送是在下降沿。
(图4)SPI的CPOL和CPHA
3.硬件SPI与模拟SPI的区别
在模拟SPI的模式下,我们需要使用IO口去模拟SPI的时序,这个模拟的全部过程,都需要CPU全程负责,但在获取或者发送数据的时候,可能会使用软件延时,这个时间在数据交互量不大的情况下并明显,但是如果数据量大,可能会打乱SPI的时序。
对于硬件SPI来说,我们只需要开启相应的寄存器配置和对应的中断。数据的交互就不需要CPU参与。当传输中断产生的时候,CPU只需要从中断中搬运数据就好了,省下了软件模拟IO的存取时间。让CPU省下更多时间去运行其他代码。
4.硬件SPI的配置
首先我们需要确定OLED屏幕上面的引脚,如图:
(图5)OLED硬件管脚图
GND - 接地 VCC – 接3.3V
SCL – 接SCK(5脚) SDA – 接MOSI(7脚)
RST – 接 42脚(可修改) DC – 接43脚(可修改)
作为Master模式下,提供有6组IO口供用户选择,而作为Slave有1组。在Master模式下,Apollo提供一个128-byte 的local RAM作为双向FIFO的传输容量。Apollo2的管脚复用具体如下:
(图6)Apollo2全部引脚寄存器配置图
(图7)Apollo2 引脚颜色比对图
第一步,我们选择Master 0 Signals 也就是相对于的 5、6、7引脚。
具体通过am_hal_gpio_pin_config()函数进行引脚配置
第二步,配置iom_config
在SPI_g_sIOMConfig里面配置的是IOM的一些常规参数:
模式我们选择为AM_HAL_IOM_SPIMODE 传输速率为 100KHZ,相位和极性都是0 。写数据的阈值是4bit,读取是60bit。这两个是生产中断的条件。
最后记得开启IO Master
第三步,对屏幕进行复位操作,而复位操作主要是改变RST引脚的高低电平。
通过Apollo2 SDK提供的API去修改IO口状态。
am_hal_gpio_out_bit_clear()置0
am_hal_gpio_out_bit_set()置1