I2C总线支持任何IC生产过程NMOS CMOS双极性,两线――串行数据 SDA 和串行时钟SCL线在连接到总线的器件间传递信息,每个器件都有一个唯一的地址识别,无论是微控制器、LCD 驱动器、存储器或键盘接口,而且都可以作为一个发送器或接收器。

总线空闲状态 :

SDA :高电平

SCL :高电平

硬件电路:

两线要各外接一个约3~10K欧的上拉电阻

宏定义必要参数:

#define SDA P1_0              //I2C 数据传送位

#define SCL P1_1              //I2C 时钟传送位

#define  GuestAddr  0x1D //从机地址

延时函数:

1、

void iic_delay(){//延时约7us

for(i=16;i<16;i--);//延时时间us=(3+5*16)/12 值不可大于255

}

2、

#define iic_delay() Delay_1u(8)

void Delay_1u(uint microSecs)

{

while(microSecs--)

{

/* 32 NOPs == 1 usecs*/

asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop");

asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop");

asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop");

asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop");

asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop");

asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop");

asm("nop"); asm("nop");

}

}

起始和终止信号(灰色区域):

void iic_start()               //函数功能:I2C通信开始

{

SDA = 1;

iic_delay();

SCL = 1;

iic_delay();

SDA = 0;

iic_delay();

}

void iic_stop()                //函数功能:I2C通信停止

{

SDA = 0;

iic_delay();

SCL = 1;

iic_delay();

SDA = 1;

iic_delay();

}

应答信号时序:

void iic_ack()                 //函数功能:I2C通信查应答位

{

SCL = 1;

SCL = 0;

}

写字节代码:

void iic_write_byte(uchar wdata)//函数功能:向I2C从机写入一个字节

{

uchar i,temp,temp1;

temp1 = wdata;

for (i = 0; i < 8; i++)

{

SCL = 0;

iic_delay();

temp = temp1;

temp = temp&0x80;

SDA = (temp == 0x80? 1: 0);

iic_delay();

SCL = 1;

iic_delay();

SCL = 0;

iic_delay();

temp1 <<= 1;

}

}

读字节代码:

uchar iic_read_byte(void)    //函数功能:从I2C从机中读出一个字节

{

uchar x;

uchar data;

for (x = 0; x < 8; x++) {

data <<= 1;

SDA = 1;

iic_delay();

SCL = 0;

iic_delay();

SCL = 1;

iic_delay();

P1DIR &= ~0x01

if(SDA == 1)  data |= 0x01;

P1DIR |= 0x01

}

return data;

}

综合应用:

void iic_write(uchar byte_add,uchar wdata)//函数功能:按地址写入一字节数据

{

uchar t;

t = GuestAddr <<1;

/* 第一个字节的头 7 位组成了从机地址,最低位它决定了报文的方向:第一个字节的最低位是 0 表示主机会写信息到被选中的从机 ,1 表示主机会向从机读信息*/

iic_start();   //起始信号

iic_write_byte(t);

iic_ack();

iic_write_byte(byte_add);//内部寄存器地址

iic_ack();

iic_write_byte(wdata);//内部寄存器数据

iic_ack();

iic_stop();

}

uchar iic_read(uchar byte_add)            //函数功能:按地址读出一字节数据

{

uchar t;

uchar x;

t = (GuestAddr << 1);

iic_start();

iic_write_byte(t);

iic_ack();

iic_write_byte(byte_add);

iic_ack();

t = (GuestAddr << 1) | 0x01;

/* 第一个字节的头 7 位组成了从机地址,最低位它决定了报文的方向:第一个字节的最低位是 0 表示主机会写信息到被选中的从机 ,1 表示主机会向从机读信息*/

iic_start();

iic_write_byte(t);

iic_ack();

x = iic_read_byte();

iic_ack();

iic_stop();

return x;

}

************************************************************************************************

延时函数参考:https://m.hqew.com/tech/fangan_1647539

来源于课堂整理

协议—IIC的更多相关文章

  1. 协议——IIC

    I²C即Inter-Integrated Circuit(集成电路总线),它是一种串行通信总线,使用多主从架构,由飞利浦公司在1980年代设计出来的一种简单.双向.二线制总线标准.多用于主机和从机在数 ...

  2. FPGA基础设计(四):IIC协议

    很多数字传感器.数字控制的芯片(DDS.串行ADC.串行DAC)都是通过IIC总线来和控制器通信的.不过IIC协议仍然是一种慢速的通信方式,标准IIC速率为100kbit/s,快速模式速率为400kb ...

  3. 九、IIC驱动原理分析

    学习目标:学习IIC驱动原理: 一.IIC总线协议 IIC串行总线包括一条数据线(SDA)和一条时钟线(SCL),支持“一主多从”和“多主机”模式:每个从机设备都有唯一的地址来识别. 图 1 IIC ...

  4. 【STM32】IIC的基本原理(实例:普通IO口模拟IIC时序读取24C02)(转载)

     版权声明:本文为博主原创文章,允许转载,但希望标注转载来源. https://blog.csdn.net/qq_38410730/article/details/80312357 IIC的基本介绍 ...

  5. IIC通信控制的AD5259------在调试过程中遇到的奇葩问题

    首先说一下的遇到的问题: 1.AD5259按照SCL是100KHz的情况下,可以正常接收上位机的数据,但是一段时间后,就不能正确的按照时序来走了 原因在于AD5259在接收到上位机的数据后需要一定的响 ...

  6. 51单片机下实现软件模拟IIC通信

    1.IIC协议简易概述 IIC全称Inter-Integrated Circuit (集成电路总线),是由PHILIPS公司在80年代开发的两线式串行总线,用于连接微控制器及其外围设备.IIC属于半双 ...

  7. 嵌入式LINUX入门到实践(一)

    MINI2440 IIC协议 IIC协议在工程中应用广泛,在我看来,此协议的优势就在于其硬件及其简单,结构清晰. 首先来解读一下S3C2440A这款芯片的IIC协议. 一.一个协议的解读从如上结构图中 ...

  8. OLED屏幕详细使用

    IC扩展-OLED屏的点亮,模拟IIC功能实现C代码点亮OLED屏,只要是可以C编程且有两个GPIO口的单片机均可更改小部分代码使用.OLED屏为像素自发光,其尺寸多为128*64,表示横轴上有128 ...

  9. 基于STM32F429的ADS1115驱动程序

    1.ADS1115中文资料:https://wenku.baidu.com/view/8bab101feef9aef8941ea76e58fafab069dc44e7.html?rec_flag=de ...

随机推荐

  1. 新学的的matplotlib库~~~~

    import numpy as np import matplotlib.pyplot as plt x=np.linspace(0,6,100) y=np.cos(2*np.pi*x)*np.exp ...

  2. 通俗易懂--SVM算法讲解(算法+案例)

    1.SVM讲解 新闻分类案例 SVM是一个很复杂的算法,不是一篇博文就能够讲完的,所以此篇的定位是初学者能够接受的程度,并且讲的都是SVM的一种思想,通过此篇能够使读着会使用SVM就行,具体SVM的推 ...

  3. dubbo入门学习 三 dubbo简介

    http://dubbo.apache.org/zh-cn/docs/user/references/protocol/dubbo.html Dubbo简介 1. Dubbo:一个分布式.高性能.透明 ...

  4. Python 打印矩形、直角三角形、等腰三角形、菱形

    # 1)打印一个星号 print('*') #2)打印一行6个星号 * * * * * * for i in range(6): print('*',end=' ') #3)打印6列星号 * * * ...

  5. 把excel每一行中的数据输出为一个txt文档的VBA函数

    excel vba代码: Sub makeTxt() For i = 1 To 1088'从第1行到1088行(最后一行) On Error Resume Next'出现错误时继续运行脚本 Open ...

  6. 学习Acegi应用到实际项目中(12)- Run-As认证服务

    有这样一些场合,系统用户必须以其他角色身份去操作某些资源.例如,用户A要访问资源B,而用户A拥有的角色为AUTH_USER,资源B访问的角色必须为AUTH_RUN_AS_DATE,那么此时就必须使用户 ...

  7. s3-1 数据链路层概述

    数据链路层功能 为网络层提供服务,良好的服务接口  保证数据传输的有效.可靠: - 处理传输错误:差错检测和控制 流量控制     • 基于速率     • 基于反馈 数据链路层的位置 位于网络层之 ...

  8. 消除blur属性的边框

    直接设置样式为:  outline:none <!DOCTYPE html> <html lang="en"> <head> <meta ...

  9. RAC环境中threads变更后如何确保goldengate继续正常复制

    转载:http://www.easyora.net/blog/goldengate_rac_threads_remap.html 当rac节点变更的时候,比如我们添加或者删除了集群中的节点,理所当然会 ...

  10. js基础知识:字面量 关键字和保留字

    js中的字面量概念我的理解就是:字体表面的常量 如:数字 100, 字符串  "ssss"或'ssss'  布尔值:false ,正则 以及null对象. 这些都是常量. 关键字: ...