hello藕片 发表于 2023-6-17 21:53:24

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

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);


eric2013 发表于 2023-6-18 08:17:27

DMA双缓冲方式刷

hello藕片 发表于 2023-6-18 18:47:03

eric2013 发表于 2023-6-18 08:17
DMA双缓冲方式刷

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

eric2013 发表于 2023-6-19 09:18:38

DMA不是有个双缓冲的API可以调用,改用那个双缓冲API即可,和单缓冲的区别是可以设置两个缓冲地址轮番DMA刷新

旮旯旭 发表于 2023-6-19 15:06:06

你的SPI屏幕用的是哪个?

hello藕片 发表于 2023-6-20 20:19:51

eric2013 发表于 2023-6-19 09:18
DMA不是有个双缓冲的API可以调用,改用那个双缓冲API即可,和单缓冲的区别是可以设置两个缓冲地址轮番DMA刷 ...

好的谢谢大佬

hello藕片 发表于 2023-6-20 20:20:17

旮旯旭 发表于 2023-6-19 15:06
你的SPI屏幕用的是哪个?

驱动是ILI9341

hello藕片 发表于 2023-6-24 20:02:44

总算调好了,目前总结发现,这个spi屏上电第一次刷屏的时候DMA分两次传输中间要间隔几个毫秒,后续就不需要了,然后每次发送完一半的数据后要等DMA与SPI的状态为READY才能继续发送,即使发送完成的回调函数已经调用了,DMA与SPI的状态也还是BUSY

TRX 发表于 2023-6-25 09:46:46

请问下楼主,用DMA刷的时候,源地址是自己开的全局变量的数组是吗,那目标地址是哪里呢,ILI9341的显存地址吗?

hello藕片 发表于 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)
页: [1]
查看完整版本: 有大佬知道SPI加DMA怎么一次性刷240*320或更大的屏幕吗