51单片机连接24C02-C语言测试代码
2014-01-22 22:11
381 查看
忙了一天多终于透彻了,自己写的不好使,用别人的逐步分析改成自己的,我写得非常简洁易懂。
我总结3点需要注意的地方
1.关闭非IIC通信器件,比如我的开发板SDA和SCL也连接了DS1302,造成干扰会没有结果。
2.IIC通信的应答,发送端在SCL为0时将SDA置1,等待接收端拉低SDA;接收端在拉低SDA持续一个周期后,应将SDA置1释放总线。
主机作为发送端等待应答
主机作为接收端,进行应答或不应答
3.24C02在写入周期完成后还有有内部写入时间Twr,所以可以查手册加入适当时间的延时函数,或者使用查询应答的方式进行延时等待。
总之,关键是注意参考数据手册及IIC总线规范,尤其是芯片的特别说明以及时序的控制,再结合代码就能弄懂了。
下面是我写的代码,用上了所有的功能,包括 Current Read 对应的函数 readnext() 。多字节写入时不用考虑分页问题,函数自动解决,直接给数组即可。使用数码管显示结果。
24C02.c
我总结3点需要注意的地方
1.关闭非IIC通信器件,比如我的开发板SDA和SCL也连接了DS1302,造成干扰会没有结果。
2.IIC通信的应答,发送端在SCL为0时将SDA置1,等待接收端拉低SDA;接收端在拉低SDA持续一个周期后,应将SDA置1释放总线。
主机作为发送端等待应答
SDA=1; SCL=1; while(SDA); SCL=0;
主机作为接收端,进行应答或不应答
SDA=0; //不应答则为1 SCL=1; SCL=0; SDA=1;
3.24C02在写入周期完成后还有有内部写入时间Twr,所以可以查手册加入适当时间的延时函数,或者使用查询应答的方式进行延时等待。
总之,关键是注意参考数据手册及IIC总线规范,尤其是芯片的特别说明以及时序的控制,再结合代码就能弄懂了。
下面是我写的代码,用上了所有的功能,包括 Current Read 对应的函数 readnext() 。多字节写入时不用考虑分页问题,函数自动解决,直接给数组即可。使用数码管显示结果。
#include<reg52.h> sbit RST=P2^4; //用来关闭ds1302 sbit SDA=P2^0; sbit SCL=P2^1; //内部使用的函数 bit start(unsigned char dev); void stop(void); bit write_byte(unsigned char dat); unsigned char read_byte(bit ack); void waitack(void); //外部使用 void writes(unsigned char address,unsigned char dat[],unsigned char num); void reads(unsigned char address,unsigned char dat[],unsigned char num); unsigned char read(unsigned char address); void write(unsigned char address,unsigned char dat); unsigned char readnext(void); /*数码管部分*/ sbit du=P2^6; sbit we=P2^7; void display(void); void delayms(unsigned time); unsigned char code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; unsigned char num[6]={0}; void main(void) { //测试用数据 unsigned char a[9]={2,3,5,7,13,15,11,4,8}; unsigned char b[13]={0}; RST=0; //关闭ds1302消除影响 write(11,6); write(12,1); writes(2,a,9); b[9]=readnext(); //b[9]=6 b[10]=readnext(); //b[10]=1 reads(2,b,9); //b[0-8]=a[0-8] b[11]=readnext(); //b[11]=6 b[12]=read(12); //b[12]=1 num[5]=b[3]; num[4]=b[6]; num[3]=b[9]; num[2]=b[10]; num[1]=b[11]; num[0]=b[12]; while(1) { display(); } } //传入设备地址,返回设备是否应答 bit start(unsigned char dev) { SDA=1; SCL=1; SDA=0; SCL=0; return write_byte(dev); } void stop(void) { SDA=0; SCL=1; SDA=1; } //传入要写入的字节,返回设备是否应答 bit write_byte(unsigned char dat) { unsigned char i=8; bit ack; while(i--) { dat<<=1; SDA=CY; SCL=1; SCL=0; } SDA=1; //接收设备应答 SCL=1; ack=~SDA; SCL=0; return ack; } //在写入后等待24c02完成内部写入 //恢复响应的时间为手册中的twr void waitack(void) { while(!start(0xa0)); stop(); } //传入是否应答设备,返回读取的字节 unsigned char read_byte(bit ack) { unsigned char i=8,ret; while(i--) { ret<<=1; SCL=1; ret|=SDA; SCL=0; } SDA=~ack; //应答或不应答设备 SCL=1; SCL=0; SDA=1; //应答时要注意的时序 return ret; } //传入写入地址,数组,写入字节数 //函数自动进行分页写入 void writes(unsigned char address,unsigned char dat[],unsigned char num) { unsigned char i; for(i=0;i<num;) { start(0xa0); write_byte(address); do write_byte(dat[i++]); while(++address&0x07 && i<num); //分页条件判断 stop(); waitack(); //延时等待以完成内部写入 } } //传入读取地址,接收用的数组,读取字节数 void reads(unsigned char address,unsigned char dat[],unsigned char num) { unsigned char i; start(0xa0); write_byte(address); start(0xa1); for(i=0;i<num-1;i++) dat[i]=read_byte(1); dat[i]=read_byte(0); stop(); } void write(unsigned char address,unsigned char dat) { writes(address,&dat,1); } unsigned char read(unsigned char address) { unsigned char ret; reads(address,&ret,1); return ret; } //对应手册中的Current Read unsigned char readnext(void) { unsigned char ret; start(0xa1); ret=read_byte(0); stop(); return ret; } void delayms(unsigned time) { unsigned i,j; for(i=time;i>0;i--) for(j=110;j>0;j--) ; } void display(void) { unsigned char i; for(i=0;i<6;i++) { P0=0; du=1; du=0; P0=~(0x20>>i); we=1; we=0; P0=table[num[i]]; du=1; du=0; delayms(1); } }
24C02.c
相关文章推荐
- 一个用C语言连接PostgreSQL的测试代码
- 使用以下代码连接并测试
- 测试数据库的连接代码,备用
- c++ 连接MySql数据库并执行插入,查询数据测试代码
- 正则表达式规则及C语言测试代码
- Java连接oracle测试代码
- IPC空连接测试代码
- JDBC连接SQL Server测试代码及异常
- Java测试数据库连接原生代码
- mongodb3.0分片及java代码连接操作测试(开启用户验证)
- Linux下的C语言Socket函数建立TCP连接(代码+注释)
- Redis教程(十五):C语言连接操作代码实例
- php测试mysql连接正常与否的代码
- 测试PHP连接MYSQL成功与否的代码
- 测试PHP连接MYSQL成功与否的代码
- Redis教程(十五):C语言连接操作代码实例
- 华为C语言编程规范—代码测试、维护
- php下使用以下代码连接并测试
- JAVA JDBC连接oracle 测试代码