找回密码
 立即注册
查看: 853|回复: 9

DMA_LCM遇到难题

[复制链接]
  • TA的每日心情
    慵懒
    2023-12-12 11:44
  • 签到天数: 1 天

    [LV.1]初来乍到

    13

    主题

    38

    回帖

    287

    积分

    中级会员

    积分
    287
    发表于 2023-9-14 14:55:41 | 显示全部楼层 |阅读模式
    用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[2048] _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

    结果显示无比整齐:
    微信图片_20230914111135.bmp

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


    回复 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 08:54
  • 签到天数: 126 天

    [LV.7]常住居民III

    26

    主题

    1276

    回帖

    3971

    积分

    论坛元老

    积分
    3971
    发表于 2023-9-15 10:16:26 | 显示全部楼层
    建议将xdata的DMA缓冲区初始化一下看看效果,例如写入0,1,2,3...
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    慵懒
    2023-12-12 11:44
  • 签到天数: 1 天

    [LV.1]初来乍到

    13

    主题

    38

    回帖

    287

    积分

    中级会员

    积分
    287
     楼主| 发表于 2023-9-22 12:39:53 | 显示全部楼层
    试验过,应该不是单片机的问题,是外围电路出现稀奇古怪的毛病,正打算删除所有外围电路做块板子再试试。
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    慵懒
    2023-12-12 11:44
  • 签到天数: 1 天

    [LV.1]初来乍到

    13

    主题

    38

    回帖

    287

    积分

    中级会员

    积分
    287
     楼主| 发表于 2023-10-17 10:30:55 | 显示全部楼层
    本帖最后由 alanding 于 2023-10-17 10:34 编辑

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




    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    慵懒
    2023-12-12 11:44
  • 签到天数: 1 天

    [LV.1]初来乍到

    13

    主题

    38

    回帖

    287

    积分

    中级会员

    积分
    287
     楼主| 发表于 2023-11-8 15:08:45 | 显示全部楼层
    又发现问题:似乎在6800模式下E信号会发2次,结果变成下面这样:

    微信图片_20231108150004.bmp

    8080模式下正常:
    微信图片_20231108150014.bmp

    初始化如下:
    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行,结果多出一行。

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    慵懒
    2023-12-12 11:44
  • 签到天数: 1 天

    [LV.1]初来乍到

    13

    主题

    38

    回帖

    287

    积分

    中级会员

    积分
    287
     楼主| 发表于 2023-12-14 16:44:24 | 显示全部楼层
    又有空继续研究,这次用纯软件扫描,结果成了楼梯样子,不懂!


    MMM.jpg




    zzz.rar (46.58 KB, 下载次数: 7) Schematic Prints.pdf (76.36 KB, 下载次数: 6)





    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 02:35
  • 签到天数: 132 天

    [LV.7]常住居民III

    37

    主题

    868

    回帖

    3940

    积分

    荣誉版主

    积分
    3940
    发表于 2023-12-14 18:14:17 | 显示全部楼层
    ICN2037 是 16 路双缓存恒流输出 LED 驱动,  其 驱动 和 595单缓存输出 略有不同, 楼主的错位情况, 明显 是 ICN2037 从第一缓冲区 转存 到 第二缓冲区, 不同步所引起的 (部分转存成功).


    ICN2037_16 路双缓存恒流输出 LED 驱动芯片.pdf (750.07 KB, 下载次数: 9)





    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 02:35
  • 签到天数: 132 天

    [LV.7]常住居民III

    37

    主题

    868

    回帖

    3940

    积分

    荣誉版主

    积分
    3940
    发表于 2023-12-14 18:46:56 | 显示全部楼层
    ICN2037 请仔细拜读一下, 别想当然的 用 595 那一套,

    相信楼主离成功不远了
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    慵懒
    2023-12-12 11:44
  • 签到天数: 1 天

    [LV.1]初来乍到

    13

    主题

    38

    回帖

    287

    积分

    中级会员

    积分
    287
     楼主| 发表于 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[MY_FUN_LED_COLOR_X_LIMIT * line + x];                // 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行才能看见,只显示一行的话整个屏是黑的
    截图202312151436161669.jpg

    真看不出时序和这段程序哪里错了。。。



    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    慵懒
    2023-12-12 11:44
  • 签到天数: 1 天

    [LV.1]初来乍到

    13

    主题

    38

    回帖

    287

    积分

    中级会员

    积分
    287
     楼主| 发表于 2024-3-6 11:38:43 | 显示全部楼层
    又做了些试验,错位先不管,用软件扫描是这样的:
    微信图片_20240306111154.jpg

    用DMA_LCM, 8080模式是这样的:
    微信图片_20240306111239.jpg

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

    找出古老的示波器看clk信号:
    微信图片_20240306111222.jpg
    微信图片_20240306111246.jpg
    微信图片_20240306111214.jpg

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

    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-4-29 01:52 , Processed in 0.071450 second(s), 67 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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