上一篇使用了GPIO口模拟SPI来驱动OLED显示屏,并且遇到了一些不明白的问题,这次把这个问题搞明白了,并且使用SPI来驱动,在驱动过程中的一些问题也顺便和大家分享下。 SSP(synchronous Seril Port)同步串行端口控制器,可支持SPI、TI和Microwire协议,一条总线允许有多个从机,但某一个时刻只允许有一个主机和一个从机进行通信。多应用于EEPROM、FLASH、实时时钟、AD转换器,还有数字信号处理器和数字信号解码器之间(而I2C多用于同一单片机不同芯片之间的短距离通信)。SPI支持全双工通信,而I2C仅支持半双工,Uart也支持全双工通信。 SPI通信是数据交换的过程,数据通过移位寄存器进行交换。 主机发送时,将一位数据写入TxFIFO移入移位寄存器,数据通过MOSI移出主机,从机通过MOSI移入从机,从机同时会从移位寄存器中移出一位数据到主机,如果是只写操作,主机则可以忽略读取到的数据,通过Dummy = LPC_SSP1->DR假装读取进行忽略。 主机接收数据时,主机首先要发送一个指令启动从机发送,如高电平(0xFF),从机接收到后发送数据到移位寄存器中。每次接收主机都需要发送数据触发从机发送数据。
先说下上次使用IO口驱动OLED时,碰到一些引脚不听话,控制不了,发来发现是程序初始化的时候已经把这些IO口设置为其他功能,而不是GPIO的功能了。
先来看下数据书上的GPIO功能列表
我主要使用这几个引脚来驱动OLED
之前这几个引脚有的不听使唤,是因为在Board_SystemInit.c的文件的Board_SystemInit函数里把相关的引脚初始化为别的功能了
这里的这几个IO口都设置为SPI功能了,我们这次就要使用这些功能,但是PIO0_8要设置为GPIO口使用,OLED屏只有输入没有输出。
引脚相关定义,这里为了方便,增加了一个宏定义
SPI初始化设置,这里也有个坑,用官方的库初始化,最后效果虽然也有显示,但是显示的颜色不对,找了一下午折腾了半天也没找到为题,后来在下班的前几分钟想到干脆用寄存器直接来操作,反正也没几个寄存器,一下子就好了,反复测试了几次,发现这个库的初始化确定有问题
SPI硬件有4根信号线:SCK(串行时钟线)、CS(片选信号)、MOSI(主机输出从机输入)、MISO(主机输入从机输出) 其中,CS通过拉低来选择从机设备,数据在SCK时钟的边沿跳变时进行数据采样和数据的读取和发送。具体规则由CPOL和CPHA控制。 CPOL:1——空闲状态时SCK为高电平 0——空闲状态时SCK为低电平 CPHA:1——数据在第一个跳变沿采样 0——数据在第二个跳变沿采样 故共有4种组合: CPOL=0,CPHA=0,数据在第一个上升沿时采样,第一个下降沿读取/发送 CPOL=0,CPHA=1,数据在下降沿时采样,上升沿读取/发送 CPOL=1,CPHA=0,数据在第一个下降沿时采样,第一个上升沿读取/发送 CPOL=1,CPHA=1,数据在上升沿采样,下降沿读取/发送
使用库初始化显示的效果
SPI发送一个字节函数,使用SPI的速度确实是快了很多
主程序里的显示调用函数
实际的显示效果照片
|