zoukankan      html  css  js  c++  java
  • 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);
     
    }

  • 相关阅读:
    查询剩余存储空间
    1090. Highest Price in Supply Chain (25) -计层的BFS改进
    1079. Total Sales of Supply Chain (25) -记录层的BFS改进
    1076. Forwards on Weibo (30)
    1098. Insertion or Heap Sort (25)
    1077. Kuchiguse (20)
    (一二四)tableView的多组数据展示和手动排序
    1096. Consecutive Factors (20)
    (一二三)基于GCD的dispatch_once实现单例设计
    1084. Broken Keyboard (20)
  • 原文地址:https://www.cnblogs.com/ynxf/p/5284342.html
Copyright © 2011-2022 走看看