嵌入式技术及应用(STM32CubeMX版)课件 任务17 用硬件SPI口控制OLED屏_第1页
嵌入式技术及应用(STM32CubeMX版)课件 任务17 用硬件SPI口控制OLED屏_第2页
嵌入式技术及应用(STM32CubeMX版)课件 任务17 用硬件SPI口控制OLED屏_第3页
嵌入式技术及应用(STM32CubeMX版)课件 任务17 用硬件SPI口控制OLED屏_第4页
嵌入式技术及应用(STM32CubeMX版)课件 任务17 用硬件SPI口控制OLED屏_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

任务17

用硬件SPI口控制OLED屏任务要求OLED显示器的控制芯片为SSD1306,接口形式为4线制SPI接口,挂载在STM32的SPI2口上,STM32采用硬件SPI的方式访问SSD1306,要求用硬件SPI传送数据的方式修改任务13中的写数函数,使OLED屏中显示公民的基本道德观,如图所示。知识储备

1.SPI接口的信号线SPI是SerialPeripheralInterface的缩写,其含义是串行外围设备接口,SPI接口是Motorola公司推出的一种同步串行外设接口,用于单片机与各种外设以串行方式进行数据通信。SPI总线接口芯片有很多种,目前已有带有SPI接口的键盘、显示接口芯片、A/D芯片、D/A芯片、EEPROM芯片、看门狗芯片等等。标准的SPI总线有SCK、MISO、MOSI、NSS(

)四根线,简化的SPI总线只有SCK、

和DIO三根线,它将MISO、MOSI线合并成DIO线。

线名功能SCK串行时钟线。由主设备控制发出,传送由单片机产生的时钟信号,控制SPI接口芯片内部的移位寄存器的移位操作,使数据传输同步。NSS()片选线,由主设备控制。控制芯片的选择,低电平有效。MISO(或DIO)主机输入从机输出数据线。用于传输从芯片传往单片机的数据。MOSI(或DIO)主机输出从机输入数据线。用于传输从单片机传往芯片的数据。(1)SPI总线中各线的功能1.SPI接口的信号线

1.SPI接口的信号线(2)单片机扩展SPI接口芯片从右图连接电路可以看出,带有SPI接口的单片机扩展SPI接口芯片的连接方法是,在单片机中用若干根I/O口线作芯片的片选线,分别与各芯片的线相接,单片机的SCL脚、MOSI脚、MISO脚分别与各SPI接口芯片的SCK、MOSI、MISO引脚相接。如果芯片为简化的SPI总线接口,则将芯片的DIO引脚既接到单片机的MISO引脚上,又接到单片机的MOSI引脚上。具有SPI接口的单片机扩展SPI接口芯片的连接电路

2.STM32中SPI口的应用特性STM32集成有SPI1、SPI2、SPI3共3个SPI口,它们的帧格式可选择为8位/帧或16位/帧,数位传输的顺序可编程设置为MSB(MostSignificantBit,最高有效位)在前或LSB(LeastSignificantBit,最低有效位)在前,可编程设置时钟的极性(CPOL)和相位(CPHA),可用DMA控制数据传输操作。每个SPI口都可工作在全双工主机/从机模式、半双工主机/从机模式、主机/从机仅接收/发送模式下。这3个SPI口挂载在不同的总线上,SPI1挂载在APB2上,最高通信速率高达36Mb/s,SPI2、SPI3挂载在APB1上,最高通信速率为18Mb/s。这3个SPI口除了通信速度不同外,其结构和功能相同。

2.STM32中SPI口的应用特性(1)SPI口的结构右图为SPI口的结构,如图所示,STM32的SPI口主要由MOSI、MISO、SCK、NSS等4个引脚、移位寄存器、收发缓冲器、波特率发生器、内部控制寄存器和控制电路组成。MOSI引脚:主机输出/从机输入引脚。SPI口工作在主机模式时,该引脚为数据发送脚,工作在从机模式时,该引脚为数据接收脚。2.STM32中SPI口的应用特性(1)SPI口的结构MOSI以及其他几个引脚、移位寄存器的功能示意图如图所示。MISO引脚:主机输入/从机输出引脚。SPI口工作在主机模式时,该引脚为数据接收脚,工作在从机模式时,该引脚为数据发送脚2.STM32中SPI口的应用特性(1)SPI口的结构移位寄存器:实现串行数据与并行数据之间的转换,MOSI引脚和MISO引脚分别为移位寄存器的串行输入、输出端,发送缓冲区和接收缓冲区分别为移位寄存器的并行输入、输出端。在主机模式下,MOSI引脚为移位寄存器的串行输出端,MISO引脚为移位寄存器的串行输入端。在从机模式下,MOSI引脚为移位寄存器的串行输入端,MISO引脚为移位寄存器的串行输出端。SCK引脚:串行时钟脚。在主机模式下,SCK引脚输出串行时钟。在从机模式下,SCK引脚输入时钟信号,控制从机内部的移位寄存器的移位操作,使数据传输同步。2.STM32中SPI口的应用特性(1)SPI口的结构NSS引脚:从设备选择脚。STM32作从设备时,NSS引脚为片选输入控制脚,NSS=0,芯片被选中,SPI口自动处于从机模式,STM32与主机进行数据通讯,NSS=1,芯片没被选中,STM32不能与主机进行数据通讯。STM32作主设备时,NSS引脚可作为片选输出引脚,用来输出片选信号,并在SPI处于主机模式时输出低电平信号。在实际应用中,常用的方法是,取消NSS的硬件片选控制功能,而用某个GPIO引脚充当片选输出脚,用软件模拟输出片选信号。波特率发生器:在主机模式下用来产生SPI的时钟信号。内部控制寄存器和控制电路用来设置SPI的工作模式、数据位的长度,移位的方式、时钟信号的极性和数据采样的时刻,记录SPI的工作状态。2.SPI口的引脚STM32有3个SPI口,各个SPI口的引脚定义在不同的GPIO口上。其中,SPI1、SPI3的引脚可以映射至不同GPIO口上,STM32中各SPI口的引脚分布如下表所示。其中,“/”左边的GPIO口为SPI默认的GPIO口,“/”右边的GPIO口为SPI口可映射的GPIO口。例如,SPI1的CLK脚在表中的GPIO口为PA5/PB3,其含义是,若使能SPI1口,默认情况下,SPI1口的CLK脚为PA5脚,但可以映射至PB3脚上。SPI口的引脚分布如下图所示SPI口NSSCLKMISOMOSISPI1PA4/PA15PA5/PB3PA6/PB4PA7/PB5SPI2PB12PB13PB14PB15SPIPA15/PA4BP3/PC10PB4/PC11PB5/PC12(1)SPI口的引脚2.SPI口的引脚SPI口的操作时序是指SPI口进行数据传输时,MOSI、MISO、SCK等引脚信号之间的时序关系,包括上升沿、下降沿出现的先后次序、数据线上出现数据的时间及先后次序等。SPI口的操作时序由SPI_CR寄存器的CPOL(时钟极性)、CPHA(时钟相位)位设置,其中,CPOL(时钟极性)位定义了无数据传输时SCK的状态,其规则如下:CPOL=0:空闲时SCK=0。CPOL=1:空闲时SCK=1。CPHA(时钟相位)定义了数据采样的时间,其规则如下:CPHA=0:时钟的第一个跳变沿(上升沿或下降沿)进行数据采样。CPHA=1:时钟的第二个跳变沿(上升沿或下降沿)进行数据采样。(2)SPI口的操作时序2.SPI口的引脚根据CPOL、CPHA的取值组合,SPI的时序有4种,如图1、图2所示。(2)SPI口的操作时序

图1:CPHA=0时的操作时序

图2:CPHA=1时的操作时序2.SPI口的引脚上述图1、图2的含义如下表所示(2)SPI口的操作时序CPHACPOL空闲时SCK状态CLK的第1个时钟沿数据采集时刻000上升沿时钟的第1边沿(上升沿)011下降沿时钟的第1边沿(下降沿)100下降沿时钟的第2边沿(下降沿)111上升沿时钟的第2边沿(上升沿)3.SPI口的设置方法在实际应用中一般是用STM32控制带有SPI接口的扩展芯片,此时STM32为主控器(主机),SPI接口芯片为从控制。在配置STM32的SPI口时需要我们具备依规办事的意识,先弄清楚接口芯片的时序图,然后依据接口芯片的时序图来设置STM32的SPI时序,设置的原则如下:(1)时钟的极性要与接口芯片的SPI时钟极性相同;(2)时钟序频率不超过接口芯片SPI时钟的最高频率;(3)数据采样时间相同、数据传输的方向相同;(4)每帧数据的位数位相同3.SPI口的设置方法例如,在OLED的控制芯片中,SSD1306的SPI接口时序如下图所示。时序图给出了MCU对SSD1306芯片进行读写操作时,SSD1306芯片的各引脚的状态及其出现的时间关系。包括上升沿、下降沿出现的先后次序、间隔的时间、数据线上出现数据的时刻及先后次序等。3.SPI口的设置方法【说明】SSD1306的时序图中虽没给出时钟周期数据,但在实际应用中,SSD1306采用4线制SPI接口时,SCLK的频率可高达18MHz。从SSD1306的SPI接口时序图中可以看出以下信息:(1)写命令和写数据的时序除DC引脚的状态不同外,其他引脚的时序相同。写显存数据时DC=1,写命令时DC=0。(2)CS=1时,禁止访问SSD1306,仅当CS=0时才能访问SSD1306。(3)CS的下降沿前,即时钟空闲时,SCLK可以是高电平,也可以是低电平。(4)时钟上升沿采样数据。也就是说,如果空闲时的时钟为低电平,则数据采集发生在第1个时钟沿。(5)每次传输8位数据,且数据移位的方向是,高位(D7)在先,低位(D0)在后。3.SPI口的设置方法所以,在STM32CubeMX中配置SPI的参数时,应将数位设置成8位,起始位设置成MSB,时钟的极性设为LOW,时钟的相位设为第1边沿,如右图所示。4.HAL库中常用的SPI操作函数HAL库中常用的SPI操作函数主要有HAL_SPI_Init()、HAL_SPI_Receive()、HAL_SPI_Transmit()、HAL_SPI_TransmitReceive()等几个函数,这些函数的定义位于stm32f1xx_hal_spi.c文件中,这些函数的说明位于stm32f1xx_hal_spi.h中,在使用这些函数时需在程序中用#include指令将stm32f1xx_hal_spi.h头文件包含至程序文件中。(1)HAL_SPI_Init()函数原型HAL_StatusTypeDefHAL_SPI_Init(SPI_HandleTypeDef*hspi);功能用指定的参数初始化SPI口。参数hspi:SPI口句柄,取值为hspix,x为SPI的编号,取值为1~3。返回值HAL的状态(2)HAL_SPI_Receive()函数4.HAL库中常用的SPI操作函数原型HAL_StatusTypeDefHAL_SPI_Receive(SPI_HandleTypeDef*hspi,uint8_t*pData,uint16_tSize,uint32_tTimeout);功能用查询方式接收若干数据并存放至指定的缓冲区中。参数1hspi:SPI口句柄,取值为hspix,x为SPI的编号,取值为1~3。参数2pData:数据接收缓冲区的地址。参数3Size:接收数据的长度。参数4Timeout:查询等待的最长时间,单位为ms。返回值HAL的状态。【举例】SPI2用查询方式接收20节字数据,并存入无符号字符型数组rBuf[]中,接收数据的最长时间为100ms,则其程序如下:HAL_SPI_Receive(&hspi2,rBuf,20,100);(3)HAL_SPI_Transmit()函数4.HAL库中常用的SPI操作函数原型HAL_StatusTypeDefHAL_SPI_Transmit(SPI_HandleTypeDef*hspi,uint8_t*pData,uint16_tSize,uint32_tTimeout)功能用查询方式发送数据。参数1hspi:SPI口句柄,取值为hspix,x为SPI的编号,取值为1~3。参数2pData:数据接收缓冲区的地址。参数3Size:接收数据的长度。参数4Timeout:查询等待的最长时间,单位为ms。返回值HAL的状态。【举例】用SPI2将无符号字符型变量dat中的数据发送出去,其程序如下:

HAL_SPI_Transmit(&hspi2,&dat,1,0xff);(4)HAL_SPI_TransmitReceive()函数4.HAL库中常用的SPI操作函数原型HAL_StatusTypeDefHAL_SPI_TransmitReceive(SPI_HandleTypeDef*hspi,uint8_t*pTxData,uint8_t*pRxData,uint16_tSize,uint32_tTimeout);功能用查询方式同时接收和发送数据。参数1hspi:SPI口句柄,取值为hspix,x为SPI的编号,取值为1~3。参数2pTxData:发送数据缓冲区的地址。参数3pRxData:接收数据缓冲区的地址。参数4Size:收发送数据的长度。参数5Timeout:查询等待的最长时间,单位为ms。返回值HAL的状态。【举例】SPI1工作在全双工模式下,用SPI1口将aTxBuf[]中的1字节数据发送出去,同时将外部输入的数据接收到aRxBuf[]中,其程序如下:

HAL_SPI_TransmitReceive(&hspi1,aTxBuf,aRxBuf,1,0xff);实现方法与步骤任务17的硬件电路:

1.搭建电路

2.生成SPI口的初始化代码步骤(1)启动STM32CubeMX,然后新建STM32CubeMX工程、配置SYS、RCC,其中,Debug模式选择SerialWire,HSE选择外部晶振。(2)配置时钟,结果如下图所示,其中APB1外设时钟的频率为36MHz。

2.生成SPI口的初始化代码步骤(3)配置SPI2口第1步:在窗口中点击“Pinout&Configuration”标签,然后在窗口左边的小窗口中点击“Categories”标签,再在配置列表中点击“Connectivity”->“SPI2”列表项,窗口的中间会显示如右图所示的SPI2配置窗口。

2.生成SPI口的初始化代码步骤(3)配置SPI2口第2步:在SPI2的配置窗口中点击Mode下拉列表框,从中选择“TransmitOnlyMaster”(仅主机发送)列表项,Configuration栏中会出现SPI2的一列参数设置项,包括SPI的基本参数、时钟参数等。如右图所示。

2.生成SPI口的初始化代码步骤(3)配置SPI2口第3步:点击“HardwareNSSSignal”下拉列表框,从中选择“Disable”,禁止SPI2口的NSS输出,也就是片选择信号可能用其他引脚控制。第4步:点击“ParameterSettings”标签,然后对SPI2的参数作如右图设置

3.完善SPI通信程序步骤(1)将任务13中的OLED文件夹(D:\ex\task13中)复制到任务17工程文件所在的文件夹中(D:\ex\task17中)。(2)在Keil工程中新建OLED组,并将OLED文件夹中的oled.c文件添加至OLED组中。(3)修改oled.c文件中的代码第1步:在oled.c文件的开头处声明全局变量hspi2,如下图所示。

3.完善SPI通信程序步骤(3)修改oled.c文件中的代码第2步:在OLED_WR_Byte()函数中,注释掉第50行~第59行的软件模拟SPI写数程序,然后添加用硬件SPI2发送数据的代码,如下图所示。(4)在Keil工程的include路径中添加“D:\ex\Task17\OLED”文件夹,该文件夹是oled.h头文件所在的文件夹。

4.编写显示程序步骤(1)按照任务13中所介绍的方法制作本任务中所要显示汉字的字模,即制作“公民的道德规范爱国敬业诚信友善、”等16个中文字符的字模。(2)将16个中文字符的字模添加至font.h文件的Hzk[]数组中。(3)在main.c文件中添加显示公民道德规范的程序,程序代码如下:12345678…#include "oled.h"…intmian(void){…OLED_Init();OLED_ShowCHinese((128-7*16)/2,0,0);//显示编号为0的汉字公

4.编写显示程序main.c文件中的显示程序9101112131415161718192021

OLED_ShowCHinese((128-7*16)/2+1*16,0,1);//显示编号为0的汉字民OLED_ShowCHinese((128-7*16)/2+2*16,0,2);//显示编号为0的汉字的OLED_ShowCHinese((128-7*16)/2+3*16,0,3);//显示编号为0的汉字道OLED_ShowCHinese((128-7*16)/2+4*16,0,4);//显示编号为0的汉字德OLED_ShowCHinese((128-7*16)/2+5*16,0,5);//显示编号为0的汉字规OLED_ShowCHinese((128-7*16)/2+6*16,0,6);//显示编号为0的汉字范

OLED_ShowCHinese((128-5*16)/2,3,7); //显示编号为0的汉字爱OLED_ShowCHinese((128-5*16)/2+1*16,3,8);//显示编号为0的汉字国OLED_ShowCHinese((128-5*16)/2+2*16,3,15);//显示编号为0的汉字、OLED_ShowCHinese((128-5*16)/2+3*16,3,9);//显示编号为0的汉字敬OLED_ShowCHinese((128-5*16)/2+4*16,3,10);//显示编号为0的汉字业

4.编写显示程序main.c文件中的显示程序22…

OLED_ShowCHinese((128-5*16)/2,6,11);//显示编号为0的汉字民OLED_ShowCHinese((128-5*16)/2+1*16,6,12);//显示编号为0的汉字的OLED_ShowCHinese((128-5*16)/2+2*16,6,15);//显示编号为0的汉字道OLED_ShowCHinese((128-5*1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论