概要

IIC(IIC,inter-Integrated circuit),两线式串行总线,用于MCU和外设间的通信。 
IIC只需两根线:数据线SDA和时钟线SCL。以半双工方式实现MCU和外设之间数据传输,速度可达400kbps。

多主机I2C总线结构

注意SDA和SCL两根总线需要上拉,使总线处于空闲状态。

IIC协议

空闲状态

协议规定,SDA和SCL同时为高电平时,总线处于空闲状态。上拉电阻保证电平处于高电平。

起始信号和停止信号

起始信号:SCL为高电平时,SDA电平发生高到低的跳变 
停止信号:SCL为高电平时,SDA电平发生低到高的跳变

应答信号

发送器每发送完一个字节(8个脉冲),在第9个脉冲间释放总线,接收器返回一个ACK信号,协议规定,低电平为有效应答,高电平为无效应答。

数据有效性

协议对有效数据进行了规定:即时钟信号为高电平期间,数据必须保持稳定,时钟信号低电平期间,数据线上的电平才允许变化。也就是说,数据在时钟信号到来前必须准备好,并保持到时钟信号的下降沿之后。

数据传输

I2C为同步传输,时钟控制数据位的传输,边沿触发。

驱动程序

直接引用实验中的代码。测试没问题。

起始信号

//产生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);
}

有效应答

//产生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;
}

EEPROM

24C02为IIC接口,容量为256字节。

封装如下图:

管脚定义:

设备地址的高四位固定,中间为地址线定义的地址,最后一位为读写位。 
由于A0,A1,A2设置为0,所以 
读的时候:Device Address = 0xA1; 
写的时候:Device Address = 0xA0;

24C02字节写时序

  1. 起始信号
  2. 写设备地址,Device Address = 0xA0;
  3. 等待应答
  4. 确定写入的EEPROM地址即WORD ADDRESS
  5. 等待应答
  6. 向SDA数据线上写入数据DATA
  7. 等待应答
  8. 停止信号

//在AT24CXX指定地址写入一个数据
//WriteAddr  :写入数据的目的地址
//DataToWrite:要写入的数据
void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite)
{                                                                                            IIC_Start();  if(EE_TYPE>AT24C16){IIC_Send_Byte(0XA0);        //发送写命令IIC_Wait_Ack();IIC_Send_Byte(WriteAddr>>8);//发送高地址   }else IIC_Send_Byte(0XA0+((WriteAddr/256)<<1));   //发送器件地址0XA0,写数据   IIC_Wait_Ack();    IIC_Send_Byte(WriteAddr%256);   //发送低地址IIC_Wait_Ack();                                                        IIC_Send_Byte(DataToWrite);     //发送字节                             IIC_Wait_Ack();                    IIC_Stop();//产生一个停止条件 delay_ms(10);
}

24C02字节读时序

  1. 起始信号
  2. 写设备地址,Device Address = 0xA0;
  3. 等待应答
  4. 确定写入的EEPROM地址即WORD ADDRESS
  5. 等待应答
  6. 起始信号
  7. 读设备地址,Device Address = 0xA1;
  8. 等待应答
  9. 读SDA上数据
  10. 等待应答
  11. 停止信号

//在AT24CXX指定地址读出一个数据
//ReadAddr:开始读数的地址
//返回值  :读到的数据
u8 AT24CXX_ReadOneByte(u16 ReadAddr)
{                 u8 temp=0;                                                                               IIC_Start();  if(EE_TYPE>AT24C16){IIC_Send_Byte(0XA0);       //发送写命令IIC_Wait_Ack();IIC_Send_Byte(ReadAddr>>8);//发送高地址      }else IIC_Send_Byte(0XA0+((ReadAddr/256)<<1));   //发送器件地址0XA0,写数据      IIC_Wait_Ack(); IIC_Send_Byte(ReadAddr%256);   //发送低地址IIC_Wait_Ack();     IIC_Start();           IIC_Send_Byte(0XA1);           //进入接收模式            IIC_Wait_Ack();  temp=IIC_Read_Byte(0);         IIC_Stop();//产生一个停止条件       return temp;
}

参考

STM32F3与 F4 系列 Cortex M4 内核编程手册 
STM32F4xxx中文参考手册 
STM32F4xxx英文参考手册 
STM32F4 开发指南(寄存器版)

STM32的IIC应用详解1相关推荐

  1. STM32的IIC应用详解3

    分享: 这两天将STM32的IIC按照原子哥的程序,大致走了一遍,多少对IIC不是那么地陌生了,也多少有了自己的一些感悟,在这里,将这两天的学习的一个大致步骤总结下,一来可以让自己形成一个清晰地思路, ...

  2. STM32的IIC应用详解2

    IIC简单介绍 小编能力有限,写的不对处还望诸位大侠指正哈! 平时所说的IIC通信指的是用单片机的两个I/O端口模拟出来的IIC,正真的IIC实际上是一块硬件电路,那是飞利浦公司的专利,要想用那就拿钱 ...

  3. STM32常用协议之IIC协议详解

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 IIC协议详解 前言 一.IIC协议简介 1.1 简介 1.2 IIC物理层 1.3 协议层 1.3.1 IIC基本读写过程 1.3. ...

  4. stm32项目平衡车详解(stm32F407)下

    stm32项目平衡车详解(stm32F407)下 本文章学习借鉴于创客学院团队,以表感谢.教学视频 B站学习地址 HC-SRO4 超声波测距避障功能开发 TSL1401 CCD摄像头实现小车巡线功能 ...

  5. UART, SPI, IIC的详解及三者的区别和联系

    1.UART, SPI, IIC的详解 UART.SPI.IIC是经常用到的几个数据传输标准,下面分别总结一下: UART(Universal Asynchronous Receive Transmi ...

  6. STM32—— AHB、APB详解

     STM32-- AHB.APB详解 2016-07-14 20:35 590人阅读 评论(0) 收藏 举报 本文章已收录于: 版权声明:本文为博主原创文章,未经博主允许不得转载. 一.概括 首先 ...

  7. STM32开发 -- 蓝牙开发详解(2)

    如需转载请注明出处:https://juyou.blog.csdn.net/article/details/100708695 接着 STM32开发 – 蓝牙开发详解(1) 这一篇接着讲. 看了好久好 ...

  8. STM32开发 -- 低功耗模式详解(2)

    如需转载请注明出处:https://juyou.blog.csdn.net/article/details/98631012 上一篇文章 STM32开发 – 低功耗模式详解(1) 简单的总结了一下低功 ...

  9. IIC通信协议详解 PCF8591应用(Verilog实现FPGA)

    IIC通信协议详解 & PCF8591应用(Verilog实现/FPGA) 该文章结合PCF8591 8-bit AD/DA 模数/数模转换器来详细介绍IIC通信协议,尽量做到条理清晰,通俗易 ...

最新文章

  1. [异常解决] ubuntu上安装虚拟机遇到的问题(vmware坑了,virtual-box简单安装,在virtual-box中安装精简版win7)
  2. mysql调用jieba库_jieba库的使用及实例
  3. 【Android 异步操作】线程池 ( 线程池简介 | 线程池初始化方法 | 线程池种类 | AsyncTask 使用线程池示例 )
  4. 解读小米MoGA:超过MobileNetV3的移动端GPU敏感型搜索
  5. redis-2.8.17安装指导(自己做测试了)
  6. 聊聊Function的bind()
  7. flask 继承模版的基本使用1
  8. 克隆需要验证_[实验技巧]CRISPR实验中如何验证编辑?
  9. 计算机工程说课稿,人教版数学说课稿集合五篇
  10. centos 7 下安装haproxy
  11. CF - 1214D
  12. oracle roseha 配置,RoseHA 9.0 for Windows配合Oracle11g配置文档_v2.0-2015-04.pdf
  13. 重装系统后计算机无法启动,重装系统后电脑重启没反应是怎么回事?如何解决呢?...
  14. 梅隆大学计算机专业申请,卡耐基梅隆大学计算机专业申请要求及研究方向
  15. 重构改善即有代码的设计
  16. 鹅厂同学:7 月开始不再进行薪酬调整?
  17. 诊断2018微商:从乱象到赋能,世界微商大会发明的新玩法为您指路
  18. SAS实验04 ——回归分析
  19. 【云和恩墨大讲堂】高凯 | Oracle 12c 新特性-多租户的维护管理
  20. Git LFS(Large File Storage)使用简介

热门文章

  1. Jmeter使用入门
  2. itchat 动态注册
  3. C 标准库 - ctype.h之isalnum使用
  4. 【2017-05-30】WebForm文件上传。从服务端删除文件
  5. The differences between capturing and bubbling
  6. selenium webdriver python 环境搭建
  7. 浙江大学PAT上机题解析之1009. 说反话 (20)
  8. 使用Microsoft Azure Backup备份Hyper-V数据
  9. 解决Access denied for user #39;#39;@#39;localhost#39; to database #39;mysql#39;问题
  10. 应用新安全组 - 每天5分钟玩转 OpenStack(116)