[i.MX] i2c测试

[复制链接]
 楼主| rlini 发表于 2015-2-4 10:20 | 显示全部楼层 |阅读模式
各位好,在使用IMX6DL测试I2C时候老是出错,请问各位有过这方面的经验或者有相关的代码吗,谢谢。我在网上找的代码如下:
  1. int main(int argc, char **argv)  
  2. {  
  3.     struct i2c_rdwr_ioctl_data e2prom_data;  
  4.     unsigned int fd;  
  5.     unsigned int slave_address, reg_address,value;   
  6.     //slave_address为eeprom的地址,reg_address为eeprom中存储单元的地址,范围0x0--0xFFFFFFFF,value为你要写进eeprom的值  
  7.     int ret;  
  8.        
  9.     if (argc < 5){  
  10.         printf("Usage:\n%s /dev/i2c/x start_addr reg_addr value\n",argv[0]);  
  11.         return 0;  
  12.     }  
  13.        
  14.     fd = open(argv[1], O_RDWR);  
  15.        
  16.     if (!fd){  
  17.         printf("Error on opening the device file\n");  
  18.         return 0;  
  19.     }  
  20.        
  21.     sscanf(argv[2], "%x", &slave_address);  
  22.     sscanf(argv[3], "%x", &reg_address);  
  23.     sscanf(argv[4], "%x", &value);  
  24.        
  25.     e2prom_data.nmsgs = 2;//因为都时序要两次,所以设为2  
  26.     e2prom_data.msgs = (struct i2c_msg *)malloc(e2prom_data.nmsgs * sizeof(struct i2c_msg));  
  27.     if (!e2prom_data.msgs){  
  28.         printf("Memory alloc error\n");  
  29.         close(fd);  
  30.         return 0;  
  31.     }  
  32.        
  33.     ioctl(fd, I2C_TIMEOUT, 2);//设置超时时间  
  34.     ioctl(fd, I2C_RETRIES, 1);//设置重发次数  
  35.        
  36.     /* write data to e2prom*/  
  37.     e2prom_data.nmsgs = 1;  
  38.     e2prom_data.msgs[0].len = 2;//信息长度为2,看写时序,eeprom的地址不算的,因为付给了addr,而len是指buf中的值的个数  
  39.     e2prom_data.msgs[0].addr = slave_address;  
  40.     e2prom_data.msgs[0].flags = 0;//写命令  
  41.     e2prom_data.msgs[0].buf = (unsigned char*)malloc(2);  
  42.     e2prom_data.msgs[0].buf[0] = reg_address;//信息值1 eeprom中存储单元的地址,即你要往哪写  
  43.     e2prom_data.msgs[0].buf[1] = value;//信息值2,即你要写什么  
  44.        
  45.     ret = ioctl (fd, I2C_RDWR, (unsigned long)&e2prom_data);//好了 ,写进去吧  
  46.     if (ret < 0){  
  47.         printf ("ioctl write error\n");  
  48.     }  
  49.        
  50.     printf("you have write %02x into e2prom at %02x address\n",value,reg_address);  
  51.        
  52.     sleep(1);  
  53.     /*read data from e2prom*/  
  54.     e2prom_data.nmsgs = 2;//读时序要两次过程,要发两次I2C消息  
  55.     e2prom_data.msgs[0].len = 1;//信息长度为1,第一次只写要读的eeprom中存储单元的地址  
  56.     e2prom_data.msgs[0].addr = slave_address;  
  57.     e2prom_data.msgs[0].flags = 0;//写命令,看读时序理解  
  58.     e2prom_data.msgs[0].buf[0] = reg_address;//信息值  
  59.        
  60.     e2prom_data.msgs[1].len = 1;  
  61.     e2prom_data.msgs[1].addr = slave_address;  
  62.     e2prom_data.msgs[1].flags = I2C_M_RD;//读命令  
  63.     e2prom_data.msgs[1].buf = (unsigned char*)malloc(1);  
  64.     e2prom_data.msgs[1].buf[0] = 0;//先清空要读的缓冲区  
  65.     ret = ioctl (fd, I2C_RDWR, (unsigned long)&e2prom_data);//好了,读吧  
  66.     if (ret < 0){  
  67.         printf ("ioctl read error\n");  
  68.     }  
  69.        
  70.     printf("read %02x from e2prom address %02x\n",e2prom_data.msgs[1].buf[0], reg_address);  
  71.        
  72.     close(fd);  
  73.     return 0;     
  74. }  
 楼主| rlini 发表于 2015-2-4 15:13 | 显示全部楼层
版主,能不能帮忙看看。。。
FSL_TICS_Rita 发表于 2015-2-5 17:23 | 显示全部楼层
楼主你好,请问你这里使用的是哪块板子?BSP是哪个版本的?
 楼主| rlini 发表于 2015-2-6 09:12 | 显示全部楼层

版主,您好。我的板子型号是 MCIMX6DLAICPU1,源代码的版本安装ltib,其版本是L3.0.35_4.1.0_130816_source
FSL_TICS_Rita 发表于 2015-2-9 18:38 | 显示全部楼层
rlini 发表于 2015-2-6 09:12
版主,您好。我的板子型号是 MCIMX6DLAICPU1,源代码的版本安装ltib,其版本是L3.0.35_4.1.0_130816_source ...

楼主你好,请问你这里是如何测试I2C的呢?
FSL_TICS_Rita 发表于 2015-2-13 12:56 | 显示全部楼层
楼主你好,关于i2c的测试,你可以使用BSP中提供的unit_test中的mxc_i2c_test来测试i2c。
ccw1986 发表于 2015-2-28 16:43 | 显示全部楼层
谢谢你的分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

8

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部