目的:
加速扫屏速度,软件模拟IO扫屏速度较慢
方法:
一、硬件接线
SPI 四线通讯 ,阔以只接2线 ,SPI_DI(MISO)阔以不接,CS 端接普通IO即可
MCU TFT
SPI-DO(MOSI) 接 SDA
SPI_CLK 接 SCK
屏幕端口:
在这里插入图片描述
说明:
RESET: 液晶屏复位
RS:为数据命令选择端,发送数据拉高,发送命令置低

二、软件配置:
(1)GPIO初始化 :

//P24 CLK  P210  SPI DO
	    GPIO_StructInit(&GPIO_InitStruct);
	    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
      GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
      GPIO_Init(GPIO2, &GPIO_InitStruct);
		 
	  	GPIO_PinAFConfig(GPIO2, GPIO_PinSource_10, AF5_SPI); //GPIO2.10复用SPI_DO功能
	  
			GPIO_StructInit(&GPIO_InitStruct);
			GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;            //设置为输入模式
			GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4;
			GPIO_Init(GPIO2, &GPIO_InitStruct);
			
      GPIO_PinAFConfig(GPIO2, GPIO_PinSource_4, AF5_SPI); //GPIO1.0复用SPI_CLK功能

(2)SPI初始化:

   SPI_InitTypeDef SPI_InitStruct;

    SPI_StructInit(&SPI_InitStruct);              // SPI结构体初始化
	  SPI_InitStruct.Duplex = SPI_Half_Tx;             // 模式设置  仅发送模式
    SPI_InitStruct.Mode = SPI_Master;             //master主机模式
    SPI_InitStruct.EN = ENABLE;                   //使能SPI模块
    SPI_InitStruct.TRANS_MODE = SPI_DMA_DISABLE;   // 选择SPI搬移方式,由MCU搬运数据到SPI
    SPI_InitStruct.Trig = 0;                      //内部自动触发传输
    SPI_InitStruct.ENDIAN = SPI_FIRSTSEND_MSB;   //该字节先发送 LSB
    SPI_InitStruct.CPHA = 1;                      //第一个沿为发送数据时刻
    SPI_InitStruct.CPOL = 1;                      //CLK默认高电平
    SPI_InitStruct.BaudRate = 3;                 //传输速度96MHZ/(2*(31+1))= 1.50MHZ //31 =1.5M   7 =6M   3=12M  
    SPI_InitStruct.ByteLength = 8;                //发送零个字节
    SPI_InitStruct.IRQEna = DISABLE;              //关闭SPI各中断
    SPI_Init(SPI0, &SPI_InitStruct);               //SPI初始化程序

SPI波特率 设置 见芯片技术手册(UM)
在这里插入图片描述
(3)程序调用:
在原LCD软件模拟的发送数据的地方改为SPI发送即可

void LCD_Writ_Bus(u8 dat) 
{
	 LCD_CS_Clr();
	 SPI_SendByte(dat);
	 LCD_CS_Set();	
	/*
	// 软件模拟:
	 u8 i;
	LCD_CS_Clr();
	for(i=0;i<8;i++)
	{			  
		LCD_SCLK_Clr();
		if(dat&0x80)
		{
		   LCD_MOSI_Set();
		}
		else
		{
		   LCD_MOSI_Clr();
		}
		LCD_SCLK_Set();
		dat<<=1;
	}	
	  LCD_CS_Set();	
	*/
	}
 
u8 SPI_SendByte(u8 byte)
{
    u8 rdata = 0;

    SPI0_TX_DATA = byte; //发送数据

    while (!(SPI0_IE & BIT2))
    {
    };                   /*等待传输完成*/
    rdata = SPI0_RX_DATA; //接收数据
    SPI0_IE |= BIT2;      //清除SPI传输完成标志位
    return rdata;        //返回接收数据
}

实验结果:
扫屏速度是有改善的
LCD驱动大家可以网上自行百度,有很多软件模拟的。

更多推荐