IIC通信协议

IIC是同步半双工通信,一个数据线SDA和一个时钟SCL线,可以接受和发送数据。在CPU与被控IC之间、IC与IC之间进行双向传送。

空闲状态

IIC总线的SDA和SCL两条信号线同时处于高电平时,规定为总线的空闲状态。

起始信号

当SCL为高期间,SDA由高到低的跳转


代码实现为:

//产生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总线,准备发送或接收数据
}
停止信号

当SCL为高期间,SDA由低到高的跳转

代码实现:

//产生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; delay_us(4);           IIC_SDA=1;//发送I2C总线结束信号
}
应答信号

发送器每发送一个字节,就在时钟脉冲9期间释放数据线,由接收器反馈一个应答信号。应答信号为低电平时,规定为有效应答位,表示接收器已经成功接收到了该字节。应答信号为高电平时,规定为非应答位,一般表示接收器接收该字节没有成功。
对于反馈有效应答位ACK的要求是,接收器第9个时钟脉冲之前的低电平将SDA线拉低,并且确保在该时钟的高电平期间为稳定的低电压。

代码实现为:

//产生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;
}
//等待应答信号到来
//返回值: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;
}
数据的有效性

IIC总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平才允许变化。即数据在SCL的上升沿到来之前就需要准备好,并且在下降沿到来之前必须保持稳定。

数据的传送

在IIC总线上传送的每一位数据都有一个时钟脉冲相对应(同步控制),即在SCL串行时钟的配合下,在SDA上逐位串行传送每一位数据,数据位的传输是边沿触发。

发送一字节代码实现为:

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

数据传输之前IIC_SCL必须等于0,即时信号为低电平,然后准备一位数据,准备好之后,IIC_SCL=1,即时钟信号为高电平,数据就传输过去了
对于下面的代码:

IIC_SDA=(txd&0x80)>>7;
txd<<=1;

无符号类型左移丢弃最高位,低位补0,无符号类型右移丢弃最低位,低位补0,txd&0x80让txd第8位数据不变,其他为变成0(txd的值不受影响),左移7位,将最高位的数据赋值给IIC_SDA,当IIC_SCL=1时,第八位数据就传输过去了,txd<<=1让第7位数据变成第8位数据,下次循环就传输原来第7位数据了。循环8次将一字节数据传输完毕。

读取数据代码实现:

//读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;
}

对于下面的代码:

 receive<<=1;if(READ_SDA)receive++;

READ_SDA是获取SDA线上的电压,高电压说明说明传送过来的数据是1,receive++,下一次的时候, receive<<=1,receive先右移一位,然后接受数据,这样循环8次,就能保证接受的数据在原来的位置上了。

与EEPROM通信

硬件连接


EEPROM是一种掉电后数据不丢失的存储芯片,可以在电脑上或专用设备上擦除已有信息,重新编程。
24C02的总容量是256个字节,接口是IIC

模式选择

硬件连接中,A2=A1=A0=0(接地),所以,我们读数据时,只需写入0xA1,表示读模式,写数据时,只需写入0xA0,表示写模式

写时序

下面是写入一个字节数据的过程

  1. 一个IIC_START信号
  2. 写入模式,写入0xA0
  3. 等待一个ACK
  4. 发送写入数据的地址(0~255)
  5. 等待一个ACK
  6. 发送一个字节
  7. 等待一个ACK
  8. 一个STOP信号
    具体代码如下
//在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);
}
读数据

下面是读一个字节数据的过程

  1. 产生一个START信号
  2. 写入0xA0,表示是写模式
  3. 等待一个ACK
  4. 写入读数据的地址
  5. 等待一个ACK
  6. 产生一个START信号
  7. 写入0xA1,表示是读模式
  8. 等待一个ACK
  9. 读取数据
    实现代码如下:
//在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;
}

IIC通信---EEPROM24C02---STMF4相关推荐

  1. PIC单片机 IIC通信及实现

    IIC通信   IIC是一种只需要2根数据线就可以实现数据通信的总线式结构.IIC采用主从式通信方式,通信过程完全由主设备决定.完整的通信流程是主设备发送起始信号给从设备,再发送地址来选中从设备,然后 ...

  2. 16F877A和24C02通信汇编语言,pic单片机IIC通信读24C02程序例 16F877A 主频4M

    #define _iic_h_//pic单片机IIC通信初始化函数声明 void iiccsh(void); //pic单片机IIC通信读外围设备函数声明 //功能:传送一个8位地址,返回一个8位数据 ...

  3. i2c通信 msp430g2553_msp430g2553的IIC通信

    SCCB_Stop(); if(!SCCB_Start()) { //return 0; } SCCB_SendByte( DEV_ADR + 1 );               /* 器件地址 * ...

  4. 树莓派3B 之IIC通信

    上一篇我们将了树莓派的uart通信. 本篇幅我们来讲一下,树莓派IIC通信. 读取slave 的数据. 依然我们用wirningPi库,驱动IIC 的引脚编号8/9,分别用作SDA/SCL. 我们用来 ...

  5. 华大单片机HC32L130/HC32L136从机IIC通信

    从机IIC理论知识 主机IIC的做法比较多,从机IIC的就相对比较难一点. 先补充一下从机IIC的思路: 先看IIC时序图,然后根据时序图理清IIC从机需要做哪些判断: 从机发送: ·判断IIC ST ...

  6. LPC1768 IIC通信示——PCF8563

    PCF8563与AT24C02一样,是典型的IIC通信器件,这里就以它为例,编写基于LPC1768硬件IIC的通信代码: 上图是PCF8563各个寄存器地址,PCF8563的IIC地址是0xA2 #i ...

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

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

  8. ICM20602六轴传感器-IIC通信模式

    ICM20602六轴传感器 ICM20602 通过IIC协议与MCU通信 ICM20602 初始化配置 ICM20602 相关配置函数 ICM20602 内部寄存器 注意事项 (一)ICM20602 ...

  9. 中微SC8F5771模拟IIC通信——指令运行速度的探索(附编译软件与烧录软件)

    文章目录 一.中微单片机烧录与使用 编译软件 烧录软件 下载地址 烧录软件 二.模拟IIC 三.逻辑分析仪下的时序 一.中微单片机烧录与使用 编译软件 中微所使用编译软件为SCMCU_IDE,不过个人 ...

  10. 51单片机常用通信方式之IIC通信(二)

    IIC通信是一种同步通信方式,同步通信是采用一个同步时钟线,连到收发双方,使收发双方达到完全同步.则IIC通信硬件连接就有四根线VCC.GND.SDA.SCL,SDA是传送数据的,SCL是控制时序的, ...

最新文章

  1. delphi对窗体的查询(delphi xe2)
  2. 再次升级,985博士整理的71个OpenCV实战项目教程开放下载!
  3. linux内核arch目录,各个处理器的介绍
  4. Mybatis传递参数的三种方式
  5. TypeScript class 构造函数和成员的初始化顺序
  6. OpenStack不行了吗?悉尼峰会,OpenStack的白城反击战?
  7. 理论基础 —— 查找 —— 二叉排序树
  8. [深入学习Redis]RedisAPI的原子性分析
  9. 解决性能问题中SQL Server警报:SQL Server警报基础
  10. Unity应用架构设计(4)——设计可复用的SubView和SubViewModel(Part 2)
  11. C语言之父是谁?为什么要开发C语言?
  12. Codeforces Round #685 (Div. 2) (D(博弈) E1 E2(交互))
  13. 3D图形学一:模仿草的运动 – GPU(Pixel Shader Vertex Shader)实现
  14. Bert中文文本多分类与传统BOW+tfidf+LR中文文本多分类对比
  15. 蘑菇街Java后台面试总结
  16. 建设数据中心机房主要看这几点,否则被定为劣质机房!!!
  17. VL53L0X调试总结
  18. linux NUMA技术
  19. Linux系统部署wordpress@林
  20. Go语言从入门到规范-1.1、Go语言官网文档大纲及环境搭建

热门文章

  1. 如何用纯 CSS 创作一个冒着热气的咖啡杯
  2. tooltip.css-2.0文档
  3. 课时39.细线表格(理解)
  4. 鼠标滚轮事件及解决滚轮事件多次触发问题
  5. 有时候eclipse 导入maven项目 启动的时候回出现这样一个问题
  6. ArcGIS API For JS之网络分析(临近设施分析)
  7. Spring @Value取值为null或@Autowired注入失败
  8. 面向对象设计与构造第一次总结作业
  9. python绘制帕累托图
  10. 前台用js、jquery出现错误很多是由于IE缓存