硬汉嵌入式论坛

 找回密码
 立即注册
查看: 682|回复: 9
收起左侧

有大佬知道SPI加DMA怎么一次性刷240*320或更大的屏幕吗

[复制链接]

1

主题

7

回帖

10

积分

新手上路

积分
10
发表于 2023-6-17 21:53:24 | 显示全部楼层 |阅读模式
DMA一次最多只能传65536次,每次最多16位两个字节,16位颜色的240*320是76,800次,超过了最大次数,分两次发送中间必须要隔一段时间才能成功发送,就算第一次发送的回调函数已经调用了,我在里面把标志位置一,外面用while判断标志位为0就一直等也不行,必须要再隔段时间才可以。。


    unsigned char *p;
    f_LCDSetWindows(0, 0, xLcd.Width, xLcd.Height);
    CS(False);
    ILI9341DC(True);
    g_xDriverSPI.bSPITransFinishingFlag = False;
    p = (unsigned char *)&s_DispBuf[0];
    HAL_SPI_Transmit_DMA(&g_xSPI, p, 120 * 320);
    while (g_xDriverSPI.bSPITransFinishingFlag == False)
    {
        /* code */
    }
    f_Delayms(20);
    g_xDriverSPI.bSPITransFinishingFlag = False;
    p = (unsigned char *)&s_DispBuf[120 * 320];
    HAL_SPI_Transmit_DMA(&g_xSPI, p, 120 * 320);
    while (g_xDriverSPI.bSPITransFinishingFlag == False)
    {
        /* code */
    }
    CS(True);


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106749
QQ
发表于 2023-6-18 08:17:27 | 显示全部楼层
DMA双缓冲方式刷
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2023-6-18 18:47:03 | 显示全部楼层

大佬,可以详细讲讲怎么实现吗。。或者有什么资料吗
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106749
QQ
发表于 2023-6-19 09:18:38 | 显示全部楼层
DMA不是有个双缓冲的API可以调用,改用那个双缓冲API即可,和单缓冲的区别是可以设置两个缓冲地址轮番DMA刷新
回复

使用道具 举报

5

主题

192

回帖

212

积分

高级会员

积分
212
发表于 2023-6-19 15:06:06 | 显示全部楼层
你的SPI屏幕用的是哪个?
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2023-6-20 20:19:51 | 显示全部楼层
eric2013 发表于 2023-6-19 09:18
DMA不是有个双缓冲的API可以调用,改用那个双缓冲API即可,和单缓冲的区别是可以设置两个缓冲地址轮番DMA刷 ...

好的谢谢大佬
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2023-6-20 20:20:17 | 显示全部楼层
旮旯旭 发表于 2023-6-19 15:06
你的SPI屏幕用的是哪个?

驱动是ILI9341
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2023-6-24 20:02:44 | 显示全部楼层
总算调好了,目前总结发现,这个spi屏上电第一次刷屏的时候DMA分两次传输中间要间隔几个毫秒,后续就不需要了,然后每次发送完一半的数据后要等DMA与SPI的状态为READY才能继续发送,即使发送完成的回调函数已经调用了,DMA与SPI的状态也还是BUSY
回复

使用道具 举报

8

主题

43

回帖

67

积分

初级会员

积分
67
发表于 2023-6-25 09:46:46 | 显示全部楼层
请问下楼主,用DMA刷的时候,源地址是自己开的全局变量的数组是吗,那目标地址是哪里呢,ILI9341的显存地址吗?
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2023-6-25 20:59:35 | 显示全部楼层
TRX 发表于 2023-6-25 09:46
请问下楼主,用DMA刷的时候,源地址是自己开的全局变量的数组是吗,那目标地址是哪里呢,ILI9341的显存地址 ...

是的,目标地址是SPI
HAL_StatusTypeDef HAL_SPI_Transmit_DMA(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size)
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-4 02:43 , Processed in 0.188559 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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