关于ch32v307,使用DMA+SPI传送大数组时的一个疑问

各位大佬好,在使用DMA+SPI刷新一张图片时遇到一个问题。DMA一次传输的数据长度最大为65535,我一张图片的大小为240*320*16bit,远远大于CNTR的最大值。网上查了下stm32F4XX有双缓冲模式,好像可以解决,ch32v307手册上没有写这个模式,应该是不支持吧。

现在我用的办法,在刷新图片的时候加个while循环每发送一次65534个数据长度,使能一次DMA,同时更新图片数组的地址,循环第三次后,退出while循环。但是刷新出来的图片会有花屏错位的情况,在21ic那边也问了,几位老师给出的方法,也没有解决。

下面是刷新图片的方法。

void LCD_ShowPicture(u16 x,u16 y,u16 length,u16 width,const u8 pic[])
{
    u8 t=1;
    u32 num=length*width*2,num1;
    LCD_Address_Set(x,y,x+length-1,y+width-1);
    LCD_CS_Clr();
    while(t)
    {
        if(num>65534)
        {
            num-=65534;
            num1=65534;
//            t=0;                // 测试只发送一次
        }
        else
        {
            t=0;
            num1=num;
        }
        MYDMA_Config(DMA1_Channel3,(u32)&SPI1->DATAR,(u32)pic,num1);
        SPI_I2S_DMACmd(SPI1,SPI_I2S_DMAReq_Tx,ENABLE);
        MYDMA_Enable(DMA1_Channel3);
        while(DMA_GetFlagStatus(DMA1_FLAG_TC3)==RESET);// 等待通道3传输完成标志
        DMA_ClearFlag(DMA1_FLAG_TC3);//清除通道3传输完成标志
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)==RESET);    // 等待SPI发送缓冲区为空
        while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY)==SET);      // 等待SPI为非BSY
        pic+=num1;
    }
    LCD_CS_Set();
}

刚学这方面的知识,望各位大佬指点下。感谢(*^_^*)

你好,我私信你,你可以留个联系方式。


zdg@wch.cn,可以邮箱具体沟通一下


@Wch_Zdg 您好,已经给您发邮件了。如果需要发送工程文件,可能要到晚上了,现在在外面出差。


只有登录才能回复,可以选择微信账号登录