打印
[STM32F0]

TFT9342 SPI刷屏

[复制链接]
3909|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,每次刷一次屏都会很明显闪烁一下。
    SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx;
    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
    SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;//SPI_DataSize_8b;
    SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;//sck - h
    SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;//
    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;

    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
    SPI_InitStructure.SPI_CRCPolynomial = 7;
    SPI_Init(TFT_SPI, &SPI_InitStructure);
    //    SPI_RxFIFOThresholdConfig(TFT_SPI, SPI_RxFIFOThreshold_QF);
    SPI_Cmd(TFT_SPI, ENABLE); /* TFT_SPI enable */
uint8_t SPI__SendByte(uint8_t byte)
{
  /* Wait until the transmit buffer is empty */
  while(SPI_I2S_GetFlagStatus(TFT_SPI, SPI_I2S_FLAG_TXE) == RESET)
  {
  }
  /* Send the byte */
  SPI_SendData8(SPI1, byte);
//  while(SPI_I2S_GetFlagStatus(TFT_SPI, SPI_I2S_FLAG_TXE) == RESET)
//  {
//  }
  return 0;
}

刷屏速度慢,还占用时间。所以采用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这么快?

使用特权

评论回复
5
kj101129| | 2016-9-18 15:21 | 只看该作者
楼主是用SPI屏的9BIT模式,好是用8BIT模式+RS脚??

使用特权

评论回复
6
donsbin|  楼主 | 2016-9-18 15:24 | 只看该作者
本帖最后由 donsbin 于 2016-9-18 15:26 编辑
kj101129 发表于 2016-9-18 15:21
楼主是用SPI屏的9BIT模式,好是用8BIT模式+RS脚??

8BIT模式+RS(数据命令),为了提高刷新速率

使用特权

评论回复
7
kj101129| | 2016-9-18 15:26 | 只看该作者
donsbin 发表于 2016-9-18 15:24
8BIT模式+RS(数据命令)

这种模式需要CPU控制RS脚,DMA应该就没有意义了。你问问你的朋友DMA刷屏是怎么实现的吧。应该是9BIT模式

使用特权

评论回复
8
donsbin|  楼主 | 2016-9-18 15:51 | 只看该作者
kj101129 发表于 2016-9-18 15:26
这种模式需要CPU控制RS脚,DMA应该就没有意义了。你问问你的朋友DMA刷屏是怎么实现的吧。应该是9BIT模式 ...

不是的! 写命令我采用硬件SPI(RS = L)。写数据我开启DMA

使用特权

评论回复
9
leeyunqing189| | 2016-9-18 15:52 | 只看该作者
我也觉得SPI DMA没有设置好的原因。

使用特权

评论回复
10
donsbin|  楼主 | 2016-9-18 16:30 | 只看该作者
写数据为半个字,但是写命令又是一个字节。
大部分时间消耗在写数据上,即刷屏部分。
目前提高了频率 >48M,居然可以运行==。估计不稳定

使用特权

评论回复
11
ticomi| | 2016-9-18 16:56 | 只看该作者
用DMA主要是节省CPU资源,至于传输速度还是和SPI的设置有关;如果SPI的传输速度没有设置好,使用DMA根本不能提升传输速度,只是在传输期间不需要使用CPU参与。

所以请看向SPI的设置和选择问题,可以选择SPI挂在快速的那个总线上的试试。

使用特权

评论回复
12
donsbin|  楼主 | 2016-9-18 17:18 | 只看该作者
ticomi 发表于 2016-9-18 16:56
用DMA主要是节省CPU资源,至于传输速度还是和SPI的设置有关;如果SPI的传输速度没有设置好,使用DMA根本不 ...

感谢回复。
事实上,目前我的系统硬件最大只能变频到40M,而SPI时钟最大为 fPCLK/ 2。
这也就是刷屏的瓶颈了。加上DMA需要内存的迁移(也有损耗)
测试时,我直接把PLL配置到90M。刷屏效果还行,当然不稳定性是致命的。

使用特权

评论回复
13
ticomi| | 2016-9-19 08:14 | 只看该作者
donsbin 发表于 2016-9-18 17:18
感谢回复。
事实上,目前我的系统硬件最大只能变频到40M,而SPI时钟最大为 fPCLK/ 2。
这也就是刷屏的瓶颈 ...

如果是这样就局部刷新LCD屏,一次发送的数据少就可以很快完成刷新工作。屏闪的现象一定程度就会缓解。不要超频工作,会带来意外的问题,甚至损坏硬件。

使用特权

评论回复
14
donsbin|  楼主 | 2016-9-19 09:10 | 只看该作者
ticomi 发表于 2016-9-19 08:14
如果是这样就局部刷新LCD屏,一次发送的数据少就可以很快完成刷新工作。屏闪的现象一定程度就会缓解。不 ...

嗯,是的。
最初想法是支持整屏刷,这样应用开发会简单很多。
但就现在的情况,只能在底层做一些机制来弥补开机与菜单跳转时屏闪现象。

使用特权

评论回复
15
Rollo| | 2016-9-20 21:38 | 只看该作者
SPI速率没有设置好的话,使用DMA是不能提升传输速度的

使用特权

评论回复
16
泰山特曲123| | 2016-9-21 09:06 | 只看该作者
首先用示波器或逻辑分析仪确定SPI的时钟是否正确,其次,按照你的计算100ms确认能感觉到一点闪了

使用特权

评论回复
17
Soraka| | 2016-9-21 20:56 | 只看该作者
是不是 DMA没有设置好啊

使用特权

评论回复
18
huangweida| | 2016-9-22 19:00 | 只看该作者
楼主,你好,我跟你也是遇到一样的问题,我是STm32F103C8的,刷1.5寸的屏,很吃力啊,屏幕闪的厉害,也是用spi通讯的,你的解决了么?

使用特权

评论回复
19
donsbin|  楼主 | 2016-9-23 14:40 | 只看该作者
huangweida 发表于 2016-9-22 19:00
楼主,你好,我跟你也是遇到一样的问题,我是STm32F103C8的,刷1.5寸的屏,很吃力啊,屏幕闪的厉害,也是用 ...

F1的可以提高主频,硬件spi分频最小

使用特权

评论回复
20
huangweida| | 2016-9-23 15:25 | 只看该作者
donsbin 发表于 2016-9-23 14:40
F1的可以提高主频,硬件spi分频最小

产品的特殊,不能升主频啊,硬件SPI已经最小分频了,求解,如何搞

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

20

主题

96

帖子

2

粉丝