YangHY 发表于 2025-12-13 12:45:56

用AiCube来硬件SPI+DMA驱动LCD12864,求救!

各位大佬早晨好,请教:
在硬件SPI+DMA驱动LCD12864(主控IC采用矽创公司ST7567),参考STC论坛的DMA核心代码:
void LCD_SendData(uint8_t *dat, uint16_t len)
{
    lcd_cs1= 0;                        //片选使能

    memcpy(pu8SPIDMATxBuffer, dat, len); //将数据复制到DMA缓冲区

    DMA_SPI_SetAmount(len - 1);         //设置DMA发送字节数
    DMA_SPI_MasterTrigger();            //触发SPI主机DMA
    fSPIDMABusy = 1;                  //设置DMA传输忙标志
}

这里有疑问,假如长度len=1,那么 DMA_SPI_SetAmount(len - 1);         //设置DMA发送字节数 就变成:

DMA_SPI_SetAmount(0);         //设置DMA发送字节数

DMA是不是就不发送字节啦?但是我改成:DMA_SPI_SetAmount(len );         //设置DMA发送字节数

也没用,依旧是没波形!



void LCD_WR_CMD(uint8_t *cmd, uint16_t len)
{
    while (fSPIDMABusy);                //等待上一次传输完成

    lcd_rs= 0;                        //写命令
    LCD_SendData(cmd, len);
}
void LCD_WR_DAT(uint8_t *dat, uint16_t len)
{
    while (fSPIDMABusy);                //等待上一次传输完成

    lcd_rs= 1;                        //写数据
    LCD_SendData(dat, len);
}

接着在我的LCD程序中这样调用:
void transfer_command_lcd(u8 data1)   
{
   u8 cmd;

    cmd = data1;                      //给数组赋值

       LCD_WR_CMD(cmd, 1);
}
void transfer_data_lcd(u8 data1)
{
    u8 dat;

    dat = data1;                      //给数组赋值

   LCD_WR_DAT(dat, 1);
}

编译,链接都OK,但屏幕没反应
软件驱动,或者硬件SPI都OK
有朋友知道是哪里的问题么?清多多指教,谢谢谢谢谢谢!


YangHY 发表于 2025-12-13 12:46:28

在AiCube里的设置:

YangHY 发表于 2025-12-13 12:48:36

逻辑分析仪:

YangHY 发表于 2025-12-13 13:02:25

感觉程序没有驱动I/O

我现在怀疑,使用硬件SPI-DMA实现OLED的底层驱动代码(核心代码),对应的OLED屏幕控制IC:SSD1306

而我现在这块LCD12864的屏幕,主控IC采用矽创公司ST7567,所以我直接用OLED的底层驱动代码(核心代码),是不是有问题?

实际上,我先是把这块屏,从传统8051--STC89C52RC的驱动,改写到Ai8051U 驱动,字库也能正常使用(40MHZ),接着我用STC的AiCube ,

自动生成了硬件SPI框架程序,让后把在Ai8051U 软件驱动正常的程序,嫁接到STC的AiCube ,自动生成了硬件SPI框架程序里,也是正常的

但是进一步,到了DMA就彻底不动了,请大侠指点一下...........


神农鼎 发表于 2025-12-13 18:21:54



SPI-DMA 刷 LCD12864 程序,整屏523us,AI8051U 驱动1.44寸黑白点阵屏,超高帧频 - LCD12864,LCD1602,DMA-M6800并口自动刷屏,CPU不等待,DMA-SPI刷屏 国芯人工智能技术交流网站 - AI32位8051交流社区

ercircle 发表于 2025-12-13 19:28:23

初始化函数放错位置了,要先开全局中断,才能使用DMA中断



YangHY 发表于 2025-12-15 07:56:11

ercircle 发表于 2025-12-13 19:28
初始化函数放错位置了,要先开全局中断,才能使用DMA中断

谢谢erci*** 版主大侠,我蒙啦,确实是!
页: [1]
查看完整版本: 用AiCube来硬件SPI+DMA驱动LCD12864,求救!