找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9999|回复: 4
打印 上一主题 下一主题
收起左侧

使用DMA控制SPI接口的液晶(ILI9341)

[复制链接]
跳转到指定楼层
楼主
ID:90014 发表于 2015-9-14 18:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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的具体驱动略

                                         



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:70915 发表于 2017-8-4 16:16 | 只看该作者
好帖,必须顶!
回复

使用道具 举报

板凳
ID:82098 发表于 2020-3-19 15:17 | 只看该作者
可以发一份完整程序吗?万分感谢!260096@163.com
回复

使用道具 举报

地板
ID:700061 发表于 2021-5-14 16:33 | 只看该作者
发一份完整程序吧,万分感谢!
回复

使用道具 举报

5#
ID:997026 发表于 2022-6-12 12:56 | 只看该作者
如果你的SPI数据长度配置位16位,确实对于LCD颜色数据发送比较方便,但是LCD的指令都是8位的,请问你配置位16位,要怎么发送8位LCD指令?
用标准库函数怎么能解决既能发送8位又能发送16位的问题?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表