stm32 IIC通信
1,物理层
1》IIC是一种两线串行的通信方式,SCL(时钟线),SDA(数据线)
2》IIC是一种高位先行的通信方式
3》IIC可以实现多主机多从机通信,IIC总线上每一个设备都有唯一的ID
4》IIC总线是飞利浦公司研发的总线协议
5》IIC总线上必须接两个上拉电阻,用于总线空闲时,将总线拉高
6》IIC总线上当两个设备同时发起IIC通信时,由总线仲裁决定谁掌握总线控制权
7》IIC总线的通信速率 标准100kbit/s 快速400kbit/s 高速3.4Mbit/s
8》IIC总线SCL的作用:当SCL为低电平时,SDA线上的数据无效,当SCL为高电平时,SDA线上的数据有效
9》IIC总线的时钟线一般由主机控制,并且IIC通信必须由起始信号开始,由停止信号结束
10》IIC总线通信具有应答机制,接收方应答,发送方等待应答
2,协议层
起始信号:SCL为高电平期间,SDA由高电平跳变到低电平,产生一个有效的下降沿
停止信号:SCL为高电平期间,SDA由低电平跳变到高电平,产生一个有效的上升沿
应答信号:SCL为高电平期间,SDA产生一个有效的低电平
非应答信号:SCL为高电平期间,SDA产生一个有效的高电平
等待应答信号:拉高SCL,等待SDA线上的高电平或低电平
发送数据信号:SCL为高电平期间,数据稳定,SCL为低电平期间,运行SDA数据发生改变
接收数据信号:拉高SCL,读取SDA线上的数据,拉低SCL,让从机准备有效数据
3,IIC信号产生的途径:
1》片上外设
2》利用GPIO口模拟IIC协议
4,总线仲裁
“低电平优先原则”------谁的低电平时间长,谁掌握总线控制,谁先发出低电平,谁掌握总线控制
5,EEPROM----电可擦除可改写存储器-----掉电保护功能
4.函数编写
#include "drv_iic.h"
void IIC_Config(void)
{GPIO_InitTypeDef GPIO_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitStruct.GPIO_Pin =GPIO_Pin_6;//SCLGPIO_InitStruct.GPIO_Mode =GPIO_Mode_Out_OD;GPIO_InitStruct.GPIO_Speed =GPIO_Speed_10MHz;GPIO_Init(GPIOB,&GPIO_InitStruct);}void IIC_SDA_OUT(void)
{GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Pin =GPIO_Pin_7;//SDAGPIO_InitStruct.GPIO_Mode =GPIO_Mode_Out_OD;GPIO_InitStruct.GPIO_Speed =GPIO_Speed_10MHz;GPIO_Init(GPIOB,&GPIO_InitStruct);
}void IIC_SDA_IN(void)
{GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Pin =GPIO_Pin_7;//SDAGPIO_InitStruct.GPIO_Mode =GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOB,&GPIO_InitStruct);
}//起始信号:SCL为高电平期间,SDA由高电平跳变到低电平,产生一个有效的下降沿
void IIC_START(void)
{SCL_LOW;IIC_SDA_OUT();SDA_HIGH;SCL_HIGH;Systick_delayNus(5);SDA_LOW;Systick_delayNus(5);SCL_LOW;
}// 停止信号:SCL为高电平期间,SDA由低电平跳变到高电平,产生一个有效的上升沿
void IIC_STOP(void)
{SCL_LOW;IIC_SDA_OUT();SDA_LOW;SCL_HIGH;Systick_delayNus(5);SDA_HIGH;Systick_delayNus(5);}// 应答信号:SCL为高电平期间,SDA产生一个有效的低电平
void IIC_SendACK(void)
{SCL_LOW;IIC_SDA_OUT();SDA_LOW;SCL_HIGH;Systick_delayNus(5);SCL_LOW;
}// 非应答信号:SCL为高电平期间,SDA产生一个有效的高电平
void IIC_SendNoACK(void)
{SCL_LOW;IIC_SDA_OUT();SDA_HIGH;SCL_HIGH;Systick_delayNus(5);SCL_LOW;
}// 等待应答信号:拉高SCL,等待SDA线上的高电平或低电平
uint8_t IIC_WaitACK(void)
{uint8_t temp=0;SCL_LOW;IIC_SDA_IN();SCL_HIGH;Systick_delayNus(4);while(SDA_Read){temp++;if(temp>250){IIC_STOP();return NoACK;}}SCL_LOW;return ACK;
}// 发送数据信号:SCL为高电平期间,数据稳定,SCL为低电平期间,运行SDA数据发生改变
void IIC_SendByteData(uint8_t Txdata)
{uint8_t i;SCL_LOW;IIC_SDA_OUT();for(i=0;i<8;i++){if(Txdata&0x80){SDA_HIGH;}else{SDA_LOW;}SCL_HIGH;Systick_delayNus(5);SCL_LOW;Systick_delayNus(5);Txdata=Txdata<<1;}SCL_LOW;
}// 接收数据信号:拉高SCL,读取SDA线上的数据,拉低SCL,让从机准备有效数据
uint8_t IIC_RxByteData(uint8_t ACKflag)
{uint8_t i;uint8_t Rxdata=0;SCL_LOW;IIC_SDA_IN();for(i=0;i<8;i++){Rxdata=Rxdata<<1;SCL_HIGH;Systick_delayNus(4);if(SDA_Read){Rxdata =Rxdata|0x01;}SCL_LOW;Systick_delayNus(4);}if(ACK==ACKflag){IIC_SendACK();}else{IIC_SendNoACK();}SCL_LOW;return Rxdata;
}
#include "drv_at24cxx.h"
void AT24Cxx_WriteByteData(uint32_t ADDR,uint8_t Txdata)
{IIC_START();IIC_SendByteData(0xa0);if(ACK!=IIC_WaitACK()){IIC_STOP();return;}IIC_SendByteData(ADDR);if(ACK!=IIC_WaitACK()){IIC_STOP();return;}IIC_SendByteData(Txdata);if(ACK!=IIC_WaitACK()){IIC_STOP();return;}IIC_STOP();
}uint8_t AT24Cxx_ReadByteData(uint32_t ADDR)
{uint8_t Rxdata=0;IIC_START();IIC_SendByteData(0xa0);if(ACK!=IIC_WaitACK()){IIC_STOP();return 0;}IIC_SendByteData(ADDR);if(ACK!=IIC_WaitACK()){IIC_STOP();return 0;}IIC_START();IIC_SendByteData(0xa1);if(ACK!=IIC_WaitACK()){IIC_STOP();return 0;}Rxdata=IIC_RxByteData(NoACK);IIC_STOP();return Rxdata;
}
stm32 IIC通信相关推荐
- STM32 IIC通信简介+PCF8563时钟芯片示例
IIC总线是嵌入式设备最常用的接口之一,包括51单片机在内的MCU一般都可以进行IIC通信. IIC通信有3种类型的信号:开始信号,结束信号,和应答信号. 开始信号:SCL为高电平,SDA由高电平向低 ...
- 15 玩转STM32之IIC通信(芯片硬件篇)
15.1 IIC控制器说明(硬件部分) 在14 玩转STM32之IIC通信(软件模拟篇)我们讲了软件模拟的方式,本章讲解芯片自带的硬件部分(并非所有的芯片都含有IIC,像51系列的是没有的,但是绝大多 ...
- 45 STM32 IIC主机、从机通信实例(ma51t12b触摸按键芯片)
45.1引言 最近在研究触摸按键板的通信,按键板主要用到的通信协议为IIC,事实上IIC的例子有很多,但大都都是模拟IIC的主机(引用某网友的评论),从机这边的内容还是比较少. 早在两三年前就跟着原子 ...
- STM32 PAJ7620U2手势识别模块(IIC通信)程序源码详解
最近在自学设计下基于STM32单片机的项目,想用手势识别模块做一点好玩的,做个手势控制家居设备开关,另外正好借此巩固I²C 通信.因此,我想借这个机会在这里和大家分享一下自己学习STM32单片机时的所 ...
- stm32 hal库 AS5600磁编码器IIC通信读取角度
stm32 hal库 AS5600磁编码器IIC通信读取角度 下载
- STM32使用IIC通信
一.IIC简介 IIC数据总线是由数据线 SDA 和时钟 SCL 构成的串行总线,可发送和接收数据. 在 CPU 与被控 IC 之间.IC 与 IC 之间进行双向传送.(同步半双工) I2C 总线在传 ...
- STM32 0.96寸OLED IIC通信
STM32 0.96寸OLED IIC通信 OLED选取 IDE选择 配置流程 oled.c文件 oled.h文件 oledfont.h文件 OLED选取 四针(GND VCC SCL SDA)的II ...
- STM32 TM1637驱动数码管 IIC通信
最近在做iic实验的过程中发现手边刚好有一个数码管他的驱动正好是使用iic,话不多说直接上代码了 这里就不赘述iic通信的原理和时序图了,网上相关资源也很多这里就附一篇iic的文章,这篇文章相当详细. ...
- STM32物联网项目-SHT30温湿度采集(IIC通信)
SHT30温湿度采集(IIC通信) SHT30数字温湿度传感器 SHT3x湿度传感器系列包括低成本版本SHT30.标准版本SHT31,以及高端版本SHT35. SHT3x湿度传感器系列结合了多种功能和 ...
最新文章
- Linux之curl命令使用详解—网络故障定位(五)
- 2 时间格式化_U盘无法格式化怎么办 U盘无法格式化解决教程【详解】
- java.math.BigDecimal()的用法
- php实现查询上传文件进度
- skywalking告警相关配置
- mybatis多个foreach_MyBatis中使用foreach完成复杂查询
- 实习、竞赛、论文?关于计算机读研的一些小建议!
- Android AR场景拍照技术实现(有关键源代码)
- ios控制中心android版,IOS控制中心
- java数据清洗_数据清洗例子
- STM32单片机网络通信调试
- 第一章 android以及智能手机行业相关简介
- 记一次AWK程序耗时日志分析
- jenkins发送邮件添加附件
- golang游戏开发学习笔记-开发一个简单的2D游戏(基础篇)
- Primeton EOS开发配置
- 揭秘域名劫持反向代理之黑帽SEO技术
- 详解CAN总线:CAN总线报文格式—帧间隔
- Ubuntu下安装拳皇97
- 收下这份面经!2020 阿里、美团、头条最新面试题总结来了
热门文章
- Linux安装jdk导致linux命令失效(配置JDK环境)(踩坑日记)
- 在Cocos2dX游戏中使用Lua脚本进行游戏开发(基础篇)
- 京东回应“995”工作制:不强制要求 但鼓励大家高效产出
- nginx映射静态资源linux,nginx静态资源映射
- 回梦游仙-仙剑奇侠传4主题曲:再一次感动仙剑
- 程序员刚毕业,先去大厂镀金还是先去小厂攒经验?
- 2020ICPC济南站复盘及近期打算
- 【笔记】Ueditor1_4_3_3-utf8-jsp使用步骤
- Dubbo负载均衡、集群容错
- 表格排版 20070809