I2C子系统之at24c02读写测试

发布者:Alisallll最新更新时间:2018-07-15 来源: eefocus关键字:I2C子系统  at24c02  读写测试 手机看文章 扫描二维码
随时随地手机看文章

结合ioctl和at24c02的介绍,写了个at24c02的测试程序

测试硬件平台:TQ2440、at24c02

内核版本:linux-2.6.37.1

读写单独分开成两个小程序。源码如下:

写测试程序:


#include

#include

#include

#include

#include

#include

 

int main(int argc, char *argv[])

{

int num, err, i, j;

int fd, addr;

char *buff;

printf("please input as:");

printf("./wat24 [data]\n");

fflush(stdout);

if(argc < 3){

printf("arg error\n");

return -1;

}

num = argc - 1;

 

buff = malloc(num*sizeof(char));

if(buff < 0){

printf("alloc failed\n");

return -1;

}

 

buff[0] = atoi(argv[1]);

printf("write data:\n");

for(i = 1; i < num; i++){

buff[i] = atoi(argv[i + 1]);

printf("%d\n",buff[i]);

}

printf("from word addr:%d\n",buff[0]);

 

fd = open("/dev/i2c-0",O_RDWR);

if(fd < 0){

printf("device open failed\n");

return -1;

}

err = ioctl(fd, I2C_SLAVE_FORCE, 0x50);

if(err < 0){

printf("ioctl failed:%d\n",err);

return -1;

}

write(fd, buff, num);

close(fd);

return 0;

}

at24c02的写操作可以直接调用write()函数实现。

可以直接进行byte write 或者 page write


在进行page write的时候需要计算好页的起始地址。


程序的使用如下:


page write


./wat24 0 1 2 3 4 5 6 7 8


表示从at24c02中word address为0的地址开始写入1~8。


./wat24 1 1 2 3 4 5 6 7 8


表示从at24c02中的word address为1的地址开始写入1~8数据,但是1是page0内的地址,地址非页对齐。


所以最后在page0内的数据是8 1 2 3 4 5 6 7,8被写到page0的首地址处了。


byte write


./wat24 255 1


byte write相对简单。255表示at24c02中的一个地址,1是向此地址中写入的数据。




读测试程序


#include

#include

#include

#include

#include

#include

 

struct i2c_rdwr_ioctl_data rdwrdata;

 

int main(int argc, char *argv[])

{

int i, err;

int fd;

char wordaddr;

char *rdbuf1;

char *rdbuf2;

int bytenum;

if(argc < 3){

printf("please input as:");

printf("./rat24 [read byte addr] [read num of byte]\n");

return -1;

}

 

wordaddr = atoi(argv[1]);

bytenum = atoi(argv[2]);

printf("%d\n",bytenum);

 

rdwrdata.msgs = (struct i2c_msg *)malloc(2*sizeof(struct i2c_msg));

if(!rdwrdata.msgs){

printf("rdwrdata.msgs malloc failed!\n");

return -1;

}

 

rdbuf1 = (unsigned char *)malloc(sizeof(char));

rdbuf2 = (unsigned char *)malloc(bytenum*sizeof(char));

if((!rdbuf1) || (!rdbuf2)){

printf("rdbuf malloc failed!\n");

return -1;

}

 

rdwrdata.nmsgs = 2;

(rdwrdata.msgs[0]).addr = 0x50;

(rdwrdata.msgs[0]).len = 1;

(rdwrdata.msgs[0]).flags = 0;

(rdwrdata.msgs[0]).buf = rdbuf1;

(rdwrdata.msgs[0]).buf[0] = wordaddr;

(rdwrdata.msgs[1]).addr = 0x50;

(rdwrdata.msgs[1]).len = bytenum;

(rdwrdata.msgs[1]).flags = I2C_M_RD;

(rdwrdata.msgs[1]).buf = rdbuf2;

fd = open("/dev/i2c-0",O_RDWR);

if(fd < 0){

printf("i2c device open failed!\n");

return -1;

}

err = ioctl(fd, I2C_SLAVE_FORCE, 0x50);

if(err < 0){

printf("ioctl failed\n");

return -1;

}

err = ioctl(fd, I2C_RDWR, &rdwrdata);

if(err < 0){

printf("ioctl msgs error, error number:%d\n", err);

return -1;

}

 

printf("read %d byte data from at24c02 word address 0x%02x:\n",bytenum, wordaddr);

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

printf("%d\n", rdbuf2[i]);

close(fd);

return 0;

}

at24c02的read总共有三种

1.current read


2.sequential read


3.random read


其中1和2可以直接通过read系统调用实现


3.的话就需要通过ioctl(,I2C_RDWR,)来实现。


上述程序就是实现这个功能的,可以实现at24c02的random read。


random read


./rat24 0 256


表示从at24c02的word address为0的地址开始读取256个字节数据


./rat24 0 8


表示从at24c02的word address为0的地址开始读取8个字节的数据,即读取page0的数据。


关键字:I2C子系统  at24c02  读写测试 引用地址:I2C子系统之at24c02读写测试

上一篇:单片机 I2C操作笔记——以 AT24C04为例
下一篇:i2c子系统之at24c02简介

推荐阅读最新更新时间:2024-03-16 16:08

I2C总线协议(AT24c02)程序
主:STC89C54 从: AT24C02 电路图 时序图 下面是代码 #include reg51.h #define uchar unsigned char #define addr_x 0xae // 写 #define addr_d 0xaf // 读 sbit sda = P2^1; //数据管脚 sbit scl = P2^0; //时钟管脚 bit ack; void DelayUs2x(unsigned char t)
[单片机]
<font color='red'>I2C</font>总线协议(<font color='red'>AT24c02</font>)程序
第47节:操作AT24C02利用定时器延时改善数码管的闪烁
开场白: 上一节在按键更改参数时,会出现短暂明显的数码管闪烁现象。这节通过教大家使用新型延时函数可以有效的改善闪烁现象。要教会大家三个知识点: 第一个:如何编写一气呵成的定时器延时函数。 第二个:如何编写检查EEPROM芯片是否存在短路,虚焊或者芯片坏了的监控程序。 第三个:经过网友 cjseng 的提醒,我建议大家以后在用EEPROM芯片时,如果单片机IO口足够多,WP引脚应该专门接一个IO口,并且加一个上拉电阻,需要更改EEPROM存储数据时置低,其他任何一个时刻都置高,这样可以更加有效地保护EEPROM内部数据不会被意外更改。 具体内容,请看源代码讲解。 (1)硬件平台: 基于朱兆祺51单片机学习板。旧版的朱兆祺51学
[单片机]
51单片机IO口模拟驱动AT24c02
#include reg51.h #include intrins.h void somenop() { uchar i=5; while(i--) { _nop_(); } } //8位扫描显示,共阳数码管 uchar shum ={ 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; void delaym() { uchar i; for(i=0;i 0xff;i++); } void init(); void star(); void stop(); void ack(); void write_byte(uchar
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved