找回密码
 立即注册
查看: 2118|回复: 13

DMA I2C 驱动OLED黑屏 | 已解决

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2023-12-31 20:58:55

2

主题

12

回帖

78

积分

等待验证会员

积分
78
发表于 2023-12-27 20:33:22 | 显示全部楼层 |阅读模式
不知道为啥用DMA IIC驱动就会黑屏有哪位写过案例分享一下硬件IIC就没有问题


回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2023-12-31 20:58:55

2

主题

12

回帖

78

积分

等待验证会员

积分
78
发表于 2023-12-27 21:14:42 | 显示全部楼层
void IIC_Write_NByte(uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)
{

    while (I2CMSST & 0x80); // 检查I2C控制器忙碌状态
    DmaTxBuffer[0] = DevAddress;
    memcpy(&DmaTxBuffer[1], pData, Size);
    I2CMSST = 0x00;
    I2CMSCR = 0x09; // set cmd //write_start_combo
    DMA_I2C_CR = 0x01;
    DMA_I2CT_AMT = (uint8_t)Size; // 设置传输总字节数(低8位):Size + 设备地址
    DMA_I2CT_AMTH = 0x00;         // 设置传输总字节数(高8位)
    DMA_I2C_ST1 = (uint8_t)Size;  // 设置需要传输字节数(低8位):Size + 设备地址
    DMA_I2C_ST2 = 0x00;           // 设置需要传输字节数(高8位)
    DMA_I2CT_CR |= 0x40;          // bit7 1:使能 I2CT_DMA, bit6 1:开始 I2CT_DMA
    while (DMA_I2CT_STA & 0x01);                  // DMA忙检测
    DMA_I2CT_STA &= ~0x01; // 清除标志位
    DMA_I2C_CR = 0x00;

}

void DMA_Config(void)
{
    DMA_I2CT_STA = 0x00;
    DMA_I2CT_CFG = 0x00;                                    // bit7 1:Enable Interrupt
    DMA_I2CT_AMT = 0x80;                                    // 设置传输总字节数(低8位):n+1
    DMA_I2CT_AMTH = 0x00;                                   // 设置传输总字节数(高8位):n+1
    DMA_I2CT_TXAH = (uint8_t)((uint16_t)&DmaTxBuffer >> 8); // I2C发送数据存储地址
    DMA_I2CT_TXAL = (uint8_t)((uint16_t)&DmaTxBuffer);
    DMA_I2CT_CR = 0x80; // bit7 1:使能 I2CT_DMA, bit6 1:开始 I2CT_DMA
    DMA_I2C_ST1 = 0x80; // 设置需要传输字节数(低8位):n+1
    DMA_I2C_ST2 = 0x00; // 设置需要传输字节数(高8位):n+1
}

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2023-12-31 20:58:55

2

主题

12

回帖

78

积分

等待验证会员

积分
78
发表于 2023-12-27 21:15:31 | 显示全部楼层
#IIC配置
截图202312272115053706.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2023-12-31 20:58:55

2

主题

12

回帖

78

积分

等待验证会员

积分
78
发表于 2023-12-27 21:16:01 | 显示全部楼层
OLED刷新函数
截图202312272115551776.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2023-12-31 20:58:55

2

主题

12

回帖

78

积分

等待验证会员

积分
78
发表于 2023-12-27 21:17:31 | 显示全部楼层
请大佬们看看是哪里出了问题
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

积分
15613
发表于 2023-12-27 23:27:09 | 显示全部楼层

从正确的程序开始,见 屠龙刀程序包
===从巨人的肩上起飞

www.stcai.com/hxgnsyb

截图202312272328257349.jpg

截图202312272323052547.jpg

截图202312272323364408.jpg

截图202312272324431596.jpg

截图202312272325378783.jpg

graphic_test.gif

手机拍摄屏幕有闪烁现象-实际不闪.mp4

3.1 MB, 下载次数: 96

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2023-12-31 20:58:55

2

主题

12

回帖

78

积分

等待验证会员

积分
78
发表于 2023-12-28 00:29:23 | 显示全部楼层
神*** 发表于 2023-12-27 23:27
从正确的程序开始,见 屠龙刀程序包
===从巨人的肩上起飞

我不需要U8G2我只想要正常的实现DMA IIC驱动OLED
回复 支持 反对

使用道具 举报 送花

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

39

主题

2006

回帖

6841

积分

论坛元老

积分
6841
发表于 2023-12-28 09:27:28 | 显示全部楼层
nmdp*** 发表于 2023-12-28 00:29
我不需要U8G2我只想要正常的实现DMA IIC驱动OLED

不需要U8G2就不用看U8G2代码,跟IIC DMA相关的程序都在"iic.c"文件里面,只要看这里面的程序就可以了。
IIC初始化:
  1. void HAL_I2C_Init()
  2. {
  3.     I2C_S1 =0;   //I2C功能脚选择,00:P1.5,P1.4; 01:P2.5,P2.4; 11:P3.2,P3.3
  4.     I2C_S0 =1;
  5.     I2CCFG = 0xe0;              //使能I2C主机模式
  6.     I2CMSST = 0x00;
  7.     EA = 1;     //打开总中断
  8. }
复制代码

DMA初始化:
  1. void DMA_Config(void)
  2. {
  3. #if(USE_I2C_DMA == 1)
  4.         DMA_I2CT_STA = 0x00;
  5.         DMA_I2CT_CFG = 0x00;        //bit7 1:Enable Interrupt
  6.         DMA_I2CT_AMT = 0x1f;        //设置传输总字节数(低8位):n+1
  7.         DMA_I2CT_AMTH = 0x00;        //设置传输总字节数(高8位):n+1
  8.         DMA_I2CT_TXAH = (u8)((u16)&DmaTxBuffer >> 8);        //I2C发送数据存储地址
  9.         DMA_I2CT_TXAL = (u8)((u16)&DmaTxBuffer);
  10.         DMA_I2CT_CR = 0x80;                //bit7 1:使能 I2CT_DMA, bit6 1:开始 I2CT_DMA
  11. //        DMA_I2CR_STA = 0x00;
  12. //        DMA_I2CR_CFG = 0x80;        //bit7 1:Enable Interrupt
  13. //        DMA_I2CR_AMT = 0x1f;        //设置传输总字节数(低8位):n+1
  14. //        DMA_I2CR_AMTH = 0x00;        //设置传输总字节数(高8位):n+1
  15. //        DMA_I2CR_RXAH = (u8)((u16)&DmaRxBuffer >> 8);        //I2C接收数据存储地址
  16. //        DMA_I2CR_RXAL = (u8)((u16)&DmaRxBuffer);
  17. //        DMA_I2CR_CR = 0x81;                //bit7 1:使能 I2CT_DMA, bit5 1:开始 I2CT_DMA, bit0 1:清除 FIFO
  18.         DMA_I2C_ST1 = 0x1f;                //设置需要传输字节数(低8位):n+1
  19.         DMA_I2C_ST2 = 0x00;                //设置需要传输字节数(高8位):n+1
  20. #endif
  21. }
复制代码

DMA发送数据到IIC接口使用"HAL_I2C_Mem_Write"函数,你可以根据自己需要重新封装发送函数,主要代码:
  1.     DmaTxBuffer[0] = (uint8_t)DevAddress;
  2. //    DmaTxBuffer[1] = (uint8_t)MemAddress;
  3.     memcpy(&DmaTxBuffer[1],pData,Size);    //设置发送数据
  4.     while(I2CMSST & 0x80);    //检查I2C控制器忙碌状态
  5.     I2CMSST = 0x00;
  6.     I2CMSCR = 0x09;             //set cmd
  7.     DMA_I2C_CR = 0x01;
  8.     DMA_I2CT_AMT = Size;            //设置传输总字节数(低8位):Size + 设备地址
  9.     DMA_I2CT_AMTH = 0x00;        //设置传输总字节数(高8位)
  10.     DMA_I2C_ST1 = Size;                    //设置需要传输字节数(低8位):Size + 设备地址
  11.     DMA_I2C_ST2 = 0x00;                //设置需要传输字节数(高8位)
  12.     DMA_I2CT_CR |= 0x40;                //bit7 1:使能 I2CT_DMA, bit6 1:开始 I2CT_DMA
  13.     while((DMA_I2CT_STA & 0x01)==0);  //DMA忙检测
  14.     DMA_I2CT_STA &= ~0x01;  //清除标志位
  15.     DMA_I2C_CR = 0x00;
复制代码
回复 支持 反对

使用道具 举报 送花

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

39

主题

2006

回帖

6841

积分

论坛元老

积分
6841
发表于 2023-12-28 14:21:48 | 显示全部楼层
本帖最后由 乘风飞扬 于 2023-12-29 13:09 编辑

提供一个简单的IIC+DMA驱动OLED屏例程,供参考
截图202312281416225179.jpg

I2C-DMA驱动OLED屏-DMA配置参数.zip (19.25 KB, 下载次数: 118) I2C-DMA驱动OLED屏-I2C配置参数.zip (20.02 KB, 下载次数: 116)
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:135
  • 最近打卡:2024-12-25 10:15:05

47

主题

1350

回帖

8058

积分

荣誉版主

冲哥视频教程和各种开源资料QQ交流群884047237,可群

积分
8058
QQ
发表于 2023-12-28 22:19:30 | 显示全部楼层
来晚了

STC32G_IIC_DMA_OLED12864.rar

941.43 KB, 下载次数: 184

点评

帮单独再发个贴,介绍下功能  详情 回复 发表于 2023-12-29 08:40
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 02:12 , Processed in 0.128991 second(s), 109 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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