I2C的配置必须要按照其时序逻辑,首先先来了解I2C常见的几种工作情况:
A、主机向从机发送数据,数据传输方向在整个传输过程中不变:

B、主机在第一个字节后,立即从从机读数据:

C、在传输过程中,当需要改变传输方向时,起始信号和从机地址都被重复产生一次,但两次读/写方向位正好相反:

此外,I2C的时序如下图所示:

接下来正式开始进入I2C程序阶段(I2C管脚配置、宏定义等假设已完成):
(1)I2C起始函数(严格按照上图中起始信号的时序逻辑):
void IIC_Start(void)
{
IIC_SDA_OUT();//这里是I2C中数据信号输出的配置模式,一般配置为推挽输出

IIC_SDA_SET;//数据拉高
IIC_SCL_SET;//时钟拉高
IIC_DelayUs(5); //延时5us,满足起始信号刚开始时的大于4.7us的时序IIC_SDA_CLR;    //START: when CLK is high,DATA change form high to low;数据拉低
IIC_DelayUs(5); //保证满足至少大于4us的时序IIC_SCL_CLR;    //钳住I2C总线,准备发送或者接收数据;时钟拉低

}

(2)I2C终止函数(严格按照上图中终止信号的时序逻辑):
void IIC_Stop(void)
{
IIC_SDA_OUT();//同理,配置为推挽输出

IIC_SCL_CLR;//时钟拉低
IIC_SDA_CLR;    //数据拉低;SCL在低电平期间,SDA变化无效IIC_SCL_SET;//时钟拉高
IIC_DelayUs(5); //保持时间>4usIIC_SDA_SET;    //STOP:when CLK is high DATA change form low to high
IIC_DelayUs(5); //保持时间>4.7us

}

(3)I2C发送函数:
void IIC_SendData(uint8_t dat)
{
uint8_t i;

IIC_SDA_OUT();
IIC_SCL_CLR;for(i=0; i<8; i++) //要发送8位,从最高位开始
{if((dat & 0x80) == 0x80){IIC_SDA_SET;}else{IIC_SDA_CLR;}dat <<= 1;IIC_DelayUs(2);IIC_SCL_SET;IIC_DelayUs(5);  //保持时间>4.7usIIC_SCL_CLR;IIC_DelayUs(2);
}

}

(4)I2C接收函数:
uint8_t IIC_ReceiveData(uint8_t ack)
{
uint8_t i, readValue;

IIC_SDA_OUT();
IIC_SDA_SET;
IIC_SDA_IN();
IIC_SCL_CLR;for(i=0; i<8; i++)     //接收8个字节,从高到低
{IIC_SCL_SET;IIC_DelayUs(2);readValue <<= 1;if(IIC_SDA != 0){readValue |= 0x01;}       IIC_DelayUs(1);IIC_SCL_CLR;IIC_DelayUs(5);
}if(ack)         //是否应答,1:产生应答;0:非应答
{IIC_SendAck();
}
else
{IIC_NoAck();
}return readValue;//这里返回值即是读取到的数据

}

(5)I2C等待应答函数:
int8_t IIC_WaitAck(void)
{
uint32_t i;

IIC_SDA_IN();
IIC_SDA_SET;
IIC_DelayUs(1);
IIC_SCL_SET;while(IIC_SDA)//在SCL高电平的情况下,SDA产生一个下降沿
{i++;if(i > 0xFFFF){return 0xFF;}
}IIC_SCL_CLR;
IIC_DelayUs(2);return 0;    //返回值为1:应答成功;0:应答失败

}

(6)I2C发送应答函数:
static void IIC_SendAck(void)
{
IIC_SCL_CLR;
IIC_SDA_OUT();

IIC_SDA_CLR;
IIC_DelayUs(2);
IIC_SCL_SET;
IIC_DelayUs(2);
IIC_SCL_CLR;

}

(7)I2C无应答函数:
static void IIC_NoAck(void)
{
IIC_SCL_CLR;
IIC_SDA_OUT();

IIC_SDA_SET;
IIC_DelayUs(2);
IIC_SCL_SET;
IIC_DelayUs(2);
IIC_SCL_CLR;

}

STM32单片机初学者常用函数--I2C配置相关推荐

  1. 51、stm32单片机初学者经验之谈

    51单片机作为最经典的一款单片机,已在各大高校的电子.通信专业的入门单片机课程,想学单片机这是最好的入门单片机. 单片机就是一块芯片,如stc89c52.stm32f103zet6.stm32f103 ...

  2. STM32单片机初学者编程之常用小程序--GPIO配置延时函数

    声明:本专题系列的博文主要是用于个人学习以及后续查阅调用,由于是这方面的初学者,所以写的比较浅陋,有喜欢的朋友可以一起学习,编程大神们请略过...... 1.以一个GPIO的初始化程序为例,以下是GP ...

  3. STM32单片机硬件I2C驱动程序(查询方式)

    本文章原始地址:http://feotech.com/?p=69 本程序主要用于驱动STM32单片机芯片的硬件I2C寄存器,实现通过使用芯片自带的I2C寄存器进行数据的发送与接收. 本例程中采用I2C ...

  4. STM32单片机硬件I2C驱动程序(软件轮询方式)---摘自:FeoTech

    感谢原作者:FeoTech   原文网址:http://feotech.com/?p=69 本程序主要用于驱动STM32单片机芯片的硬件I2C寄存器,实现通过使用芯片自带的I2C寄存器进行数据的发送与 ...

  5. 【STM32】初学者必读STM32时钟系统详解

    目录 1 前言 2 时钟系统介绍 3 时钟源 3.1 系统时钟源 3.2 次级时钟源 3.3 时钟源特点 4 时钟 4.1 AHB总线时钟 4.2 APB1总线时钟 4.3 APB2总线时钟 5 时钟 ...

  6. 华大单片机、STM32单片机如何做printf串口打印格式化输出

    第一种方法:使用标准C库,但使用标准C库你必须关闭半主机模式 (1)添加下面代码就是关闭半主机模式 /* 告知连接器不从C库链接使用半主机的函数 */ #pragma import(__use_no_ ...

  7. STM32单片机外部中断配置讲解

    2019独角兽企业重金招聘Python工程师标准>>> 单片机外部中断简介 所谓外部中断,就是通过外部信号所引起的中断,如单片机引脚上的电平变化(高电平.低电平).边沿变化(上升沿. ...

  8. 初学者入门:认识STM32单片机

    本教程含有较多专业词汇,大部分时候,不完全理解并不影响继续往下阅读,大家只需要了解大致的概念即可.当然,也鼓励大家多查百度和多问chatgpt,让自己学会的更多. 什么是单片机? 单片机,就是把中央处 ...

  9. CubeMX配置STM32实现httpd服务器CGI功能并使用网页控制STM32单片机(四)

    CubeMX配置STM32实现httpd服务器CGI功能并使用网页控制STM32单片机 引言 CubeMX配置HTTPD的CGI功能 实验过程 发现的问题 总结 引言 在前三篇文章中自己介绍了如何配置 ...

最新文章

  1. android 入门 006(sqlite增删改查)
  2. 无法找到脚本库错误解决过程
  3. YbtOJ#20240-[冲刺NOIP2020模拟赛Day10]弱者对决【笛卡尔树,区间dp】
  4. web系统四层结构中服务器端,基于.NET平台构建四层B/S结构的动态网站
  5. 前端【学习心得】电商网站前端架构#3 前端在产品设计中的作用
  6. ASP.NET MVC 3 Validation - 正则表达式验证RegularExpressionAttribute之日期验证
  7. wifi安装linux分区,centos7配置wifi驱动
  8. Qt qlabel 设置字体、大小、加粗等
  9. SC-GlowTTS论文阅读
  10. HDMI CEC HDCP
  11. Spark列级血缘(字段级别血缘)开发与实现
  12. Android so加固的简单脱壳
  13. 牛顿--现在流行胡诌
  14. DVWA-XSS (Stored)
  15. 在日本名古屋举行的AACSB亚太地区年会将WRDS-SSRN创新奖颁发给南京大学
  16. 计算机专业前沿算法,CNCC2018 | 研究经典计算机算法已经过时了吗?
  17. 中小学计算机说课稿,【附说课相关知识】中小学信息技术说课稿《认识计算机》.doc...
  18. RAID 容量计算器
  19. 国潮起·万物生,2021国潮新消费大会,见证中国品牌力量
  20. python endwith_Python endswith()方法 - Python 教程 - 自强学堂

热门文章

  1. 数据分析人必看,分享一个完整的数据分析流程
  2. Mac 连上无线网络,无法上网
  3. spring boot 怎么 html 嵌套 html?
  4. 人的本质是选择展示什么样的人性
  5. 日期时间脚本库方法列表
  6. 探访世优科技数字人虚拟直播产品体系 | 世优开放日再次成功举行
  7. 惆怅长岑长惆怅长岑长惆怅长岑长吃吃吃
  8. Monaca Web IDE 初体验 —— 开发PhoneGap/Cordova应用程序,还用什么Eclipse/XCode!
  9. EKP后端/开发/SSH - Hibernate常用操作(public)
  10. 关于股市的各种小段子