当前位置: 首页 > news >正文

兰州网站排名推广天河网站建设方案

兰州网站排名推广,天河网站建设方案,国外开网站怎样做平帐,广州有哪些广告公司本小节介绍两个在linux应用层访问eeprom的方法#xff0c;并给出示例代码方便大家理解。第一个方法是通过sysfs文件系统对eeprom进行访问#xff0c;第二个方法是通过eeprom的设备文件进行访问。这两个方法分别对应了i2c设备驱动的两个不同的实现#xff0c;在后面的小结会详… 本小节介绍两个在linux应用层访问eeprom的方法并给出示例代码方便大家理解。第一个方法是通过sysfs文件系统对eeprom进行访问第二个方法是通过eeprom的设备文件进行访问。这两个方法分别对应了i2c设备驱动的两个不同的实现在后面的小结会详细的分析。 我们嵌入式系统中的E2PROM 是 24C02.先简单了解一下这款芯片AT24C02的存储容量为2Kb内容分成32页每页8B共256B操作时有两种寻址方式芯片寻址和片内子地址寻址。 1芯片寻址AT24C02的芯片地址为1010其地址控制字格式为 1010A2A1A0R/W。其中A2A1A0可编程地址选择位。A2A1A0引脚接高、 低电平后得到确定的三位编码与1010形成7位编码 即为该器件的地址码。R/W为芯片读写控制位该位为0表示芯片进行写操作。 2片内子地址寻址芯片寻址可对内部256B中的任一个进行读/写操作其寻址范围为00~FF共256个寻址单位。1. 通过sysfs文件系统访问I2C设备 eeprom的设备驱动在/sys/bus/i2c/devices/0-0050/目录下把eeprom设备映射为一个二进制节点文件名为eeprom。对这个eeprom文件的读写就是对eeprom进行读写。 我们可以先用cat命令来看下eeprom的内容。 [rootFORLINX210]# cat eeprom X1212 发现里面都是乱码然后用echo命令把字符串“test”输入给eeprom文件然后再cat出来。 [rootFORLINX210]# echo test eeprom [rootFORLINX210]# cat eeprom test X12341234 就会发现字符串test已经存在eeprom里面了我们知道sysfs文件系统断电后就没了也无法对数据进行保存为了验证确实把“test”字符串存储在了eeprom可以把系统断电重启然后cat eeprom会发现test还是存在的证明确实对eeprom进行了写入操作。 当然因为eeprom已经映射为一个文件了我们还可以通过文件I/O写应用程序对其进行简单的访问测试。比如以下程序对特定地址0x40写入特定数据Hi,this is an eepromtest!然后再把写入的数据在此地址上读出来。 #includestdio.h #includestdlib.h #includesys/types.h #includesys/stat.h #includefcntl.h #includestring.hint main(void){int fd, size, len, i;char buf[50] {0};char *bufwHi,this is an eepromtest!;//要写入的数据lenstrlen(bufw);//数据长度fd open(/sys/bus/i2c/devices/0-0050/eeprom,O_RDWR);//打开文件if(fd 0){printf(####i2c test device open failed####/n);return(-1);}//写操作lseek(fd,0x40,SEEK_SET); //定位地址地址是0x40if((sizewrite(fd,bufw, len))0)//写入数据{printf(write error\n);return 1;}printf(writeok\n);//读操作lseek(fd,0x40, SEEK_SET);//准备读首先定位地址因为前面写入的时候更新了当前文件偏移量所以这边需要重新定位到0x40.if((sizeread(fd,buf,len))0)//读数据{printf(readerror\n);return 1;}printf(readok\n);for(i0; i len; i)printf(buff[%d]%x\n,i, buf[i]);//打印数据close(fd);return 0; }12345678910111213141516171819202122232425262728293031323334353637383940411234567891011121314151617181920212223242526272829303132333435363738394041 2. 通过devfs访问I2C设备 linux的i2c驱动会针对每个i2c适配器在/dev/目录下生成一个主设备号为89的设备文件简单的来说对于本例的eeprom驱动/dev/i2c/0就是它的设备文件因此接下来的eeprom的访问就变为了对此设备文件的访问。 我们需要用到两个结构体i2c_msg和i2c_rdwr_ioctl_data。 struct i2c_msg { //i2c消息结构体每个i2c消息对应一个结构体__u16 addr; /* 从设备地址此处就是eeprom地址即0x50 */__u16 flags; /* 一些标志比如i2c读等*/__u16 len; /* i2c消息的长度 */__u8 *buf; /* 指向i2c消息中的数据 */}; 12345671234567 struct i2c_rdwr_ioctl_data {struct i2c_msg __user *msgs; /* 指向一个i2c消息 */__u32 nmsgs; /* i2c消息的数量 */}; 1234512345 对一个eeprom上的特定地址0x10写入特定数据0x58并在从此地址读出写入数据的示例程序如下所示。 #include stdio.h #include linux/types.h #include stdlib.h #include fcntl.h #include unistd.h #include sys/types.h #include sys/ioctl.h #include errno.h #include linux/i2c.h #include linux/i2c-dev.hint main() {int fd,ret;struct i2c_rdwr_ioctl_data e2prom_data;fdopen(/dev/i2c/0,O_RDWR);//打开eeprom设备文件结点if(fd0){perror(open error);}e2prom_data.nmsgs2; e2prom_data.msgs(struct i2c_msg*)malloc(e2prom_data.nmsgs*sizeof(struct i2c_msg));//分配空间if(!e2prom_data.msgs){perror(malloc error);exit(1);}ioctl(fd,I2C_TIMEOUT,1);/*超时时间*/ioctl(fd,I2C_RETRIES,2);/*重复次数*//*写eeprom*/e2prom_data.nmsgs1;//由前面eeprom读写分析可知写eeprom需要一条消息(e2prom_data.msgs[0]).len2; //此消息的长度为2个字节第一个字节是要写入数据的地址第二个字节是要写入的数据(e2prom_data.msgs[0]).addr0x50;//e2prom 设备地址(e2prom_data.msgs[0]).flags0; //写(e2prom_data.msgs[0]).buf(unsigned char*)malloc(2);(e2prom_data.msgs[0]).buf[0]0x10;// e2prom 写入目标的地址(e2prom_data.msgs[0]).buf[1]0x58;//写入的数据retioctl(fd,I2C_RDWR,(unsigned long)e2prom_data);//通过ioctl进行实际写入操作后面会详细分析if(ret0){perror(ioctl error1);}sleep(1);/*读eeprom*/e2prom_data.nmsgs2;//读eeprom需要两条消息(e2prom_data.msgs[0]).len1; //第一条消息实际是写eeprom需要告诉eeprom需要读数据的地址因此长度为1个字节(e2prom_data.msgs[0]).addr0x50; // e2prom 设备地址(e2prom_data.msgs[0]).flags0;//先是写(e2prom_data.msgs[0]).buf[0]0x10;//e2prom上需要读的数据的地址(e2prom_data.msgs[1]).len1;//第二条消息才是读eeprom(e2prom_data.msgs[1]).addr0x50;// e2prom 设备地址 (e2prom_data.msgs[1]).flagsI2C_M_RD;//然后是读(e2prom_data.msgs[1]).buf(unsigned char*)malloc(1);//存放返回值的地址。(e2prom_data.msgs[1]).buf[0]0;//初始化读缓冲读到的数据放到此缓冲区retioctl(fd,I2C_RDWR,(unsigned long)e2prom_data);//通过ioctl进行实际的读操作if(ret0){perror(ioctl error2);}printf(buff[0]%x\n,(e2prom_data.msgs[1]).buf[0]);/***打印读出的值没错的话就应该是前面写的0x58了***/close(fd);return 0; }123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 3. 总结 本小节介绍了两种在linux应用层访问eeprom的方法并且给出了示例程序通过sysfs文件系统访问eeprom操作简单无需了解eeprom的硬件特性以及访问时序而通过devfs访问eeprom的方法则需要了解eeprom的读写时序。 后面分析后会发现第一种通过sysfs文件系统的二进制结点访问eeprom的方法是由eeprom的设备驱动实现的是一种专有的方法而第二种通过devfs访问eeprom的方法是linux i2c提供的一种通用的方法访问设备的能力有限。
http://www.huolong8.cn/news/66737/

相关文章:

  • 莱州网站建设公司电话上海专业做网站公司有哪些
  • 长沙医考网站建设公司成都网站建设金网科技
  • 昌平做网站公司网站建设设计有哪些
  • 网站做以后怎么修改网站内容汕头网站设计怎么做
  • 广 做网站蓝光电影下载最美情侣视频免费观看完整版高清
  • 移动网站开发实训报告开跨境电商的店需要多少钱
  • 网站专业销售团队介绍加密网站
  • 甜水园网站建设wordpress主题站模板下载
  • 空投糖果网站开发重庆低价网站建设
  • 对运营网站有什么见解楚雄seo
  • 云南哪几个建网站公司中国制造网外贸站
  • 北京网站设计公司兴田德润怎么样网站页面文案
  • 怎么制作网站来赚钱空间域名
  • 手机网站建设怎么样长春移动网站建设
  • 整站下载器 做网站地图seo技巧课程
  • 怎么提高网站浏览量山西省建设厅网站打不开
  • 众筹网站开发分析报告百度做网站骗人到哪里去投诉
  • uemo网站源码专业网站开发公司
  • 手机网站居中显示wordpress的文件权限
  • 网站 做 app开发工具海南住房与建设厅网站
  • 东莞网站网站建设桂林商品房做民宿在哪个网站登记好
  • 什么网站可以做装修效果图济南建站公司模板
  • 学校网站如何做百度关键词搜索排名
  • 快速网站排名提升厦门做个网站多少钱
  • 网站开发建设推荐用书贵州省建设局网站
  • 北大青鸟网站开发餐饮网页设计模板
  • 如何做资源论坛网站手机之家报价大全
  • 泉州优化怎么做seo天机seo
  • 站内推广装饰公司网站模板
  • 网站后台怎么建设网站建设推广服务合同范本