学习日记——SPI协议驱动LCD屏(2020.2.10)
SPI理论基础知识• SPI(Serial Peripheral Interface):• 串行外设接口,是 Motorola 公司推出的一 种同步串行接口技术,是一种高速的,全双工,同步的 通信总线。• SPI主要采用四线制:• SS(Slave Select):从设备使能信号,由主设备控 制。;• SCK (Serial Clock):时钟信号线,由主设备发出;• MOSI (Ma...
SPI理论基础知识
• SPI(Serial Peripheral Interface):
• 串行外设接口,是 Motorola 公司推出的一 种同步串行接口技术,是一种高速的,全双工,同步的 通信总线。
• SPI主要采用四线制:
• SS(Slave Select):从设备使能信号,由主设备控 制。;
• SCK (Serial Clock):时钟信号线,由主设备发出;
• MOSI (Master Output Slave Input): 主设备输出 / 从设备输入引脚;
• MISO(Master Input Slave Output): 主设备输入 / 从设备输出引脚。
SPI的优缺点
1、SPI优点
1)支持全双工通信
2) 通信简单
3)数据传输速率快
2、缺点
1)没有指定的流控制,没有应答机制确认是否接收到数据
2)可靠性上有一定的缺陷。
3、特点
1)高速、同步、全双工、非差分、总线式
2)主从机通信模式
SPI的通讯模式
• 通信模式,具体如下:
• Mode0:CPOL=0,CPHA=0
• Mode1:CPOL=0,CPHA=1
• Mode2:CPOL=1,CPHA=0
• Mode3:CPOL=1,CPHA=1
• 时钟极性CPOL是用来配置SCLK的电平出于哪种状态时是空闲态或者有效态,时钟相位CPHA
• 是用来配置数据采样是在第几个边沿:
• CPOL=0,表示当SCLK=0时处于空闲态,所以有效状态就是SCLK处于高电平时
• CPOL=1,表示当SCLK=1时处于空闲态,所以有效状态就是SCLK处于低电平时
• CPHA=0,表示数据采样是在第1个边沿,数据发送在第2个边沿
• CPHA=1,表示数据采样是在第2个边沿,数据发送在第1个边沿
查找开发板上LCD
如图,6为开发板上的LCD,分辨率为240*240
LCD引脚
1)PC3为SPI2_MOSI主出/从入引脚;
2)PB13为SPI2_SCK时钟引脚;
3)PC6为LCD_WR_RS片选引脚;
4)PC7为LCD_RESET复位引脚;
5)PB15为LCD_POWER电源引脚;
6)PA9为UART1发送引脚;
7)P10为UART1接收引脚;
8)PC13为LED引脚。
可根据原理图查找LCD引脚,找到引脚后,在STM32CubeMX上配置引脚
配置引脚
配置系统时钟
采用内部时钟(默认)配置系统时钟最高80MHZ
配置LCD参数
生产LCD工程
1、自定义工程名称。
2、选择英文路径,否则会丢 失启动文件而无法编译通过, 需要手动添加启动文件: startup_stm32l431xx.s
3、选择MDK-ARM V5开发软件, 即KEIL5软件。
代码编写说明
1、初始化SPI硬件和通信协议参数。
2、SPI采用单向方式,也就是只用到三个引脚,即主出/从入,时钟,片选;
3、移植LCD驱动和接口函数;
4、使用LCD接口函数显示英文字符串(也可显示汉字);
5、使用LCD接口函数显示不同字体大小的字符串;
6、使用LCD接口函数画圆。
调用函数:
1、HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t pData, uint16_t Size, uint32_t Timeout);
2、HAL_GPIO_WritePin(GPIO_TypeDef GPIOx, uint16_t GPIO_Pin);//主函数中点亮LED
3、void HAL_Delay(uint32_t Delay);延时函数
移植LCD驱动和接口函数
代码编写实现
LCD_Init();//初始化LCD,该函数中调用的硬件初始化已经屏蔽吊,本教程使用的是CubeMX生成的硬件初始化
while (1)
{
LCD_Clear(BLACK);//清屏为黑色
LCD_ShowString(5, 10, 240, 32, 32, "BearPi LCDTest");//显示字符串,字体大小32*32 LCD_ShowString(10, 50, 240, 16, 16, "Welcome to IoT CluB!");//显示字符串,字体大小16*16
LCD_ShowString(10, 50+24, 240, 24, 24, "to IoT CluB!");//显示字符串,字体大小24*24 LCD_ShowString(10, 50+24+32, 240, 32, 32, "IoT CluB!");//显示字符串,字体大小32*32
HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_SET);//点亮LED灯 HAL_Delay(1000);//延时1秒 LCD_Clear(BLUE);//清屏为蓝色
LCD_Draw_Circle(120, 120, 100);//画圆 半径r=100
LCD_Draw_Circle(120, 120, 80);//画圆 半径r=80
LCD_Draw_Circle(120, 120, 60);//画圆 半径r=60
LCD_Draw_Circle(120, 120, 40);//画圆 半径r=40
LCD_Draw_Circle(120, 120, 20);//画圆 半径r=20
LCD_Draw_Circle(120, 120, 1);//画圆 半径r=1 HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_RESET);//熄灭LED灯 HAL_Delay(1000);//延时1秒
}
效果展示
实验现象
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)