1、IIC协议简易概述

IIC全称Inter-Integrated Circuit (集成电路总线),是由PHILIPS公司在80年代开发的两线式串行总线,用于连接微控制器及其外围设备。IIC属于半双工同步通信方式。

特点

  • 简单性和有效性。

    由于接口直接在组件之上,因此IIC总线占用的空间非常小,减少了电路板的空间和芯片管脚的数量,降

    低了互联成本。总线的长度可高达25英尺,并且能够以10Kbps的最大传输速率支持40个组件。
  • 多主控(multimastering)

    其中任何能够进行发送和接收的设备都可以成为主总线。一个主控能够控制信号的传输和时钟频率。当

    然,在任何时间点上只能有一个主控。
  • 构成

    IIC串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL,其时钟信号是由主控

    器件产生。所有接到IIC总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线

    的SCL上。对于并联在一条总线上的每个IC都有唯一的地址。



为了保证数据稳定性和减少干扰,SCL和SDA都需接上拉电阻(大小由速度和容性负载决定,一般3.3-10K之间)。

2、IIC协议

IIC总线在传输数据的过程中一共有三种类型信号,分别为:开始信号、结束信号和应答信号,这些信号中,起始信号是必需的。

*** IIC总线通信过程**

1.主机发送起始信号启用总线

2.主机发送一个字节数据指明从机地址和后续字节的传送方向,0000 0110,最后一位为0表示主机给从机发,为1表示从机给主机发

3.被寻址的从机发送应答信号回应主机

4.发送器发送一个字节数据

5.接收器发送应答信号回应发送器

....循环步骤4,5

n.通信完成后主机发送停止信号释放总线

  • 起始信号

    SCL为高电平时,SDA由高变低表示起始信号

/*定义IIC信号引脚*/
sbit scl = P0^1;
sbit sda = P0^3; /***IIC起始信号***/
void IIC_Start()
{
sda = 1;
scl = 1;
_nop_();//11.0592MHZ晶振下,_nop_()函数耗时约5us
sda = 0;
_nop_();
}
  • 终止信号

    SCL为高电平时,SDA由低变高表示停止信号

/***IIC终止信号***/
void IIC_Stop()
{
sda = 0;
scl = 1;
_nop_();
sda = 1;
_nop_();
}
  • 应答信号

    发送器每发送一个字节(8个bit),就在时钟脉冲9期间释放数据线,由接收器反馈一个应答信号。

    应答信号为低电平时,规定为有效应答位(ACK,简称应答位),表示接收器已经成功地接收了该字

    节;应答信号为高电平时,规定为非应答位(NACK),一般表示接收器接收该字节没有成功。

/***IIC应答信号***/
char IIC_ACK()
{
char flag;
sda = 1;//在时钟脉冲9期间释放数据线
_nop_();
scl = 1;
_nop_();
flag = sda;
_nop_();
scl = 0;
_nop_();
return flag;
}
  • 数据发送的时序

    IIC总线在进行数据传送时,时钟线SCL为低电平期间发送器向数据线上发送一位数据,在此期间数据线上的信号允许发生变化,时钟线SCL为高电平期间接收器从数据线上读取一位数据,在此期间数据线上的信号不允许发生变化,必须保持稳定。

/***IIC协议发送一个字节数据***/
void IIC_Send_Byte(char Send_data)
{
int i;
for(i = 0;i<8;i++)
{
scl = 0;//scl拉低,让sda做好数据准备
sda = Send_data & 0x80;//1000 0000获得Send_data的最高位,给sda
_nop_();//发送数据建立时间
scl = 1;//scl拉高开始发送
_nop_();//数据发送时间
scl = 0;//发送完毕拉低
_nop_();//等待一段时间
Send_data = Send_data << 1;
}
}

最新文章

  1. Windows7+VirtualBox+Ubuntu本地开发环境搭建
  2. linux 几个控制流语句的格式例子(if语句)
  3. 剑指Offer 二叉树中和为某一值的路径(dfs)
  4. Fluent NHibernate关系映射
  5. Sort List
  6. 161031、java.util.StringTokenizer使用及源码
  7. AngularJS 用 Interceptors 来统一处理 HTTP 请求和响应
  8. KM算法详解+模板
  9. Java集合之ArrayList和LinkedList的实现原理以及Iterator详解
  10. iOS 7 二维码
  11. android 4.4.3 css hack 写法
  12. machine learning 之 Neural Network 1
  13. Python内置函数(34)——isinstance
  14. Java动态菜单添加
  15. [SoapUI] 从Map里面不想要的键值对
  16. 安装php扩展包
  17. 20165210 Java第七周学习总结
  18. webbench-1.5_hacking
  19. -【线性基】【BZOJ 2460】【BZOJ 2115】【HDU 3949】
  20. 【Python算法】图与树的实现

热门文章

  1. 【线性DP】数字三角形
  2. 【高并发】通过源码深度分析线程池中Worker线程的执行流程
  3. vue2升级vue3:Vue Demij打通vue2与vue3壁垒,构建通用组件
  4. ubu18时间设置
  5. python--函数参数传递
  6. React报错之map() is not a function
  7. Rust实战系列-基本语法
  8. 持久化-Word库加载项劫持
  9. 给定字符串定义char *a = “I love China!”,读入整数n,输出在进行了a = a + n这个赋值操作以后字符指针a对应的字符串
  10. ASP.NET Core 6框架揭秘实例演示[35]:利用Session保留语境