alanding 发表于 2023-9-14 14:55:41

DMA_LCM遇到难题

用STC32G128K的DMA_LCM功能做了个16扫LED模组控制板,结果显示始终错误。
这是初始化:



        line = 0;
        LCMIFCFG = 0x01;
        LCMIFCFG2 = 0x00;
        LCMIFCR = 0x85;
        LCMIFSTA = 0;

        DMA_LCM_CFG = 0x80;
        DMA_LCM_TXAL = 0x00;
        DMA_LCM_TXAH = 0x00;
        DMA_LCM_AMT = 0x7f;
        DMA_LCM_AMTH = 0x00;
        DMA_LCM_STA = 0x00;
        DMA_LCM_CR = 0xa0;
中断程序:

unsigned char volatile edata line;
unsigned char volatile xdata led _at_ 0;
void my_fun_interrupt_dma_lcm(void) interrupt 58
{
        register unsigned int t;

        LEDF2 = 1;                                                                                // LAT
        my_fun_public_delay();                                                        // 极小延时
        LEDF2 = 0;
        line++;
        line &= 0x0f;
        P0 = line;
        t = 128 * line;
        DMA_LCM_STA = 0x00;
        DMA_LCM_AMTH = 0x00;
        DMA_LCM_AMT = 128 - 1;
        DMA_LCM_TXAL = t % 256;
        DMA_LCM_TXAH = t / 256;
        DMA_LCM_CR = 0xa0;
}

XDATA区域没有经过初始化,理论上应该显示RAM的随机数,直接读取如下:

B3D6C1CE914A75248420371BEB72B1D09AA928A947E2790A252DA00AEA8C5D0E

结果显示无比整齐:


请教程序哪里有错?
顺表吐槽下XDATA太小了,只能接8块模组,而且用DMA_SPI读写字库都没地方了。


乘风飞扬 发表于 2023-9-15 10:16:26

建议将xdata的DMA缓冲区初始化一下看看效果,例如写入0,1,2,3...

alanding 发表于 2023-9-22 12:39:53

试验过,应该不是单片机的问题,是外围电路出现稀奇古怪的毛病,正打算删除所有外围电路做块板子再试试。
{:4_232:}

alanding 发表于 2023-10-17 10:30:55

本帖最后由 alanding 于 2023-10-17 10:34 编辑

研究了半个月终于发现原因:这种模组不是HC595做的,因为不需要调节亮度,就把OE一直开着,
这样不行,需要在LAT锁存信号后面再给OE发一个任意宽度脉冲就行了,为啥会搞成这样就不知道了。
中断里加上:
LEDOE = 1;
_nop_();
LEDOE = 0;
保存留个纪念。{:4_259:}






alanding 发表于 2023-11-8 15:08:45

又发现问题:似乎在6800模式下E信号会发2次,结果变成下面这样:



8080模式下正常:


初始化如下:
MY_FUN_LED_COLOR_X_LIMIT = 64


        for (i = (MY_FUN_LED_COLOR_X_LIMIT *0); i< (MY_FUN_LED_COLOR_X_LIMIT *1); i++) led = 0x77;
        for (i = (MY_FUN_LED_COLOR_X_LIMIT *1); i< (MY_FUN_LED_COLOR_X_LIMIT *4); i++) led = 0x21;
        for (i = (MY_FUN_LED_COLOR_X_LIMIT *4); i< (MY_FUN_LED_COLOR_X_LIMIT *8); i++) led = 0x43;
        for (i = (MY_FUN_LED_COLOR_X_LIMIT *8); i< (MY_FUN_LED_COLOR_X_LIMIT * 16); i++) led = 0x65;

应该白色在第1行和第17行,结果多出一行。

alanding 发表于 2023-12-14 16:44:24

又有空继续研究,这次用纯软件扫描,结果成了楼梯样子,不懂!













LAOXU 发表于 2023-12-14 18:14:17

ICN2037 是 16 路双缓存恒流输出 LED 驱动,其 驱动 和 595单缓存输出 略有不同, 楼主的错位情况, 明显 是 ICN2037 从第一缓冲区 转存 到 第二缓冲区, 不同步所引起的 (部分转存成功).








LAOXU 发表于 2023-12-14 18:46:56

ICN2037 请仔细拜读一下, 别想当然的 用 595 那一套,

相信楼主离成功不远了

alanding 发表于 2023-12-15 14:41:50

谢谢指点,用硬件DMA_LCM失败,这次用软件模拟发送,肯定某处有一点点错误,始终想不到哪里有问题,先把软件的搞清楚了再去研究DMA的




void refresh(void)
{
        register unsigned char x;

        line++;
//        line = 0;
        line &= 0x0f;
        P0 = line;
        for(x = 0; x < MY_FUN_LED_COLOR_X_LIMIT; x++)
        {
                P2 = led;                // Data
//                P2 = 0x72;                                                                                        // Data
                LEDCLK = 1;
                _nop_();
                LEDCLK = 0;
        }
        my_fun_public_delay();                                                        // 极小延时
        LEDLAT = 1;                                                                                // LAT
        my_fun_public_delay();                                                        // 极小延时
        LEDLAT = 0;                                                                                // LAT
        my_fun_public_delay();                                                        // 极小延时
        LEDOE = 1;                                                                                // OE
        my_fun_public_delay();                                                        // 极小延时
        LEDOE = 0;                                                                                // OE
}



这段程序必须最少有2行才能看见,只显示一行的话整个屏是黑的


真看不出时序和这段程序哪里错了。。。
{:4_248:}


alanding 发表于 2024-3-6 11:38:43

又做了些试验,错位先不管,用软件扫描是这样的:


用DMA_LCM, 8080模式是这样的:


比正常胖了一倍,前面还以为DMA多发了一个脉冲。
6800模式是这样的:


找出古老的示波器看clk信号:




最后张是软件扫描的,前2张一张对应8080,一张对应6800。

页: [1]
查看完整版本: DMA_LCM遇到难题