|
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的具體驅動略
|
|