[STM32F0] TFT9342 SPI刷屏

[复制链接]
4631|23
 楼主| donsbin 发表于 2016-9-18 11:39 | 显示全部楼层 |阅读模式
本帖最后由 donsbin 于 2016-9-18 11:44 编辑

目前采用SPI串行通信,F051主频最快也就48M。目前采用硬件SPI.SPI二分频24M,计算下
(1/24000000)*2*8*320*240 = 52ms
感觉我自己刷一次屏至少100ms,每次刷一次屏都会很明显闪烁一下。
  1.     SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx;
  2.     SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  3.     SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;//SPI_DataSize_8b;
  4.     SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;//sck - h
  5.     SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;//
  6.     SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  7.     SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;

  8.     SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  9.     SPI_InitStructure.SPI_CRCPolynomial = 7;
  10.     SPI_Init(TFT_SPI, &SPI_InitStructure);
  11.     //    SPI_RxFIFOThresholdConfig(TFT_SPI, SPI_RxFIFOThreshold_QF);
  12.     SPI_Cmd(TFT_SPI, ENABLE); /* TFT_SPI enable */
  1. uint8_t SPI__SendByte(uint8_t byte)
  2. {
  3.   /* Wait until the transmit buffer is empty */
  4.   while(SPI_I2S_GetFlagStatus(TFT_SPI, SPI_I2S_FLAG_TXE) == RESET)
  5.   {
  6.   }
  7.   /* Send the byte */
  8.   SPI_SendData8(SPI1, byte);
  9. //  while(SPI_I2S_GetFlagStatus(TFT_SPI, SPI_I2S_FLAG_TXE) == RESET)
  10. //  {
  11. //  }
  12.   return 0;
  13. }

刷屏速度慢,还占用时间。所以采用DMA来刷屏,发现刷新速度更慢。
听同行说起,他们用DMA来刷屏(320*480 SPI通信),用的也是F051的片子,刷屏肉眼根本感觉不出来。我不知道怎么实现,求帮忙



mmuuss586 发表于 2016-9-18 11:47 | 显示全部楼层
配置好,SPI和DMA模式;
往DMA里写数据就可以了
 楼主| donsbin 发表于 2016-9-18 12:24 | 显示全部楼层
mmuuss586 发表于 2016-9-18 11:47
配置好,SPI和DMA模式;
往DMA里写数据就可以了

DMA已经配置好了,主要还是刷屏速度太慢!不知道怎么回事
inc_biza 发表于 2016-9-18 13:57 | 显示全部楼层
SPI有24Mhz这么快?
kj101129 发表于 2016-9-18 15:21 | 显示全部楼层
楼主是用SPI屏的9BIT模式,好是用8BIT模式+RS脚??
 楼主| donsbin 发表于 2016-9-18 15:24 | 显示全部楼层
本帖最后由 donsbin 于 2016-9-18 15:26 编辑
kj101129 发表于 2016-9-18 15:21
楼主是用SPI屏的9BIT模式,好是用8BIT模式+RS脚??

8BIT模式+RS(数据命令),为了提高刷新速率
kj101129 发表于 2016-9-18 15:26 | 显示全部楼层
donsbin 发表于 2016-9-18 15:24
8BIT模式+RS(数据命令)

这种模式需要CPU控制RS脚,DMA应该就没有意义了。你问问你的朋友DMA刷屏是怎么实现的吧。应该是9BIT模式
 楼主| donsbin 发表于 2016-9-18 15:51 | 显示全部楼层
kj101129 发表于 2016-9-18 15:26
这种模式需要CPU控制RS脚,DMA应该就没有意义了。你问问你的朋友DMA刷屏是怎么实现的吧。应该是9BIT模式 ...

不是的! 写命令我采用硬件SPI(RS = L)。写数据我开启DMA
leeyunqing189 发表于 2016-9-18 15:52 | 显示全部楼层
我也觉得SPI DMA没有设置好的原因。
 楼主| donsbin 发表于 2016-9-18 16:30 | 显示全部楼层
写数据为半个字,但是写命令又是一个字节。
大部分时间消耗在写数据上,即刷屏部分。
目前提高了频率 >48M,居然可以运行==。估计不稳定
ticomi 发表于 2016-9-18 16:56 | 显示全部楼层
用DMA主要是节省CPU资源,至于传输速度还是和SPI的设置有关;如果SPI的传输速度没有设置好,使用DMA根本不能提升传输速度,只是在传输期间不需要使用CPU参与。

所以请看向SPI的设置和选择问题,可以选择SPI挂在快速的那个总线上的试试。
 楼主| donsbin 发表于 2016-9-18 17:18 | 显示全部楼层
ticomi 发表于 2016-9-18 16:56
用DMA主要是节省CPU资源,至于传输速度还是和SPI的设置有关;如果SPI的传输速度没有设置好,使用DMA根本不 ...

感谢回复。
事实上,目前我的系统硬件最大只能变频到40M,而SPI时钟最大为 fPCLK/ 2。
这也就是刷屏的瓶颈了。加上DMA需要内存的迁移(也有损耗)
测试时,我直接把PLL配置到90M。刷屏效果还行,当然不稳定性是致命的。
ticomi 发表于 2016-9-19 08:14 | 显示全部楼层
donsbin 发表于 2016-9-18 17:18
感谢回复。
事实上,目前我的系统硬件最大只能变频到40M,而SPI时钟最大为 fPCLK/ 2。
这也就是刷屏的瓶颈 ...

如果是这样就局部刷新LCD屏,一次发送的数据少就可以很快完成刷新工作。屏闪的现象一定程度就会缓解。不要超频工作,会带来意外的问题,甚至损坏硬件。
 楼主| donsbin 发表于 2016-9-19 09:10 | 显示全部楼层
ticomi 发表于 2016-9-19 08:14
如果是这样就局部刷新LCD屏,一次发送的数据少就可以很快完成刷新工作。屏闪的现象一定程度就会缓解。不 ...

嗯,是的。
最初想法是支持整屏刷,这样应用开发会简单很多。
但就现在的情况,只能在底层做一些机制来弥补开机与菜单跳转时屏闪现象。
Rollo 发表于 2016-9-20 21:38 | 显示全部楼层
SPI速率没有设置好的话,使用DMA是不能提升传输速度的
泰山特曲123 发表于 2016-9-21 09:06 来自手机 | 显示全部楼层
首先用示波器或逻辑分析仪确定SPI的时钟是否正确,其次,按照你的计算100ms确认能感觉到一点闪了
Soraka 发表于 2016-9-21 20:56 | 显示全部楼层
是不是 DMA没有设置好啊
huangweida 发表于 2016-9-22 19:00 | 显示全部楼层
楼主,你好,我跟你也是遇到一样的问题,我是STm32F103C8的,刷1.5寸的屏,很吃力啊,屏幕闪的厉害,也是用spi通讯的,你的解决了么?
 楼主| donsbin 发表于 2016-9-23 14:40 | 显示全部楼层
huangweida 发表于 2016-9-22 19:00
楼主,你好,我跟你也是遇到一样的问题,我是STm32F103C8的,刷1.5寸的屏,很吃力啊,屏幕闪的厉害,也是用 ...

F1的可以提高主频,硬件spi分频最小
huangweida 发表于 2016-9-23 15:25 | 显示全部楼层
donsbin 发表于 2016-9-23 14:40
F1的可以提高主频,硬件spi分频最小

产品的特殊,不能升主频啊,硬件SPI已经最小分频了,求解,如何搞
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:思亘七险,点落九宫,神游八极,纵横十方。

20

主题

96

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部