• 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 "); 
      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 ");
      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 ");
      return ;
     }
     
     printf("buff[0]=%x ",eeprom_data.msgs[1].buf[0]);
     
     //6. 关闭设备
     close(fd);
     
    }

  • 相关阅读:
    迁移学习
    GAN
    PCA
    LSTM
    hdu 1754 I Hate It 线段树
    hdu 4292 Food 最大流
    hdu 2222 Keywords Search AC自动机
    hdu 3572 Task Schedule hdu 2883 kebab 最大流
    poj 1966 Cable TV Network 点连通度
    hdu 2236 匹配
  • 原文地址:https://www.cnblogs.com/ynxf/p/5284342.html
Copyright © 2020-2023  润新知