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

DMA_LCM遇到难题

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2023-12-12 11:44:58

14

主题

39

回帖

304

积分

中级会员

积分
304
发表于 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读写字库都没地方了。


回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6841

积分

论坛元老

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

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2023-12-12 11:44:58

14

主题

39

回帖

304

积分

中级会员

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

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2023-12-12 11:44:58

14

主题

39

回帖

304

积分

中级会员

积分
304
发表于 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




回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2023-12-12 11:44:58

14

主题

39

回帖

304

积分

中级会员

积分
304
发表于 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行,结果多出一行。

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2023-12-12 11:44:58

14

主题

39

回帖

304

积分

中级会员

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


MMM.jpg




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





回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:312
  • 最近打卡:2025-03-11 13:20:13

54

主题

1327

回帖

5395

积分

荣誉版主

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


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





回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:312
  • 最近打卡:2025-03-11 13:20:13

54

主题

1327

回帖

5395

积分

荣誉版主

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

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

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2023-12-12 11:44:58

14

主题

39

回帖

304

积分

中级会员

积分
304
发表于 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

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



回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2023-12-12 11:44:58

14

主题

39

回帖

304

积分

中级会员

积分
304
发表于 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, 2025-5-2 03:33 , Processed in 0.137193 second(s), 108 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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