找回密码
 立即注册
查看: 851|回复: 11

DMA I2C 驱动OLED黑屏 | 已解决

[复制链接]
  • TA的每日心情
    难过
    2023-12-31 20:58
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    2

    主题

    12

    回帖

    70

    积分

    等待验证会员

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


    回复 送花

    使用道具 举报

  • TA的每日心情
    难过
    2023-12-31 20:58
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    2

    主题

    12

    回帖

    70

    积分

    等待验证会员

    积分
    70
     楼主| 发表于 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
    }

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    难过
    2023-12-31 20:58
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    2

    主题

    12

    回帖

    70

    积分

    等待验证会员

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

    使用道具 举报

  • TA的每日心情
    难过
    2023-12-31 20:58
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    2

    主题

    12

    回帖

    70

    积分

    等待验证会员

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

    使用道具 举报

  • TA的每日心情
    难过
    2023-12-31 20:58
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    2

    主题

    12

    回帖

    70

    积分

    等待验证会员

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

    使用道具 举报

    该用户从未签到

    552

    主题

    9541

    回帖

    1万

    积分

    管理员

    积分
    14056
    发表于 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, 下载次数: 21

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    难过
    2023-12-31 20:58
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    2

    主题

    12

    回帖

    70

    积分

    等待验证会员

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

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

    使用道具 举报

  • TA的每日心情
    奋斗
    3 小时前
  • 签到天数: 144 天

    [LV.7]常住居民III

    27

    主题

    1354

    回帖

    4213

    积分

    论坛元老

    积分
    4213
    发表于 2023-12-28 09:27:28 | 显示全部楼层
    nmdpkvs 发表于 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;
    复制代码
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    3 小时前
  • 签到天数: 144 天

    [LV.7]常住居民III

    27

    主题

    1354

    回帖

    4213

    积分

    论坛元老

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

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

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

    使用道具 举报

  • TA的每日心情
    开心
    3 天前
  • 签到天数: 101 天

    [LV.6]常住居民II

    41

    主题

    1016

    回帖

    6973

    积分

    荣誉版主

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

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

    STC32G_IIC_DMA_OLED12864.rar

    941.43 KB, 下载次数: 40

    点评

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

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-20 12:08 , Processed in 0.096957 second(s), 70 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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