STM32学习笔记(五)--SPI点亮OLED
-
SPI点亮OLED
根据以往学习通讯协议的经验,学习一个新的通讯协议一般是学习物理层和协议层两个部分
物理层
SPI总线如下图:
其中,SS端口为片选端口,用于表示某个从机是否开启,一般是低电平表示开启。
SCK是时钟线,控制通讯速率和采样,MOSI是从机的接收端,主机的发送端,用于主机向从机传输数据,MISO端则是从机向主机发送数据
相对于CAN协议而言,SPI协议的物理层和协议层都十分简单明了。
协议层
首先是通讯的时序图
可见,当SS端口电压拉低时,即为通讯开始
其中,MSB与LSB表示最高有效位和最低有效位,通常情况下,SPI会先发送MSB,这取决于通讯和存储的格式,所谓MSB与LSB,比如一个数字0x12345678,那么如果采用高位存储,则存储方式为||12||34||56||78||,若为低位存储,则存储为||78||56||34||12||,可见,高位存储才是符合我们常识的存储方式,故SPI通常先发送MSB。
STM32的SPI通讯还采用CPOL和CPHA来控制通讯模式,其中,CPOL用于控制空闲时SCK时钟线的电平状态,CPOL=0时,代表空闲时SCK为低电平,CPOL=1则为高电平。CPHA用于控制采样的时刻,CPHA=0时,代表采样的位置为奇数边沿(如果CPOL=0,即SCK空闲时为低电平,当SCK第一次上升为高电平时,视为第一次边沿,此时会采样MOSI端的数据),CPHA=1时,采样位置为偶数边沿。
通常采用‘0’或‘3’模式数据的发送可以设置为8位传输和16位传输,主要取决于主机与从机的数据存储格式。
利用STM32CubeMX初始化,搭建SPI通讯环境。
OLED
OLED使用的是12864的黄蓝双色屏,控制方法与LCD类似,也是扫描屏幕来控制显示,但与LCD不同的是,OLED发光时是每一个像素点单独发光,因此不存在背光的说法,而LCD的发光事实上依靠于背光源。
控制OLED的方法是通过SPI写寄存器,来控制OLED的工作模式和传输显示的数据,OLED的屏幕显示芯片有显示ASCII码的能力,但无法显示汉字,想要显示汉字就要利用取模软件来获得显示矩阵。
显示图片就需要扫描屏幕,发送整个屏幕的显示矩阵,同样的,可以在取模软件上自行画图,最后生成矩阵数据,在生成数据时,生成的矩阵要适配OLED显示时的扫描方式,一般来说,扫描方式有四种:
第一种叫做逐列式,即先从第一列开始,扫描整列,扫描完毕后扫描第二列,第三列,直到扫描完整个屏幕;
第二种叫做逐行式,即先从第一行开始,扫描整行,然后第二行,第三行,直到扫描完毕;
第三种叫做列行式,如果数据发送的格式设置为8位,那么,列行式则会从第一列开始,向下扫描八个像素点,然后,从第二列的列首开始,向下扫描8位,接着第三列,第四列,直到扫描完所有列,之后,扫描位点会跳转到第一列的第9个像素点,向下扫描八位,接着第二列的第9个像素点,第三列,直到扫描完成,扫描完后,会继续回到第一列,以此类推,直到扫描完整个屏幕。
第四种叫做行列式,与第三种相反。
取模完成后,完善程序,运行无误后烧写运行,