找回密码
 立即注册
查看: 39|回复: 6

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

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2025-12-15 07:56:11
已绑定手机

3

主题

202

回帖

347

积分

中级会员

积分
347
发表于 3 天前 | 显示全部楼层 |阅读模式
各位大佬早晨好,请教:
在硬件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[1];

    cmd[0] = data1;                      //给数组赋值

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

    dat[0] = data1;                      //给数组赋值

     LCD_WR_DAT(dat, 1);
}

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


回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2025-12-15 07:56:11
已绑定手机

3

主题

202

回帖

347

积分

中级会员

积分
347
发表于 3 天前 | 显示全部楼层
在AiCube里的设置:

截图202512131246254526.jpg
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2025-12-15 07:56:11
已绑定手机

3

主题

202

回帖

347

积分

中级会员

积分
347
发表于 3 天前 | 显示全部楼层
逻辑分析仪:

截图202512131248339645.jpg
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2025-12-15 07:56:11
已绑定手机

3

主题

202

回帖

347

积分

中级会员

积分
347
发表于 3 天前 | 显示全部楼层
感觉程序没有驱动I/O

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

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

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

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

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


BCG.zip

555.96 KB, 下载次数: 1

回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:266
  • 最近打卡:2025-12-16 08:29:17

812

主题

1万

回帖

2万

积分

管理员

积分
21265
发表于 3 天前 | 显示全部楼层
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:389
  • 最近打卡:2025-12-16 08:53:16
已绑定手机

97

主题

3858

回帖

8340

积分

荣誉版主

无情的代码机器

积分
8340
发表于 3 天前 | 显示全部楼层
初始化函数放错位置了,要先开全局中断,才能使用DMA中断


截图202512131928197368.jpg
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2025-12-15 07:56:11
已绑定手机

3

主题

202

回帖

347

积分

中级会员

积分
347
发表于 昨天 07:56 | 显示全部楼层
erci*** 发表于 2025-12-13 19:28
初始化函数放错位置了,要先开全局中断,才能使用DMA中断

谢谢erci*** 版主大侠,我蒙啦,确实是!
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-12-16 09:38 , Processed in 0.115887 second(s), 77 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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