针对上篇文章对于程序可移植性不强的问题进行优化,基本思路是首先搭建好IIC底层驱动程序,该程序可用于任何IIC通讯设备,然后针对不同的IIC设备单独编写应用程序,本篇文章仍以SHT30为例。
一、IIC底层驱动之myiic.h

#ifndef __MYIIC_H
#define __MYIIC_H
#include "sys.h"//IO方向设置
#define SDA_IN()  {GPIOC->CRH&=0XFFFF0FFF;GPIOC->CRH|=8<<12;}
#define SDA_OUT() {GPIOC->CRH&=0XFFFF0FFF;GPIOC->CRH|=3<<12;}//IO操作函数
#define IIC_SCL    PCout(12) //SCL
#define IIC_SDA    PCout(11) //SDA
#define READ_SDA   PCin(11)  //输入SDA //IIC所有操作函数
void IIC_Init(void);                //初始化IIC的IO口
void IIC_Start(void);               //发送IIC开始信号
void IIC_Stop(void);                //发送IIC停止信号
void IIC_Send_Byte(u8 txd);         //IIC发送一个字节
u8 IIC_Read_Byte(unsigned char ack);//IIC读取一个字节
u8 IIC_Wait_Ack(void);              //IIC等待ACK信号
void IIC_Ack(void);                 //IIC发送ACK信号
void IIC_NAck(void);                //IIC不发送ACK信号void IIC_Write_One_Byte(u8 daddr,u8 addr,u8 data);
u8 IIC_Read_One_Byte(u8 daddr,u8 addr);   #endif

二、IIC底层驱动之myiic.c

#include "myiic.h"
#include "delay.h"//初始化IIC
void IIC_Init(void)
{                        GPIO_InitTypeDef GPIO_InitStructure;//RCC->APB2ENR|=1<<4;//先使能外设IO PORTC时钟 RCC_APB2PeriphClockCmd(   RCC_APB2Periph_GPIOC, ENABLE ); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12|GPIO_Pin_11;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOC, &GPIO_InitStructure);IIC_SCL=1;IIC_SDA=1;}
//产生IIC起始信号
void IIC_Start(void)
{SDA_OUT();     //sda线输出IIC_SDA=1;       IIC_SCL=1;delay_us(4);IIC_SDA=0;//START:when CLK is high,DATA change form high to low delay_us(4);IIC_SCL=0;//钳住I2C总线,准备发送或接收数据
}
//产生IIC停止信号
void IIC_Stop(void)
{SDA_OUT();//sda线输出IIC_SCL=0;IIC_SDA=0;//STOP:when CLK is high DATA change form low to highdelay_us(4);IIC_SCL=1; IIC_SDA=1;//发送I2C总线结束信号delay_us(4);
}
//等待应答信号到来
//返回值:1,接收应答失败
//        0,接收应答成功
u8 IIC_Wait_Ack(void)
{u8 ucErrTime=0;SDA_IN();      //SDA设置为输入  IIC_SDA=1;delay_us(1);    IIC_SCL=1;delay_us(1);   while(READ_SDA){ucErrTime++;if(ucErrTime>250){IIC_Stop();return 1;}}IIC_SCL=0;//时钟输出0       return 0;
}
//产生ACK应答
void IIC_Ack(void)
{IIC_SCL=0;SDA_OUT();IIC_SDA=0;delay_us(2);IIC_SCL=1;delay_us(2);IIC_SCL=0;
}
//不产生ACK应答
void IIC_NAck(void)
{IIC_SCL=0;SDA_OUT();IIC_SDA=1;delay_us(2);IIC_SCL=1;delay_us(2);IIC_SCL=0;
}
//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答
void IIC_Send_Byte(u8 txd)
{                        u8 t;   SDA_OUT();         IIC_SCL=0;//拉低时钟开始数据传输for(t=0;t<8;t++){              IIC_SDA=(txd&0x80)>>7;txd<<=1;      delay_us(2);   //对TEA5767这三个延时都是必须的IIC_SCL=1;delay_us(2); IIC_SCL=0;    delay_us(2);}
}
//读1个字节,ack=1时,发送ACK,ack=0,发送nACK
u8 IIC_Read_Byte(unsigned char ack)
{unsigned char i,receive=0;SDA_IN();//SDA设置为输入for(i=0;i<8;i++ ){IIC_SCL=0; delay_us(2);IIC_SCL=1;receive<<=1;if(READ_SDA)receive++;   delay_us(1); }                   if (!ack)IIC_NAck();//发送nACKelseIIC_Ack(); //发送ACK   return receive;
}

三、IIC设备之SHT30.H

#ifndef SHT30_H
#define SHT30_H
#include "delay.h"
#include "sys.h"
#include "stdio.h"
#include "usart.h"
#include "string.h"extern u8 humiture_buff1[20];
void SHT30_read_result(u8 addr);#endif

四、IIC设备之SHT30.c

#include "SHT30.h"
#include "myiic.h"#define write 0
#define read  1float humiture[4];
u8 humiture_buff1[20];/*******************************************************************温湿度获取函数
函数原型: SHT30_read_result(u8 addr);
功能: 用来接收从器件采集并合成温湿度
********************************************************************/
void SHT30_read_result(u8 addr)
{u16 tem,hum;u16 buff[6];float Temperature=0;float Humidity=0;IIC_Start();IIC_Send_Byte(addr<<1 | write);//写7位I2C设备地址加0作为写取位,1为读取位IIC_Wait_Ack();IIC_Send_Byte(0x2C);IIC_Wait_Ack();IIC_Send_Byte(0x06);IIC_Wait_Ack();IIC_Stop();delay_ms(50);IIC_Start();IIC_Send_Byte(addr<<1 | read);//写7位I2C设备地址加0作为写取位,1为读取位if(IIC_Wait_Ack()==0){buff[0]=IIC_Read_Byte(1);buff[1]=IIC_Read_Byte(1);buff[2]=IIC_Read_Byte(1);buff[3]=IIC_Read_Byte(1);buff[4]=IIC_Read_Byte(1);buff[5]=IIC_Read_Byte(0);IIC_NAck();IIC_Stop();}tem = ((buff[0]<<8) | buff[1]);//温度拼接hum = ((buff[3]<<8) | buff[4]);//湿度拼接/*转换实际温度*/Temperature= (175.0*(float)tem/65535.0-45.0) ;// T = -45 + 175 * tem / (2^16-1)Humidity= (100.0*(float)hum/65535.0);// RH = hum*100 / (2^16-1)if((Temperature>=-20)&&(Temperature<=125)&&(Humidity>=0)&&(Humidity<=100))//过滤错误数据{//      humiture[0]=Temperature;
//      humiture[2]=Humidity;sprintf(humiture_buff1,"%6.2f*C %6.2f%%",Temperature,Humidity);//111.01*C 100.01%(保留2位小数)}printf("温湿度:%s\n",humiture_buff1);hum=0;tem=0;
}

五、主函数之main.c

#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "myiic.h"
#include "SHT30.h"int main(void){ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2delay_init();            //延时函数初始化   uart_init(9600);       //串口初始化为9600IIC_Init();while(1){SHT30_read_result(0x44);}
}

六、串口显示实验结果

七、对你有帮助的朋友请一键三连,感谢~

STM32之IIC通讯升级版--SHT30温湿度读取相关推荐

  1. IIC协议之SHT30温湿度采样

    IIC协议之SHT30温湿度采样 1.IIC协议介绍 1.1 协议简介 1.2 SHT30设备地址 2.协议时序 2.1 IIC通信时序图 2.2 起始信号 2.3 结束信号 2.4 应答信号 2.5 ...

  2. STM32之IIC通讯-SHT30温湿度采集

    一.实验目的:通过单片机普通IO口,模拟IIC时序,掌握IIC通讯协议. 二.实验用到的主控芯片:STM32F103RCT6,IIC通讯引脚IIC_SDA:PC11,IIC_SCL:PC12 三.SH ...

  3. STM32使用IIC总线通讯协议在OLED屏幕上显示字符串、汉字、单总线获取DHT11模块温湿度并通过IIC显示到屏幕(软件IIC)

    参考:基于stm32软件IIC的oled显示温湿度 作者:ZPZ DayUp 发布时间: 2021-07-25 20:52:43 网址:https://blog.csdn.net/m0_5619768 ...

  4. 模拟IIC读取SHT30温湿度传感器数据

    文章目录 1 i2c.c 2 i2c.h 3 crc.c 4 crc.h 1 i2c.c /*** @brief SHT30温湿度传感器相关,使用模拟IIC进行数据的读取*/#include < ...

  5. nRF52笔记(8) IIC读取sht30温湿度传感器

    1.平台的条件 1.1 软件平台:sdk14.2 1.2 硬件平台: nrf52832 2 说明: 只是介绍代码怎么使用,直接点 QQ: 1297311998 ,如果有什么问题,请高手不吝赐教 2.n ...

  6. STM32物联网项目-SHT30温湿度采集(IIC通信)

    SHT30温湿度采集(IIC通信) SHT30数字温湿度传感器 SHT3x湿度传感器系列包括低成本版本SHT30.标准版本SHT31,以及高端版本SHT35. SHT3x湿度传感器系列结合了多种功能和 ...

  7. STM32使用IIC总线通讯协议在OLED屏幕上显示字符串、汉字、图像(硬件IIC)

    参考:基于STM32-Oled(IIC)的使用 作者:奋斗的小殷 发布时间: 2021-05-07 13:09:26 网址:https://blog.csdn.net/boybs/article/de ...

  8. STM32模拟IIC读取PCF8563

    作者第一次开写博客,本着学习的态度,附上自己总结的代码,希望大家多多指点! 一.首先是对于PCF8563芯片的介绍与使用说明: PCF8563 是PHILIPS 公司推出的一款工业级内含I2C 总线接 ...

  9. SHT30 温湿度传感器,检验不通过,通讯不稳定(经常读到FF)问题处理

    前言 在前人代码上,移植SHT30驱动,遇到很玄学的问题,安装手册给的时序读回温度和湿度,要不就是检验通过不了,要不就是读回FF,读回的通讯时序如下,比较简单 先说结论: 祖传代码中IIC通讯中的应答 ...

最新文章

  1. 机器人学一些概念2——四元数,D-H 参数
  2. encryption数据库配置信息用户名密码加密
  3. Bootstrap css3
  4. ( )不是html的布局标签,不要使用的HTML标签(WEB标准网页布局)
  5. matlab busy 如何看进度,matlab solve 之后不出结果不报错,状态一直显示busy
  6. 京东数科公布11.11一小时战报:白条交易额10秒破亿
  7. Leetcode:415. Add Strings
  8. 排序算法之一 冒泡排序(C++版本)
  9. Android 界面设计 简约个人求职简历表格
  10. php判断手机号码归属地,手机号码归属查询大全所在位置(PHP通过API获取手机号码归属地)...
  11. 台式机装苹果系统_台式机能装苹果系统? 能!
  12. UNICODE与UTF-8的转换详解
  13. 越南edu学生校园校友邮箱申请UNIDAYS学生认证登录Apple music原创教程
  14. 【调剂】北京语言大学 SAIT 智能语音习得技术实验室
  15. VMware虚拟机禁止防火墙启动
  16. 浅谈大数据及相关技术在计算机专业的应用
  17. 华为数通笔记-NAT
  18. 安装Office OneNote 2007
  19. TTP233H-BA6功能介绍于适用场景;
  20. 自己动手制作系统垃圾清理工具

热门文章

  1. SSL 杂谈,想谈的,谈错了
  2. 笔记:requires the provider be exported, or grantUriPermission()
  3. Python爬一爬世界杯赛程
  4. 大白话布隆过滤器,又能和面试官扯皮了~
  5. 腾讯qq珊瑚虫版_腾讯QQ迎来重大更新:三大新功能上线,短板补齐了
  6. 数码相机使用经验技巧
  7. 问道手游服务器维护,《问道》手游服务器例行维护公告(2016.03.07)
  8. 徐徐落地 2009年云计算五大趋势盘点
  9. 怎样安装oa服务器系统软件,重装操作系统而不用重装OA系统的方法?
  10. 法院HP EVA8400删除VDISK后数据恢复