|
SPI 接口的液晶屏一般来说只有这几根线: SCK 时钟线
MOSI 主出从入
MISO 主入从出
CS 片选
D/C 数据命令选择 (低电平为命令)
RST 液晶屏复位//低电平复位
BL 液晶屏背光
VCC 电压
GND 地
数据线只有MISO 或者MOSI 一根 这和8080接口的16根线比起来 虽然SPI 接口节约引脚 可是速度太慢了,可以看到明显的刷屏过程.即使使用有硬件SPI的MCU也没有办法弥补这样的不足.
但是如果使用带有DMA的MCU的话就不会存在这样的问题 使用DMA传输速度就会明显提高 液晶刷屏的过程也看不到了
STM32F4 系列的DMA---SPI 配置
SPI_InitTypeDefSPI_InitStructure;
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;//ILI9341使用16位 RGB 565的模式 一次就传输16位
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI1,&SPI_InitStructure);
SPI_Cmd(SPI1,ENABLE);
void DMA_Configuration(void)
{
DMA_InitTypeDefDMA_InitStructure;
RCC->AHB1ENR|=RCC_AHB1Periph_DMA2;
DMA_InitStructure.DMA_Channel = DMA_Channel_3; //通道选择SPI1TX
DMA_InitStructure.DMA_PeripheralBaseAddr =(uint32_t)&(SPI1->DR);//DMA外设地址
//DMA_InitStructure.DMA_Memory0BaseAddr = mar;//DMA 存储器0地址
DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;//存储器到外设模式
//DMA_InitStructure.DMA_BufferSize = 7;//数据传输量
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设非增量模式
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable ;//DMA_MemoryInc_Enable;//存储器增量模式
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//外设数据长度:16位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//存储器数据长度:16位
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;// 使用普通模式
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//中等优先级
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;//存储器突发单次传输
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;//外设突发单次传输
DMA_Init(DMA2_Stream5,&DMA_InitStructure);//初始化DMA Stream
//DMA_ClearITPendingBit(DMA2_Stream5,DMA_IT_TCIF7);
//DMA_ITConfig(DMA2_Stream7,DMA_IT_TC,ENABLE);
}
void SPI_DMA_SendByte(uint16_t Byte ,uint32_t Length)
{
DMA_Cmd(DMA2_Stream5,DISABLE);
while(DMA_GetCmdStatus(DMA2_Stream5)==ENABLE);
DMA2_Stream5->M0AR=(uint32_t)&Byte;
DMA2_Stream5->NDTR=Length;
SPI_DMACmd(SPI1,SPI_I2S_DMAReq_Tx,ENABLE);
DMA_Cmd(DMA2_Stream5,ENABLE);
while(DMA_GetFlagStatus(DMA2_Stream5,DMA_FLAG_TCIF5)==RESET);
DMA_ClearFlag(DMA2_Stream5,DMA_FLAG_TCIF5);
}
// ILI9341的具体驱动略
|
|