在线时间234 小时
UID3301905
注册时间2017-1-8
NXP金币131
TA的每日心情 | 开心 2018-4-20 15:04 |
---|
签到天数: 8 天 [LV.3]偶尔看看II
金牌会员
- 积分
- 2972
- 最后登录
- 2023-7-24
|
本帖最后由 donatello1996 于 2018-7-18 23:25 编辑
在Linux的嵌入式系统中,通常都会预先安装一个甚至多个的I2C设备树,这样,Linux嵌入式系统要与I2C从机通信甚至要比单片机更简单。首先,我们可以在/dev目录下找到跟I2C通信总线有关的文件:
如图,在米尔IOT板子里面,I2C-1被启用,然后查阅官方文档可得知,I2C-1总线对应开发板的I2C_2的一组引脚:
然后,我们就可以将这组引脚连上一个I2C外设,这里我连上一个通信方式非常简单的I2C外设——DS3231:
连上之后,我们就可以使用
命令查看DS3231设备:
我们都知道DS3231的器件从机地址就是0x68,因此,这个0x68就是DS3231:
然后,我们可以用
将DS3231的内容导出:
在DS3231中,0x00-0x06这7个寄存器对应秒、分、时、星期、日期、月、年,我们再dump一次看看读数变化:
可以看到现在的时间是00:03:09,因为我的DS3231没有装纽扣电池,因此没有掉电保存功能,不供电的时候不走时。
在Linux中,读写I2C外设数据的方式均是通过ioctl函数,用户可通过这个函数访问内核存储空间,其中ioctl函数的第一个参数是文件号,这个参数
决定ioctl函数访问哪个设备的存储空间,如:
即为访问/dev/i2c-1的存储空间。另外,在Linux中,对I2C器件的相关操作和结构体/宏定义等保存在
两个头文件中,添加头文件路径,即可支持
- struct i2c_rdwr_ioctl_data XXX;
复制代码
i2c_rdwr_ioctl_data结构体,里面存放了与I2C通信有关的数据,如器件地址,读/写位,读/写长度等。
看看程序:- if ((i2c1_fd=open("/dev/i2c-1",O_RDWR))<0)
- {
- printf("Fail to open I2C device\n");
- return 0;
- }
- pcf8951_data.nmsgs=2;
- pcf8951_data.msgs=(struct i2c_msg*)malloc(pcf8951_data.nmsgs*sizeof(struct i2c_msg));
- if(!pcf8951_data.msgs)
- {
- printf("malloc error\n");
- return 0;
- }
- Clear_Screen(0xff00ffff);
- LCD_Effect();
- while(1)
- {
- /*
- if (read(keys_fd, &t, sizeof(t)) == sizeof(t))
- {
- if(t.type==EV_KEY)
- if(t.value==0)
- system("echo 0 > /sys/class/gpio/gpio9/value");
- else if(t.value==1)
- system("echo 1 > /sys/class/gpio/gpio9/value");
- }
- */
- pcf8951_data.nmsgs=2;
- (pcf8951_data.msgs[0]).len=1;
- (pcf8951_data.msgs[0]).addr=I2C_ADDR;
- (pcf8951_data.msgs[0]).flags=0;
- (pcf8951_data.msgs[0]).buf=(unsigned char*)malloc(1);
- (pcf8951_data.msgs[0]).buf[0]=0x00;
- (pcf8951_data.msgs[1]).len=7;
- (pcf8951_data.msgs[1]).addr=I2C_ADDR;
- (pcf8951_data.msgs[1]).flags=I2C_M_RD;
- (pcf8951_data.msgs[1]).buf=(unsigned char*)malloc(7);
- (pcf8951_data.msgs[1]).buf[0]=0;
- (pcf8951_data.msgs[1]).buf[1]=0;
- (pcf8951_data.msgs[1]).buf[2]=0;
- (pcf8951_data.msgs[1]).buf[3]=0;
- (pcf8951_data.msgs[1]).buf[4]=0;
- (pcf8951_data.msgs[1]).buf[5]=0;
- (pcf8951_data.msgs[1]).buf[6]=0;
- if(ioctl(i2c1_fd,I2C_RDWR,&pcf8951_data)<0)
- continue;
- sec=BCDtoBYTE((pcf8951_data.msgs[1]).buf[0]);
- min=BCDtoBYTE((pcf8951_data.msgs[1]).buf[1]);
- hour=BCDtoBYTE((pcf8951_data.msgs[1]).buf[2]);
- day=BCDtoBYTE((pcf8951_data.msgs[1]).buf[3]);
- month=BCDtoBYTE((pcf8951_data.msgs[1]).buf[4]);
- year=BCDtoBYTE((pcf8951_data.msgs[1]).buf[5]);
- Show_ASCII(122,10,0,0xff00ffff,sec%10+'0');
- Show_ASCII(106,10,0,0xff00ffff,sec/10+'0');
- Show_ASCII(90,10,0,0xff00ffff,':');
- Show_ASCII(74,10,0,0xff00ffff,min%10+'0');
- Show_ASCII(58,10,0,0xff00ffff,min/10+'0');
- Show_ASCII(42,10,0,0xff00ffff,':');
- Show_ASCII(26,10,0,0xff00ffff,hour%10+'0');
- Show_ASCII(10,10,0,0xff00ffff,hour/10+'0');
- LCD_Effect();
- usleep(100*1000);
- }
复制代码 看看效果:
|
|