tiny6410在I2c用户态中的程序设计eeprom

在读写的过程中,发现写数据成功但是读取数据却失败,猜测是因为iic的读写操作过快,故在写操作后给一定的延迟,进而读写成功。

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <linux/types.h>

struct i2c_msg {
 unsigned short addr; /* slave address   */
 unsigned short flags;
 unsigned short len;  /* msg length    */
 unsigned char *buf;  /* pointer to msg data   */
};

struct i2c_rdwr_ioctl_data {
 struct i2c_msg *msgs; /* pointers to i2c_msgs */
 unsigned int nmsgs;   /* number of i2c_msgs */
};

#define I2C_RDWR 0x0707 /* Combined R/W transfer (one STOP only) */

int main()
{
 int fd;
 struct i2c_rdwr_ioctl_data eeprom_data;
 //1. 打开设备文件
 fd = open( "/dev/i2c-0", O_RDWR );
 if( fd == -1 )
 {
  printf("error open failed\r\n"); 
  return ;
 }
 
 //2. 构造写数据到eeprom的消息
 eeprom_data.msgs = (struct i2c_msg *)malloc( 2*sizeof(struct i2c_msg) );
 
 eeprom_data.nmsgs = 1;
 eeprom_data.msgs[0].len = 2;
 eeprom_data.msgs[0].addr = 0x50;
 eeprom_data.msgs[0].flags = 0;
 eeprom_data.msgs[0].buf = (unsigned char *)malloc(2);
 eeprom_data.msgs[0].buf[0] = 0x10;
 eeprom_data.msgs[0].buf[1] = 0x60;
 
 //3. 使用ioctl写入数据
 if( 0>ioctl( fd, I2C_RDWR, (unsigned long)&eeprom_data))
 {
  printf("error write\n");
  return ;
 }
 sleep(1);
 //4. 构造从eeprom读取数据的消息
 eeprom_data.nmsgs = 2;
 eeprom_data.msgs[0].len = 1;
 eeprom_data.msgs[0].addr = 0x50;
 eeprom_data.msgs[0].flags = 0;
 eeprom_data.msgs[0].buf[0] = 0x10;
 
 eeprom_data.msgs[1].len = 1;
 eeprom_data.msgs[1].addr = 0x50;
 eeprom_data.msgs[1].flags = 1;
 eeprom_data.msgs[1].buf = (unsigned char *)malloc(2);
 eeprom_data.msgs[1].buf[0] = 0;
 //5. 使用ioctl读出数据
 if( -1 == ioctl( fd, I2C_RDWR, (unsigned long)&eeprom_data))
 {
  printf("error read\n");
  return ;
 }
 
 printf("buff[0]=%x\n",eeprom_data.msgs[1].buf[0]);
 
 //6. 关闭设备
 close(fd);
 
}

上一篇:36深入理解C指针之---结构体的内存处理


下一篇:李洪强iOS开发之OC点语法和变量作用域