IIC多主从,双向传输,只有两根线:一根数据,一根时钟,时钟必须由主机发出控制。初始化时主机把SCL和SDA的电平都拉高,然后在SCL保持高电平时SDA拉低形成一个开始信号,紧接着开始信号就开始发送要通信的7位从机地址(从机地址一般由芯片内置+电阻设置两部分组成一般为7位),然后再接着传一位读(1)写(0)标识,与7位从机地址共同组成八位,然后等待从机返回应答(从机收到自己的地址后在第九个时钟周期把SDA拉低作为应答),然后主机再发送1个字节数据,等待一位应答,再发送,再应答,直到发完,然后主机拉低SDA拉高SCL并在拉高SCL后再拉高SDA开成一个结束信号,至此一个相对完整的IIC通信过程结束。应答与非应答信号,应答是由从机发给主机的,非应答信号是主机发给从机的,信号来源不一样。应答与非应答的时钟都由主机提供,都在第九个时钟周期出现。非应答信号作用在主机接收完了一个字节数据后,不再接收数据时就发送一个非应答信号,然后再发送一个停止信号。

I2C总线在传送数据过程中共有三种类型信号, 它们分别是:开始信号、结束信号和应答信号。
  开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。
  结束信号:SCL为低电平时,SDA由低电平向高电平跳变,结束传送数据。
  应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为受控单元出现故障。

    

    

  总线必须由主器件(通常为微控制器)控制,主器件产生串行时钟(SCL)控制总线的传输方向,并产生起始和停止条件。SDA线上的数据状态仅在SCL为低电平的期间才能改变,SCL为高电平的期间,SDA状态的改变被用来表示起始和停止条件。

程序示例://##################################################################################

//开始传输函数
void Start_I2C()
{
SDA=;
delay();
SCL=;
delay();     //保证周期大于4.7us
SDA=;
delay();     //保证周期大于4us
SCL=;    //钳住I2C总线准备发送数据
delay();
} //结束传输函数
void Stop_I2C()
{
SDA=;
delay();
SCL=;
delay();
SDA=;
delay();     //保证周期大于4us
} //发送一个字节数据的函数
void SendByte(uchar cSend)
{
uchar BitCnt; for(BitCnt=; BitCnt<; BitCnt++) //传送的数据长度为8位,循环一次发送一位数据
{
if( (cSend<<BitCnt) & 0x80 )
{
SDA=;
}
else
{
SDA=;
} delay();
SCL=;           //设置时钟线为高,通知从机开始接收数据
Delay();            //保证周期大于4us
SCL=;
} delay();
SDA=;        //发送完8位数据后释放数据线,准备接收应答位
delay();
SCL=;
delay(); if(SDA==)
{
ack=;
}
else
{
ack=;   //判断是否接收到应答
} SCL=;     //钳住I2C总线
delay(); } //接收一个字节数据的函数
uchar RcvByte()
{
uchar cReceive;
uchar BitCnt; cReceive=;
SDA=;     //数据线为输入方式 for(BitCnt=; BitCnt<; BitCnt++)
{
delay();
SCL=;         //准备接收数据
delay();          //保证周期大于4.7us
SCL=;         //时钟线为高,此时数据有效
delay();
cReceive=cReceive<<;   //把上一位接收到的数据向高位移一位
if(SDA==)
{
cReceive=cReceive+;  //把接收到的数据放入cReceive中
}
} SCL=;     //钳住I2C总线
delay(); return(cReceive);
} //发送应答信号函数
void Ack_I2C(bit a)
{
if(a==)
{
SDA=;         //此处发出应答信号
}
else
{
SDA=;
} delay();
SCL=;
delay();     //保证周期大于4us
SCL=;    //清时钟线,钳住I2C总线
delay(); } //向无子地址器件写字节数据函数
bit ISendByte(uchar sla, uchar *c)
{
Start_I2C(); //启动I2C总线
SendByte(sla);      //发送从机地址,后面的“+1”表示读 if(ack==)
{
return ;     //从机无响应,则返回0
} SendByte(*c);   //写入数据
if(ack==)
{
return ;     //从机无响应,则返回0
} Stop_I2C(); //结束总线
return(); //成功返回1
} //向无子地址器件读字节数据函数
bit IRcvByte(uchar sla, uchar *c)
{
Start_I2C(); //启动I2C总线
SendByte(sla+);    //发送从机地址,后面的“+1”表示读 if(ack==)
{
return ;    //从机无响应,则返回0
} *c= RcvByte(); //读取数据
Ack_I2C(); //发送非应答
Stop_I2C(); //结束总线
return(); //成功返回1
}

IIC的更多相关文章

  1. IIC驱动移植在linux3.14.78上的实现和在linux2.6.29上实现对比(deep dive)

    首先说明下为什么写这篇文章,网上有许多博客也是介绍I2C驱动在linux上移植的实现,但是笔者认为他们相当一部分没有分清所写的驱动时的驱动模型,是基于device tree, 还是基于传统的Platf ...

  2. 基于STM32Cube的IIC主从通信

    1.建立STM32Cube工程,我使用的芯片是STM32F429,为了更简单的建立单独的IIC通信任务,我使用了FREERTOS,另外选择了RCC(系统时钟初始化),I2C1,I2C2(为了验证代码的 ...

  3. STM32 IIC

    #include "Type.h" #include "IIC.h" #include "Delay.h" void I2C_Init(vo ...

  4. 基于华清远见STM32f051的 IIC从模式实现方法

    作者:卢老师,华清远见嵌入式学院讲师. 在大多情况下,我们使用MCU控制传感器,节点以及相关从设备,但在较为复杂的系统中,有时候也会使用MCU做为从设备. 下面是关于stm32f051的从模式实现方法 ...

  5. IIC总线

    一. 概述 1. IIC总线是PHILIPS公司推出的一种串口总线,是具备多主机系统所需的包括总线裁决和高低速器件同步功能的高性能串口总线. 2. IIC总线只有两根双向信号线.一根是数据线SDA,一 ...

  6. stm8的IIC库的使用

    一.前言 stm8是一款低功耗的MCU芯片,它具备stm32库函数和资源丰富的优势.也同时具有价格便宜,低功耗的特点.在一些项目中,能起到很好的作用.下面我介绍一下stm8的IIC硬件库函数驱动代码及 ...

  7. IIC总线解析

    IIC简介: IIC 即Inter-Integrated Circuit(集成电路总线),这种总线类型是由飞利浦半导体公司在八十年代初设计出来的,主要是用来连接整体电路(ICS) ,IIC是一种多向控 ...

  8. px4flow通过iic读取具体寄存器数据程序

    底层通信用了昨天写好的iic,今天结合官方资料成功读出所有指定寄存器的数据附上源码 include.h主要包括了一些stm32 IO控制的宏定义,具体参考正点原子所有例程中都有的sys.h头文件 in ...

  9. stm32软件模拟IIC读取PX4FLOW光流传感器数据

    这段时间在做全国光电设计大赛,用到了px4的px4flow光流传感器,用软件模拟iic读取数据不定期会导致px4flow死机,查了资料和光流的源码,发现这个光流用了stm32的硬件iic,所以对软件模 ...

随机推荐

  1. gradle环境配置、

    话不多说,直接上流程. 1.下载 gradle.zip文件,我以为已经为大家准备好了各个版本的下载地址. 链接: http://pan.baidu.com/s/1hqjIVlE 密码: 8ccb 本人 ...

  2. 关于Erlang中的behaviour

    唔,听说过这四个牛逼渣渣的behaviour:gen_server,gen_fsm,gen_event,supervisor.所以也就更加好奇behaviour的实现. 在解释它是怎么工作的之前,我们 ...

  3. Unity3d之个性化皮肤

    1.首先创建皮肤,贴图 2.在代码中定义public GUISkin变量,在Inspector中赋值 3.在OnGUI中调用 GUI.skin = mySkin; GUI.Button(new Rec ...

  4. git 小结

    git cherry-pick de0ec64  可将另一个分支中的提交 cherry-pick到当前分支来

  5. 【转】Nginx中upstream有以下几种方式:

    1.轮询(weight=1) 默认选项,当weight不指定时,各服务器weight相同, 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除.upstream bak ...

  6. 如何使用.NET开发全版本支持的Outlook插件产品(四)——进阶探讨

    插件项目所有代码都已经上传至 https://github.com/VanPan/TestOutlookAdding 如何定制Ribbon在不同界面的显示 实际使用过程中出现的问题 这个问题的来自十分 ...

  7. 各种浏览器的userAgent收集

    window.navigator.userAgent 1) Chrome Win7: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KH ...

  8. Perl技巧

    项目里面一直用的是Perl,Perl里有各种小技巧就分享在这吧. push(@a, $b) 把b元素压入a数组中, 还可以有 push(@a, [@b]); 那a就成了二维数组了 scalar(@a) ...

  9. C语言实现粒子群算法(PSO)二

    上一回说了基本粒子群算法的实现,并且给出了C语言代码.这一篇主要讲解影响粒子群算法的一个重要参数---w.我们已经说过粒子群算法的核心的两个公式为: Vid(k+1)=w*Vid(k)+c1*r1*( ...

  10. bookstore网上书店测试缺陷报告2

    Bookstore网上书店系统测试缺陷报告   缺陷编号 01.01.0002 发现人 吴赵昕 记录日期 2016-06-10 所属模块 购物车 确认人 吴赵昕 确认日期 2016-06-10 当前状 ...