使用STM32的DMA驱动4线SPI接口OLED高速显示

解决这个问题源于市面上一种常见的OLED显示屏,使用的是SSD13XX系列的接口,可以通过8080,8086,I2C,3/4 wire SPI进行传输显示。

在开发SPI显示的过程中发现,3线的SPI,DC线使用数据帧传输,那么数据传输就变成了9位,如果使用4线的SPI (DC,CS,MOSI,CLK(其中CS可省略))可以使用8位数据,但是需要D/C线的电平来决定传输的命令或是数据。

在大多数包括厂方提供的例程中,都是使用IO来控制DC线,在个别人的努力下,使用STM32F0系列的芯片,使用9位的DMA传输数据成功。但是对于STM32的其他系列的芯片,只支持8位或16位的SPI.

经过一番研究努力,找到了可以使用DMA +8位SPI传输数据的可靠方法。

实现流程:

1.初始化硬件SPI

2.使用SPI对OLED进行初始化工作,并设置特定的OLED行列参数

3.初始化DMA->SP

上面就是全部。这里的核心就是第2步,由于初始化过程需要控制DC线的电平为CMD状态,所以需要操作相应的IO口。

初始化过程中需要设定OLED工作在行列模式(地址自增),而不是那些例子中给出的页模式(因为页模式需要频繁地设置CMD页命令)。

设置完成后DC线就可以一直保持在DATA电平上。再开启DMA传输,这样使用一块内存区域即可对OLED的内存区域进行同步刷新。

我测试了一下,在F401上使用72M的内核频率下,SPI的CLK至少可达到12M,远远高于F0系列的4M左右。(那些例程使用的模拟SPI能达到100K就很不错了,而且还占用资源)

你可能感兴趣的:(使用STM32的DMA驱动4线SPI接口OLED高速显示)