收藏 分享(赏)

I2C总线式存储器24C0X系列读写程序模块.doc

上传人:ysd1539 文档编号:12359002 上传时间:2021-12-11 格式:DOC 页数:10 大小:69.50KB
下载 相关 举报
I2C总线式存储器24C0X系列读写程序模块.doc_第1页
第1页 / 共10页
I2C总线式存储器24C0X系列读写程序模块.doc_第2页
第2页 / 共10页
I2C总线式存储器24C0X系列读写程序模块.doc_第3页
第3页 / 共10页
I2C总线式存储器24C0X系列读写程序模块.doc_第4页
第4页 / 共10页
I2C总线式存储器24C0X系列读写程序模块.doc_第5页
第5页 / 共10页
点击查看更多>>
资源描述

1、/*头文件名 VIIC_C51.H这个头文件对应的库是 VIIC_C51.LIB,库中有几个模拟 I2C 的函数,加入此文件 即可使用 I2C 平台(主方式的软件平台) , 函数是对 LPC764 的 I2C 的 IO 口实现,即其 P1.3 (SDA) , P1.2(SCL),51 系列机型可以通用.注意: 函数是采用软件延时的方法产生 SCL 脉冲,固对高晶振频率要作 一定的修改(本例是 1us 机器周期 ,即晶振频率要小于 12MHZ).(函数的使用可参考给出的事例程序.)*/#ifdef uchar #define READYDEF 1 /*宏 uchar 已定义*/#else #de

2、fine uchar unsigned char#endif/*无子地址发送字节数据函数 功能: 从启动总线到发送地址,数据,结束总线的全过程,从器件地址 sla.如果返回 1 表示操作成功,否则操作有误。*/extern bit ISendByte(uchar sla,uchar c);/*有子地址发送多字节数据函数 功能: 从启动总线到发送地址,子地址 ,数据,结束总线的全过程,从器件地址 sla,子地址 suba,发送内容是 s 指向的内容,发送 no 个字节。如果返回 1 表示操作成功,否则操作有误。*/extern bit ISendStr(uchar sla,uchar suba,

3、uchar *s,uchar no) ;/*无子地址读字节数据函数 功能: 从启动总线到发送地址,读数据,结束总线的全过程,从器件地址 sla,返回值在 c.如果返回 1 表示操作成功,否则操作有误。*/extern bit IRcvByte(uchar sla,uchar *c);/*有子地址读取多字节数据函数 功能: 从启动总线到发送地址,子地址 ,读数据,结束总线的全过程,从器件地址 sla,子地址 suba,读出的内容放入 s 指向的存储区,读 no 个字节。如果返回 1 表示操作成功,否则操作有误。*/extern bit IRcvStr(uchar sla,uchar suba,u

4、char *s,uchar no);#ifndef READYDEF#undef uchar#endif/*VIIC_C51.C此程序是 I2C 操作平台(主方式的软件平台)的底层的 C 子程序,如发送数据及接收数据,应答位发送,并提供了几个直接面对器件的操作函数,它很方便的与用户程序连接并扩展. 注意:函数是采用软件延时的方法产生 SCL 脉冲,固对高晶振频率要作 一定的修改(本例是 1us 机器周期 ,即晶振频率要小于 12MHZ)*/#include #include #include #define uchar unsigned char /*宏定义*/#define uint uns

5、igned int#define _Nop() _nop_() /*定义空指令*/* 常,变量定义区 */*端口位定义*/sbit SDA=P13; /*模拟 I2C 数据传送位*/sbit SCL=P12; /*模拟 I2C 时钟控制位*/*状态标志*/bit ack; /*应答标志位 */*起动总线函数 函数原型: void Start_I2c(); 功能: 启动 I2C 总线,即发送 I2C 起始条件.*/void Start_I2c()SDA=1; /*发送起始条件的数据信号*/_Nop();SCL=1;_Nop(); /*起始条件建立时间大于 4.7us,延时*/_Nop();_No

6、p();_Nop();_Nop(); SDA=0; /*发送起始信号*/_Nop(); /* 起始条件锁定时间大于 4s*/_Nop();_Nop();_Nop();_Nop(); SCL=0; /*钳住 I2C 总线,准备发送或接收数据 */_Nop();_Nop();/*结束总线函数 函数原型: void Stop_I2c(); 功能: 结束 I2C 总线,即发送 I2C 结束条件.*/void Stop_I2c()SDA=0; /*发送结束条件的数据信号*/_Nop(); /*发送结束条件的时钟信号*/SCL=1; /*结束条件建立时间大于 4s*/_Nop();_Nop();_Nop(

7、);_Nop();_Nop();SDA=1; /*发送 I2C 总线结束信号*/_Nop();_Nop();_Nop();_Nop();/*字节数据传送函数 函数原型: void SendByte(uchar c);功能: 将数据 c 发送出去,可以是地址,也可以是数据,发完后等待应答,并对此状态位进行操作.(不应答或非应答都使 ack=0 假) 发送数据正常,ack=1; ack=0 表示被控器无应答或损坏。*/void SendByte(uchar c)uchar BitCnt;for(BitCnt=0;BitCnt8;BitCnt+) /*要传送的数据长度为 8 位*/if(cBitCn

8、t) /*判断发送位*/else SDA=0; _Nop();SCL=1; /*置时钟线为高,通知被控器开始接收数据位*/_Nop(); _Nop(); /*保证时钟高电平周期大于 4s*/_Nop();_Nop();_Nop(); SCL=0; _Nop();_Nop();SDA=1; /*8 位发送完后释放数据线,准备接收应答位*/_Nop();_Nop(); SCL=1;_Nop();_Nop();_Nop();if(SDA=1)ack=0; else ack=1; /*判断是否接收到应答信号*/SCL=0;_Nop();_Nop();/*字节数据传送函数 函数原型: uchar Rcv

9、Byte();功能: 用来接收从器件传来的数据 ,并判断总线错误(不发应答信号),发完后请用应答函数。 */uchar RcvByte()uchar retc;uchar BitCnt;retc=0; SDA=1; /*置数据线为输入方式*/for(BitCnt=0;BitCnt8;BitCnt+)_Nop(); SCL=0; /*置时钟线为低,准备接收数据位*/_Nop();_Nop(); /*时钟低电平周期大于 4.7s*/_Nop();_Nop();_Nop();SCL=1; /*置时钟线为高使数据线上数据有效*/_Nop();_Nop();retc=retc1;if(SDA=1)ret

10、c=retc+1; /*读数据位,接收的数据位放入 retc 中 */_Nop();_Nop(); SCL=0; _Nop();_Nop();return(retc);/*应答子函数原型: void Ack_I2c(bit a);功能:主控器进行应答信号,(可以是应答或非应答信号)*/void Ack_I2c(bit a)if(a=0)SDA=0; /*在此发出应答或非应答信号 */else SDA=1;_Nop();_Nop();_Nop(); SCL=1;_Nop();_Nop(); /*时钟低电平周期大于 4s*/_Nop();_Nop();_Nop(); SCL=0; /*清时钟线,钳

11、住 I2C 总线以便继续接收*/_Nop();_Nop(); /*向无子地址器件发送字节数据函数 函数原型: bit ISendByte(uchar sla,ucahr c); 功能: 从启动总线到发送地址,数据,结束总线的全过程,从器件地址 sla.如果返回 1 表示操作成功,否则操作有误。注意: 使用前必须已结束总线。*/bit ISendByte(uchar sla,uchar c)Start_I2c(); /*启动总线*/SendByte(sla); /*发送器件地址*/if(ack=0)return(0);SendByte(c); /*发送数据*/if(ack=0)return(0)

12、;Stop_I2c(); /*结束总线*/ return(1);/*向有子地址器件发送多字节数据函数 函数原型: bit ISendStr(uchar sla,uchar suba,ucahr *s,uchar no); 功能: 从启动总线到发送地址,子地址 ,数据,结束总线的全过程,从器件地址 sla,子地址 suba,发送内容是 s 指向的内容,发送 no 个字节。如果返回 1 表示操作成功,否则操作有误。注意: 使用前必须已结束总线。*/bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no)uchar i;Start_I2c(); /*启

13、动总线*/SendByte(sla); /*发送器件地址*/if(ack=0)return(0);SendByte(suba); /*发送器件子地址*/if(ack=0)return(0);for(i=0;ino;i+) SendByte(*s); /*发送数据*/if(ack=0)return(0);s+; Stop_I2c(); /*结束总线*/ return(1);/*向无子地址器件读字节数据函数 函数原型: bit IRcvByte(uchar sla,ucahr *c); 功能: 从启动总线到发送地址,读数据,结束总线的全过程,从器件地址 sla,返回值在 c.如果返回 1 表示操作

14、成功,否则操作有误。注意: 使用前必须已结束总线。*/bit IRcvByte(uchar sla,uchar *c)Start_I2c(); /*启动总线*/SendByte(sla+1); /*发送器件地址*/if(ack=0)return(0);*c=RcvByte(); /*读取数据*/Ack_I2c(1); /*发送非就答位*/Stop_I2c(); /*结束总线*/ return(1);/*向有子地址器件读取多字节数据函数 函数原型: bit ISendStr(uchar sla,uchar suba,ucahr *s,uchar no); 功能: 从启动总线到发送地址,子地址 ,

15、读数据,结束总线的全过程,从器件地址 sla,子地址 suba,读出的内容放入 s 指向的存储区,读 no 个字节。如果返回 1 表示操作成功,否则操作有误。注意: 使用前必须已结束总线。*/bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no)uchar i;Start_I2c(); /*启动总线*/SendByte(sla); /*发送器件地址*/if(ack=0)return(0);SendByte(suba); /*发送器件子地址*/if(ack=0)return(0);Start_I2c();SendByte(sla+1);/读的地址比写的地址多 1;if(ack=0)return(0);for(i=0;ino-1;i+) *s=RcvByte(); /*发送数据*/Ack_I2c(0); /*发送就答位*/ s+; *s=RcvByte();Ack_I2c(1); /*发送非应位*/Stop_I2c(); /*结束总线*/ return(1);/* 完毕 */

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 中等教育 > 教学研究

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报