最近在学习STM32F7的片上I2C硬件,看到原子哥的OLED模块可以用I2C来驱动,于是就试了下。现在将试验结果与大家分享,目前还没有毕业经历过的项目比较少,只是为了抛砖引玉,有什么不合理的地方,请大家批评指正,谢谢啦!

首先,将模块后面的BS2改为接地,选择I2C模式。

然后,将模块上的DC引脚与地接到一起,也就是I2C的从地址为0111 100最低位为0,还少一位为读写方向位。再将模块上的D1与D2接到一起,即SDAin与SDAout接到一起为一个完整的SDA信号线。

其次,将模块上的RES引脚通过10K电阻接到电源上、通过104电容接到地上,以产生硬件延时省掉一个GPIO引脚。

最后,程序修改如下:

在oled.c文件中编写I2C初始化函数为:

void I2C3_Init()

{

RCC->AHB1ENR |= RCC_AHB1ENR_GPIOHEN;                                        //使能GPIOH时钟

RCC->APB1ENR |= RCC_APB1ENR_I2C3EN;                                                //使能I2C3时钟

GPIOH->MODER |= GPIO_MODER_MODER7_1

| GPIO_MODER_MODER8_1;                                        //PH7/PH8复用功能模式

GPIOH->OTYPER |= GPIO_OTYPER_OT_7

| GPIO_OTYPER_OT_8;                                                //PH7/PH8开漏输出

GPIOH->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR7_1

| GPIO_OSPEEDER_OSPEEDR8_1;                                //PH7/PH8快速50Hz

GPIOH->PUPDR |= GPIO_PUPDR_PUPDR7_0

| GPIO_PUPDR_PUPDR8_0;                                        //PH7/PH8上拉

GPIOH->AFR[0] |= GPIO_AFRL_AFRL7_2;                                                //PH7复用4

GPIOH->AFR[1] |= GPIO_AFRH_AFRH0_2;                                                //PH8复用4

I2C3->TIMINGR = 0x60201E2B;                                                                //I2C时序标准模式100KHz由ST计算工具获得

I2C3->CR1 |= I2C_CR1_PE;                                                                //I2C3外设使能

I2C3->CR2 = 0x78                                                                                //设置从设备地址为0111 100

| I2C_CR2_AUTOEND;                                                        //自动结束

}

将写字节函数修改为:

void OLED_WR_Byte(u8 dat,u8 cmd)

{

u8 temp;

I2C3->CR2 |= (2U<<16);                                                                        //只传送两个字节数据

//| I2C_CR2_START;                                                        //生成起始位

if(cmd == OLED_CMD)

temp = 0x80;

else

temp = 0xC0;

I2C3->CR2 |= I2C_CR2_START;

while((I2C3->ISR & I2C_ISR_TXIS) == 0);                                        //等待数据发送完成

I2C3->TXDR = temp;                                      //写入发送数据

while((I2C3->ISR & I2C_ISR_TXIS) == 0);                                        //等待数据发送完成

I2C3->TXDR = dat;                                            //写入发送数据

}

将OLED初始化函数修改为:

void OLED_Init()

{

I2C3_Init();

OLED_WR_Byte(0xAE,OLED_CMD); //关闭显示

OLED_WR_Byte(0xD5,OLED_CMD); //设置时钟分频因子,震荡频率

OLED_WR_Byte(80,OLED_CMD);   //[3:0],分频因子;[7:4],震荡频率

OLED_WR_Byte(0xA8,OLED_CMD); //设置驱动路数

OLED_WR_Byte(0X3F,OLED_CMD); //默认0X3F(1/64)

OLED_WR_Byte(0xD3,OLED_CMD); //设置显示偏移

OLED_WR_Byte(0X00,OLED_CMD); //默认为0

OLED_WR_Byte(0x40,OLED_CMD); //设置显示开始行 [5:0],行数.

OLED_WR_Byte(0x8D,OLED_CMD); //电荷泵设置

OLED_WR_Byte(0x14,OLED_CMD); //bit2,开启/关闭

OLED_WR_Byte(0x20,OLED_CMD); //设置内存地址模式

OLED_WR_Byte(0x02,OLED_CMD); //[1:0],00,列地址模式;01,行地址模式;10,页地址模式;默认10;

OLED_WR_Byte(0xA1,OLED_CMD); //段重定义设置,bit0:0,0->0;1,0->127;

OLED_WR_Byte(0xC0,OLED_CMD); //设置COM扫描方向;bit3:0,普通模式;1,重定义模式 COM[N-1]->COM0;N:驱动路数

OLED_WR_Byte(0xDA,OLED_CMD); //设置COM硬件引脚配置

OLED_WR_Byte(0x12,OLED_CMD); //[5:4]配置

OLED_WR_Byte(0x81,OLED_CMD); //对比度设置

OLED_WR_Byte(0xEF,OLED_CMD); //1~255;默认0X7F (亮度设置,越大越亮)

OLED_WR_Byte(0xD9,OLED_CMD); //设置预充电周期

OLED_WR_Byte(0xf1,OLED_CMD); //[3:0],PHASE 1;[7:4],PHASE 2;

OLED_WR_Byte(0xDB,OLED_CMD); //设置VCOMH 电压倍率

OLED_WR_Byte(0x30,OLED_CMD); //[6:4] 000,0.65*vcc;001,0.77*vcc;011,0.83*vcc;

OLED_WR_Byte(0xA4,OLED_CMD); //全局显示开启;bit0:1,开启;0,关闭;(白屏/黑屏)

OLED_WR_Byte(0xA6,OLED_CMD); //设置显示方式;bit0:1,反相显示;0,正常显示

OLED_WR_Byte(0xAF,OLED_CMD); //开启显示

OLED_Clear();

}

至此,就可以用两根信号线点亮OLED了。(注:其他部分都保持原子哥程序原样不变即可。)

另外,感谢原子哥为我们提供的精致的开发板和丰富的精品教程,谢谢!

stm32驱动ssd1306配置_STM32F7片上硬件I2C驱动OLED(SSD1306),寄存器配置的。相关推荐

  1. 串口助手驱动_STM32Cube22(补充) | 使用硬件I2C驱动OLED(SSD1306)

    点上方蓝字关注我们 每天都有好玩的东西等着你 本篇详细的记录了如何使用STM32CubeMX配置STM32L431RCT6的硬件I2C外设驱动0.96'OLED屏幕. 1. 准备工作 硬件准备 开发板 ...

  2. MSP430G2553 Launchpad 硬件I2C驱动

    一.USCI I2C 驱动介绍 对于MSP430G2553,硬件I2C由外设USCI(Universal Serial Communication Interface)提供.USCI又分为USCI_A ...

  3. STM32配合cubeMX硬件I2C驱动0.96寸OLED

    目录 一.简单介绍 1.1   OLED 1.2   I2C协议 二.实战 2.1 工程配置 2.2 测试工程 2.3 波形分析 三.驱动OLED 3.1 初始化代码 3.2 清屏函数 3.3 设置坐 ...

  4. 基于阿里平头哥的单片机软、硬件i2C驱动oled

    基于RiskV的阿里平头哥MCU开箱文章之软硬件i2C驱动oled 12864 Risk-V简介 国产单片机及开发环境CDK iic简介 iIC代码移植详细介绍 # stm32 iic: # 向国产单 ...

  5. linux手动连接网络打印机驱动_怎么在Linux上安装打印机驱动

    怎么在Linux上安装打印机驱动(以Ubuntu为例) 通常来说,你不需要手动在Linux上安装硬件驱动.系统会自动检测计算机硬件,然后自动为你安装驱动.但是,对于打印机,情况就不一样了.事实上,Li ...

  6. ​HC32L130/HC32L136华大单片机硬件I2C驱动代码(从机为存储芯片EEPROM(AT24C02,FM24CL64B))​

    由于同事嫌弃模拟I2C速度太慢了 所以想改成硬件I2C 我试过例程的驱动代码 不太行 存储地址也是8位的 所以参考了一些博文 修改了下例程的代码 亲测有效 希望能帮到大家 代码如下 这里用的是I2C0 ...

  7. CC2541硬件I2C驱动SD3078填坑指南

    关于CC2541的硬件I2C TI的hal库已经写好了相关的驱动,不需要自己硬着头皮去看数据手册了,hal_i2c.c文件存放路径是:C:\Texas Instruments\BLE-CC254x-1 ...

  8. Linux驱动开发(十八):I2C驱动

    简介 I2C是我们在单片机开发时时常会用到的通讯接口,用来与一些字符型设备进行通信,比如:陀螺仪.温度传感器等等,同样的在Linux下I2C驱动也是十分重要的.有了操作系统的加持,我们不用像在32上那 ...

  9. pwm一个时间单位_详解STM32的PWM输出及频率和脉宽(占空比)的计算——寄存器配置六步曲!...

    一.stm32的pwm输出引脚是使用的IO口的复用功能. 二.T2~T5这4个通用定时器均可输出4路PWM--CH1~CH4. 三.我们以tim3的CH1路pwm输出为例来进行图文讲解(其它类似),并 ...

最新文章

  1. 让Centos5.6的Firefox支持Java
  2. 阿里热更新android,阿里最新热更新使用采坑记录
  3. 用SERVLET进行用户名和密码验证
  4. 知道了05后的隐藏技能之后,我酸了…​
  5. Chrome 插件开发-桌面通知设置实战演示,设置通知显示、存在时间
  6. 如何使用cmd进入打印机选项_cmd调用设备和打印机
  7. Java:选择排序法
  8. 京东java开发面经_面经|京东技术中台Java开发面经
  9. 华为机试——整理数字字符串
  10. R语言:data.table语句批量生成变量
  11. 计算机室和电子备课室管理制度,电子备课室
  12. 快速理解Java的三种代理模式
  13. go get失败时怎么办(golang.org/x/crypto/md4为例)
  14. linux sed 多个条件,sed多条件匹配
  15. 判断和循环——实战收尾篇1(二分法、抛硬币等)
  16. 计算机太极图怎么设计,怎么用cad2010画太极图
  17. 交付给事业多少,你就能成就多少事业
  18. 大数据技术原理与应用(第三章 分布式文件系统HDFS)
  19. 进程的五种基本状态VS活动就绪静止就绪活动阻塞静止阻塞
  20. iso9001认证机构哪家好

热门文章

  1. 2022考研数学真题参考答案
  2. 深入浅出MyBatis:MyBatis的所有配置
  3. 倍加福NJ50-FP-N-P1电感式传感器
  4. 发现问题——创新的原动力
  5. 文件存取信息(c++)
  6. GloVe 教程之实战入门+python gensim 词向量
  7. 全网多种方式解决The requested resource [/] is not available的错误
  8. 计算机和应用数学博士,中国农业大学理学院 各系介绍 应用数学系
  9. Gradle 完整指南(Android)
  10. Vue + element-ui 背景图片设置