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通信相关推荐

  1. STM32 IIC通信简介+PCF8563时钟芯片示例

    IIC总线是嵌入式设备最常用的接口之一,包括51单片机在内的MCU一般都可以进行IIC通信. IIC通信有3种类型的信号:开始信号,结束信号,和应答信号. 开始信号:SCL为高电平,SDA由高电平向低 ...

  2. 15 玩转STM32之IIC通信(芯片硬件篇)

    15.1 IIC控制器说明(硬件部分) 在14 玩转STM32之IIC通信(软件模拟篇)我们讲了软件模拟的方式,本章讲解芯片自带的硬件部分(并非所有的芯片都含有IIC,像51系列的是没有的,但是绝大多 ...

  3. 45 STM32 IIC主机、从机通信实例(ma51t12b触摸按键芯片)

    45.1引言 最近在研究触摸按键板的通信,按键板主要用到的通信协议为IIC,事实上IIC的例子有很多,但大都都是模拟IIC的主机(引用某网友的评论),从机这边的内容还是比较少. 早在两三年前就跟着原子 ...

  4. STM32 PAJ7620U2手势识别模块(IIC通信)程序源码详解

    最近在自学设计下基于STM32单片机的项目,想用手势识别模块做一点好玩的,做个手势控制家居设备开关,另外正好借此巩固I²C 通信.因此,我想借这个机会在这里和大家分享一下自己学习STM32单片机时的所 ...

  5. stm32 hal库 AS5600磁编码器IIC通信读取角度

    stm32 hal库 AS5600磁编码器IIC通信读取角度 下载

  6. STM32使用IIC通信

    一.IIC简介 IIC数据总线是由数据线 SDA 和时钟 SCL 构成的串行总线,可发送和接收数据. 在 CPU 与被控 IC 之间.IC 与 IC 之间进行双向传送.(同步半双工) I2C 总线在传 ...

  7. STM32 0.96寸OLED IIC通信

    STM32 0.96寸OLED IIC通信 OLED选取 IDE选择 配置流程 oled.c文件 oled.h文件 oledfont.h文件 OLED选取 四针(GND VCC SCL SDA)的II ...

  8. STM32 TM1637驱动数码管 IIC通信

    最近在做iic实验的过程中发现手边刚好有一个数码管他的驱动正好是使用iic,话不多说直接上代码了 这里就不赘述iic通信的原理和时序图了,网上相关资源也很多这里就附一篇iic的文章,这篇文章相当详细. ...

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

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

最新文章

  1. Linux之curl命令使用详解—网络故障定位(五)
  2. 2 时间格式化_U盘无法格式化怎么办 U盘无法格式化解决教程【详解】
  3. java.math.BigDecimal()的用法
  4. php实现查询上传文件进度
  5. skywalking告警相关配置
  6. mybatis多个foreach_MyBatis中使用foreach完成复杂查询
  7. 实习、竞赛、论文?关于计算机读研的一些小建议!
  8. Android AR场景拍照技术实现(有关键源代码)
  9. ios控制中心android版,IOS控制中心
  10. java数据清洗_数据清洗例子
  11. STM32单片机网络通信调试
  12. 第一章 android以及智能手机行业相关简介
  13. 记一次AWK程序耗时日志分析
  14. jenkins发送邮件添加附件
  15. golang游戏开发学习笔记-开发一个简单的2D游戏(基础篇)
  16. Primeton EOS开发配置
  17. 揭秘域名劫持反向代理之黑帽SEO技术
  18. 详解CAN总线:CAN总线报文格式—帧间隔
  19. Ubuntu下安装拳皇97
  20. 收下这份面经!2020 阿里、美团、头条最新面试题总结来了

热门文章

  1. Linux安装jdk导致linux命令失效(配置JDK环境)(踩坑日记)
  2. 在Cocos2dX游戏中使用Lua脚本进行游戏开发(基础篇)
  3. 京东回应“995”工作制:不强制要求 但鼓励大家高效产出
  4. nginx映射静态资源linux,nginx静态资源映射
  5. 回梦游仙-仙剑奇侠传4主题曲:再一次感动仙剑
  6. 程序员刚毕业,先去大厂镀金还是先去小厂攒经验?
  7. 2020ICPC济南站复盘及近期打算
  8. 【笔记】Ueditor1_4_3_3-utf8-jsp使用步骤
  9. Dubbo负载均衡、集群容错
  10. 表格排版 20070809