解决这个问题源于市面上一种常见的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就很不错了,而且还占用资源)