0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【南京中科微CSM32RV20开发板试用体验】模拟IIC和硬件IIC的使用点亮0.96OLED屏幕+温湿度读取显示

开发板试用精选 来源:开发板试用 作者:电子发烧友论坛 2022-11-30 10:59 次阅读
本文来源电子发烧友社区,作者:少年阿炳, 帖子地址:https://bbs.elecfans.com/jishu_2246563_1_1.html

本次内容包括
1.使用模拟IIC点亮OLED屏幕,并读取DHT11的温湿度显示在OLED屏上
2.硬件IIC非中断的使用

首先是模拟IIC的使用
模拟IIC就是使用单片机控制IO口输出高低电平模拟实际IIC开始,结束,数据发送等的相应规则达到点亮OLED的目的。所以最重要的就是如何配置IO口已经输出高低电平。
将需要的IO口配置成输出模式


  1. GPIO_PULL_Init(GPIOA,PIN7,GPIO_PULLUP);
  2. GPIO_MODE_Init(GPIOA,PIN7,GPIO_MODE_OUTPUT); //SDAGPIO 模式
  3. GPIO_MODE_Init(GPIOA,PIN5,GPIO_MODE_OUTPUT); // SCL GPIO 模式
  4. GPIO_PULL_Init(GPIOA,PIN5,GPIO_PULLUP);
复制代码

使用GPIO_Write()函数输出高/低电平


  1. //#define OLED_SCLK_Set() GPIO_Write(GPIOA,PIN5,GPIO_SET)//PA5(SCL)输出高
  2. //#define OLED_SCLK_Clr() GPIO_Write(GPIOA,PIN5,GPIO_RESET) //PA5(SCL)输出低
  3. //#define OLED_SDIN_Set() GPIO_Write(GPIOA,PIN7,GPIO_SET) //PA7(SDA)输出高
  4. //#define OLED_SDIN_Clr() GPIO_Write(GPIOA,PIN7,GPIO_RESET) //PA7(SDA)输出高
  5. //#define OLED_READ_SDIN() GPIO_Read(GPIOA, PIN7) //读取PA7(SDA)电平
复制代码


之后就是模拟开始信号,结束信号,响应信号,数据发送,命令发送等。我这里是将现成可用的STM32代码移植过来,然后做了对应的修改。详细可以查看附件1.
特别说明:我这里的响应信号也是模拟的,并不是真读取OLED的返回。

DHT11温湿度的读取
DHT11的数据是通过单总线实现的。数据读取信号以及返回的温湿度值都是通过一根数据线完成,因此需要对同一个IO口先进行输出配置,然后进行输入配置。


  1. // DTH11---> PB6
  2. // 输出模式
  3. void DHT11_OUT(void)
  4. {
  5. GPIO_MODE_Init(GPIOB,PIN6,GPIO_MODE_OUTPUT); //GPIO 模式
  6. GPIO_PULL_Init(GPIOB,PIN6,GPIO_PULLUP); //GPIO 上拉//PB6
  7. }
  8. // 输入模式
  9. void DHT11_IN(void)
  10. {
  11. GPIO_MODE_Init(GPIOB,PIN6,GPIO_MODE_INPUT); //GPIO 模式
  12. GPIO_PULL_Init(GPIOB,PIN6,GPIO_PULLUP); //GPIO
  13. }
复制代码



硬件IIC使用的注意事项
在用模拟IIC点亮OLED后,我寻思着使用以下CSM32自带的硬件IIC点亮OLED,
使用的是非中断模式,启动硬件IIC使用的I2C_Init_case1()函数。


  1. void I2C_Init_case1(void)//非中断模式
  2. {
  3. GPIO_MODE_Init(GPIOA, PIN7,GPIO_MODE_AF);
  4. GPIO_MODE_Init(GPIOA, PIN8,GPIO_MODE_AF);
  5. GPIO_AF_Init(GPIOA,PIN7,GPIO_AF0); //SCL
  6. GPIO_AF_Init(GPIOA,PIN8,GPIO_AF0); //SDA
  7. GPIO_PULL_Init(GPIOA, PIN7,GPIO_PULLUP);
  8. GPIO_PULL_Init(GPIOA, PIN8,GPIO_PULLUP);
  9. I2C->CTRL =1<<12    //时钟分频:0-不分频,1-2分频
  10. |0<<9     //error中断:0-关闭,1-开启
  11. |0<<8     //ready中断:0-关闭,1-开启
  12. |0<<7     //时钟频率:0-100K,1-400K
  13. |0x3C; //从机地址
  14. }
复制代码


特别说明一下从机地址的配置形式,因为此线使用模式IIC时从机地址都是0x78,所以到了硬件IIC,我想当然配置成了0x78,这样是错误的。
从机地址的bit0位需要根据READ或者WRITE分别配置成1/0
一开始我将地址配置成0x78后,通过逻辑分析仪读取到的SDA变成了0xF0(11110000),也就是0x78(01111000)左移了一位,也就是说CSM32的硬件IIC将我的地址左移了一位,然后在bit0插入了一位0。所以在初始化配置时,需要将从机地址配置成0x3C,这样才能确保从机地址正确。
之后通过I2C_Write函数写数据。


  1. void I2C_Write(uint8_t addr,uint8_t data)//适用于非中断模式
  2. {
  3. uint32_t i2c_rw_en = 0x0<<16; //i2c操作:0-写操作,1-读操作
  4. uint32_t i2c_addr = addr<<8;  //存储单元地址
  5. uint32_t i2c_rwdata = data; //数据
  6. I2C->STATUS1 = 0; //清除状态标志
  7. I2C->DATA = i2c_addr|i2c_rw_en|i2c_rwdata;//写数据
  8. while(!(I2C->STATUS1&0x01));
  9. I2C->STATUS1 = 0;
  10. }
复制代码

I2C_Write(uint8_t addr,uint8_t data)

addr参数,实际代表的是数据命令,对应的就是模拟IIC发送时,中间的那位数据,
0x00,写入命令。0x40,写入数据。


  1. void OLED_Write_IIC_Command(u8 IIC_Command)
  2. {
  3. I2C_Write(0x00,IIC_Command);
  4. }
  5. /**********************************************
  6. // IIC Write Data
  7. **********************************************/
  8. void OLED_Write_IIC_Data(u8 IIC_Data)
  9. {
  10. I2C_Write(0x40,IIC_Data);
  11. }
复制代码

完成以上修改后,就能将之前模拟IIC修改为硬件IIC。

下面图片中逻辑分析仪的时序图供大家参考,截图框内是错误配置的从机地址。
因为我使用的逻辑分析仪就20几块,显示的从机地址好像不正确,但是波形还是准确的。




3.jpg

2.jpg

40c93b9a48e41c95584ee2fb4f59c3435b492d03.jpg

硬件IIC.rar(源代码下载

模拟IIC+DHT11.rar(源代码下载)


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 南京中科微
    +关注

    关注

    0

    文章

    60

    浏览量

    747
  • CSM32RV20
    +关注

    关注

    0

    文章

    40

    浏览量

    220
收藏 人收藏

    评论

    相关推荐

    【敏矽ME32G070开发板免费体验】开箱+点灯+点亮OLED

    ME32G070 支持硬件 I2C,这里偷个懒,不想使用繁琐的跳线,直接在开发板上随意插入 OLED 显示屏的引脚,如下: 直接插上 OLED
    发表于 12-19 00:25

    基于CW32模块的SHT30温湿度传感器设计

    我们的目标是将例程移植至CW32F030C8T6开发板上【测量温湿度的功能】。首先要获取资料,查看数据手册应如何实现读取数据,再移植至我们的工程。
    的头像 发表于 11-12 11:14 295次阅读
    基于CW32模块的SHT30<b class='flag-5'>温湿度</b>传感器设计

    【RA-Eco-RA2E1-48PIN-V1.0开发板试用IIC 通信的 OLED 显示

    【RA-Eco-RA2E1-48PIN-V1.0开发板试用IIC 通信的 OLED 显示 简介 IIC
    发表于 11-07 02:30

    关于Air780E:使用文件系统存储温湿度数据怎么操作?

    ​伙伴们,今天我们来学习合宙低功耗4G模组Air780E快速入门之使用文件系统存储温湿度数据。 一、 编写脚本 1.1 硬件及资料准备 780E开发板 LuatOS-Air780E-文件系统
    的头像 发表于 10-31 07:26 159次阅读
    关于Air780E:使用文件系统存储<b class='flag-5'>温湿度</b>数据怎么操作?

    【RA-Eco-RA0E1-32PIN-V1.0开发板试用】sht30温湿度传感器

    这一章节,继续探究RA0E1的硬件iic外设。来驱动SHT30温湿度传感器,该款温湿度传感器具有高精度稳定性,可以精确到0.125度的分辨率,特别适合用来做环境的监测。
    发表于 10-14 23:40

    【BearPi-Pico H3863星闪开发板体验连载】GPIO 控制与 IIC OLED 显示

    杜邦线连接开发板OLED 显示屏,接线方式如下 TXD -----> SDA ​ RXD -----> SCL ​ 3V3 ------> VCC ​ GND -----> GND
    发表于 10-03 12:47

    Arduino Nano 和 NodeMCU ESP8266 读取 DHT11 环境温湿度数据及 OLED显示

    Arduino Nano 和 NodeMCU ESP8266 读取 DHT11 环境温湿度数据及 OLED显示
    的头像 发表于 08-13 18:04 1169次阅读
    Arduino Nano 和 NodeMCU ESP8266 <b class='flag-5'>读取</b> DHT11 环境<b class='flag-5'>温湿度</b>数据及 <b class='flag-5'>OLED</b><b class='flag-5'>显示</b>

    求助,请问ESP32-S2-DevKitM-1开发板IIC引脚是哪些?

    购买的ESP32-S2-DevKitM-1,说是有两路IIC,可是到处找的资料,都没说是哪些引脚,使用Arduino里的Adafruit_SSD1306或者U8g2库对0.96OLED
    发表于 07-01 07:03

    【GD32F303红枫派开发板使用手册】第二十二讲 IIC-IIC OLED显示实验

    通过本实验主要学习以下内容: •OLED驱动原理 •IIC驱动OLED显示操作 22.2 实验原理 OLED模块的驱动芯片为SSD1306,
    的头像 发表于 06-22 09:59 682次阅读
    【GD32F303红枫派<b class='flag-5'>开发板</b>使用手册】第二十二讲  <b class='flag-5'>IIC-IIC</b> <b class='flag-5'>OLED</b><b class='flag-5'>显示</b>实验

    如何用stm32实现将IIC温湿度传感线采集到的数据转发到485的设备。

    各位前辈,小弟刚毕业。公司要求实现这么一个项目,把iic协议的sht30温湿度传感器线采集到的数据转在485通讯的显示屏上打印出来,小弟毫无头绪,网上资料不多,望指点。
    发表于 06-21 09:40

    项目分享|基于ELF 1开发板的MQTT远程温湿度监测系统

    今天非常荣幸向各位小伙伴详细展示一个由共创社成员完成的MQTT远程温湿度监控系统项目。该项目借助ELF1开发板作为核心技术支撑,成功实现了对各类环境空间中温湿度数据的实时、远程、稳定监测。该系统不仅
    的头像 发表于 04-26 09:54 501次阅读
    项目分享|基于ELF 1<b class='flag-5'>开发板</b>的MQTT远程<b class='flag-5'>温湿度</b>监测系统

    基于51单片机的SHT11温湿度监测系统,LCD1602显示,上下限按键设置

    LCD1602显示模块实时显示温湿度数据,同时可以通过按键模块对温湿度报警上、下限值进行设定。 当SHT11读取
    发表于 03-26 17:44

    stm32f407vet6驱动0.96oled显示屏无法显示怎么解决?

    stm32f407vet6驱动0.96oled——iic协议代码无报错时钟正确显示屏无法显示
    发表于 03-14 06:49

    【原创】DHT11传感器温湿度监测系统毕设,论文、代码、原理图和仿真介绍

    使用。但从成本考虑,DHT11价格便宜,其应用更为广泛。 系统概述 本文设计了一种基于51单片机和DHT11传感器的温湿度监测系统,能够实现对当前环境温湿度数据的采集、处理、显示和报警等功能。 系统
    发表于 03-13 00:53

    【外设移植】0.96IIC单色屏+Ai-M61开发板

    本作品由安信可社区用户 沈夜 制作   01外设介绍 先来介绍下0.96OLED显示屏(驱动芯片:SSD1306 / SSD1315) [color=rgba(0, 0, 0, 0.87
    的头像 发表于 02-26 09:54 2525次阅读
    【外设移植】<b class='flag-5'>0.96</b>寸<b class='flag-5'>IIC</b>单色屏+Ai-M61<b class='flag-5'>开发板</b>