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读写字库都没地方了。
建议将xdata的DMA缓冲区初始化一下看看效果,例如写入0,1,2,3... 试验过,应该不是单片机的问题,是外围电路出现稀奇古怪的毛病,正打算删除所有外围电路做块板子再试试。
{:4_232:} 本帖最后由 alanding 于 2023-10-17 10:34 编辑
研究了半个月终于发现原因:这种模组不是HC595做的,因为不需要调节亮度,就把OE一直开着,
这样不行,需要在LAT锁存信号后面再给OE发一个任意宽度脉冲就行了,为啥会搞成这样就不知道了。
中断里加上:
LEDOE = 1;
_nop_();
LEDOE = 0;
保存留个纪念。{:4_259:}
又发现问题:似乎在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行,结果多出一行。
又有空继续研究,这次用纯软件扫描,结果成了楼梯样子,不懂!
ICN2037 是 16 路双缓存恒流输出 LED 驱动,其 驱动 和 595单缓存输出 略有不同, 楼主的错位情况, 明显 是 ICN2037 从第一缓冲区 转存 到 第二缓冲区, 不同步所引起的 (部分转存成功).
ICN2037 请仔细拜读一下, 别想当然的 用 595 那一套,
相信楼主离成功不远了 谢谢指点,用硬件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:}
又做了些试验,错位先不管,用软件扫描是这样的:
用DMA_LCM, 8080模式是这样的:
比正常胖了一倍,前面还以为DMA多发了一个脉冲。
6800模式是这样的:
找出古老的示波器看clk信号:
最后张是软件扫描的,前2张一张对应8080,一张对应6800。
页:
[1]