导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→发表看法:[mcumcu2011 ]I2C总线的单片机C语言实现及其应用[原



No.107016
作者:mcumcu2011 
邮件:2232894713@qq.com
ID:146042
登陆:36次
文章数:182篇
最后登陆IP:119.136.84.46
最后登陆:2016/12/19 9:56:07
注册:2011/7/12 16:15:28
财富:968
发帖时间:2014/7/7 15:57:27
发贴者IP:14.151.177.234
标题:mcumcu2011 :I2C总线的单片机C语言实现及其应用[原创]
摘要:No.107016I2C总线的单片机C语言实现及其应用[原创] I2C总线的单片机C语言实现及其应用 
摘 要:本文介绍了I2C总线的概念、接口特性和传输时序,提出了一种用51系列单片机的C语言(C51)模拟I2C总线数据传输的软件方法,并给出了在数字高清晰度电视地面接收机中的应用。 关键词:I2C总线;单片机;C语言;高清晰度电视1 I2C总线概述   I2C(Intel-Integrated Circuit)总线是荷兰的Philips公司于八十年代初推出的一种芯片间串行总线扩展技术。它用两根线(数据线SDA、时钟线SCL)可完成总线上主机与器件的全双工同步数据传送,可极方便地构成多主机系统和外围器件扩展系统。I2C总线支持所有NMOS、CMOS、TTL等工艺制造的器件,其上所有的节点都连到同名的SDA、SCL上。I2C总方法,数据传送都有相同的操作模式,接口电器特性相同且独立,可在系统供电情况下从系统中移去或增加IC芯片,有I2C接口的外围器件都有应答能力,读写片内单元时有地址自动加1功能,易实现多个字节的自动操作。近年来,国际上有关公司制造了多达几百种的I2C总线器件,如8051系列单片机8XC752、LCD驱动器、RAM、I/O接口等芯片都使用了I2C总线接口。随着数字技术的发展,I2C总线控制系统已经应用于越来越多的电子产品。 2 I2C总线的数据传输 2.1 接口特性  I2C总线接口的数据线SDA和时钟线SCL必须经过上拉电阻接到正电源VDD上,各个I2C接口电路输出端必须是漏极开路或集电极开路,以便完成“线与”的功能。I2C的SDA和SCL都是双向传输线,当总线空闲时,此两线都是“1”(高电平)。由于不同的器件都会接到I2C总线,逻辑的“0”(低)及“1”(高)的信号电平取决于VDD的电压。总线上能连接的最大器件数取决于其电容容限400PF。 2.2 I2C总线上的传输时序   I2C总线上每传输一位数据都有一个时钟脉冲相对应,在标准模式下可达100 kbit/s,高速模式下可达400kbit/s,总线上依据器件功能不同可建立简单的主/从关系(master/slave),只有带CPU的器件才可成主控器。图1为I2C总线一次完整的数据传输。SCL为高期间,SDA状态必须稳定,SCL为低时才允许SDA状态变化。SCL保持高电平期间,SDA出现由高至低的转换将启动I2C总线,出现由低至高的转换将停止数据传输。起始和终止信号通常由主控器产生。I2C总线的信号时序有严格规定,本应用采用标准模式,SCL低电平周期≥4.7μs,SCL高电平周期≥4.0μs,START和STOP之间的总线空闲时间≥4.7μs。   I2C 总线上传送的每个字节必须为8位,启动和停止之间可传输的数据字节数不受限制。采用串行传送,首先传送最高位,每传送一个字节后必须跟一个应答位。主控器产生应答所需的时钟脉冲期间,发送器必须释放数据线(SDA为高),以便接收器输出应答位。低电平为应答信号,高电平为非应答信号。非应答信号是当主控器作为接收器时,收到最后一个字节数据后,必须发送一个非应答信号给被控发送器,使被控发送器释放数据线,以便主控器发停止信号,终止数据传送。当从器件不能再接收字节时也会出现非应答 信号这种情况。   I2C总线上的器件一般有两个地址:受控地址和通用广播访问地址,每个器件有唯一的受控地址用于定点通信,而相同的通用广播访问地址则用于主控方同时对所有器件进行访问。如图1所示,起始信号后主控器发送的第一个字节就是被读器件的受控地址,称作寻址字节。寻址字节由高7位地址和最低1位方向位组成,方向位为“0”表明主控器对被控器的写操作(W),方向位为 “1”表明对被控器的读操作(R)。总线上每个器件在起始信号后都把自己的地址与寻址字节的前7位相比较,如相同则器件被选中,产生应答,并根据读写位决定在数据传送中是接收还是发送。无论是主发、主收还是从发、从收,都是由主器件控制,数据传送完后,主控器都必须发停止信号。

  3 I2C总线的C51语言实现   C51语言是针对Intel的8位单片机MCS-51系列而开发的、具有一般C语言特点的高级编程语言。从1985年至今,有许多公司推出 51系列的C语言编译器,其中以Franklin C51编译器在代码生成方面较为领先,它可生成最少的代码,支持浮点和长整数、重入和递归。头文件reg51.h中包含了51单片机的特殊功能寄存器(SFR)的字节定义与位定义。为了与具有I2C总线接口的51单片机兼容,可在程序开始处定义单片机的P1.6和P1.7作为I2C总线的SCL和SDA信号,实际中也可用其它的I/O引脚作为SCL和SDA信号。C51语言中只要用赋值语句”=”就可实现I/O口某位的数据输出和读入。现将I2C总线底层读写函数接口及功能列举如下,它可用于没有内部I2C接口的51系列单片机与I2C总线器件通信。 #include<reg51.h> /*全局符号定义*/ #define HIGH1 #define LOW 0 #define FALSE0 #define TRUE1 #define time 1 #define uchar unsigned char   #define uint unsigned int sbit SCL=P1^6; sbie SDA=P1^7; 1)函数原型:void delay(uchar nu m)  功  能:用for()循环提供延时。在实际应用中可依具体情况改变传入参数,但必须满足I2C总线时序中对SCL高、低电平周期的要求,本应用中取1,调用形式为delay(time)。 2)函数原型:void start(void)  功  能:提供I2C总线工作时序中的起始位,在SCL=HIGH期间,SDA出现由高到底的转变,返回前将SCL拉低,允许数据变化,准备传输。其中调用函数1。 3)函数原型:void stop(void)  功  能:函数提供I2C总线工作时序中的起始位,在SCL=HIGH期间,SDA出现由低到高的转变。其中调用函数1。 4)函数原型:void sendbyte(uchar b,uchar*error)    功  能:在时钟作用下,将入口参数b中8位数据由高至低通过SDA线发送,并读回应答信号,存于指针变量*error中。其中调用函数1、2、3。 5)函数 ......

>>返回讨论的主题



  发表回复
用户名   *您没有注册?
密码   *
验证码   * .
标题   *
心情
随便说说    我回答你    最新发现    得意的笑   
气死我了    真是没劲    坚决同意    表示反对   
大家过来    好奇怪哟    懒得理它    大家小心   
文件上传
内容


字体:      字体大小:    颜色:
粗体 斜体 下划线 居中 超级连接 Email连接 图片 Flash图片 Shockwave文件 realplay视频文件 Media Player视频文件 QuickTime视频文件 引用 飞行字 移动字 发光字 阴影字 查看更多的心情图标 背景音乐
点击加入表情
                         
选项
有回复时用短消息通知您?

   




老古网执行:16毫秒 最大:357232毫秒 查询6次