详解AT24CXX驱动开发(linux platform tree - i2c应用)

这篇具有很好参考价值的文章主要介绍了详解AT24CXX驱动开发(linux platform tree - i2c应用)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

概述

1 认识AT24Cxx

1.1 AT24CXX的特性

1.2 AT24CXX描述

1.2.1 引脚

1.2.2 容量描述

1.2.3 设备地址

1.3 操作时序

1.3.1 写单个字节时序

1.3.2 写page字节时序

1.3.3 读取当前数据时序

1.3.4 随机读取数据

1.3.5 连续读取多个数据

2 驱动开发

2.1 硬件接口

2.2 代码实现

2.2.1 查看设备信息

2.2.2 编写代码

2.2.3 编写Makefile 

2.3 编译代码

3 测试

4 逻辑分析仪查看波形

4.1 写数据波形

4.2 读数据波形


概述

        本文以AT24C02为例,对该类型芯片做全面剖析,详细介绍该芯片的硬件特性和软件设计方面的方法和技巧,其中包括单字节的读和写,连续字节的读写方法、以I2C波形分析。并且在linux平台上,使用I2C接口,编写一个实用案例,实现该芯片的驱动程序。并使用逻辑分析仪工具,详尽解析其工作的波形。

1 认识AT24Cxx

1.1 AT24CXX特性

AT24CXX是一款可进行多次擦除和写数据的串行EEPROM,采用标准的I2C驱动方式,非常方便电路设计和软件程序的设计。总结其特点如下:

1)宽电压:该芯片的工作电压范围为 1.8V ~ 5.5V。可以满足不同MCU平台的设计要求。

2)写保护功能:AT24CXX提供一个引脚WP用于enable或者disable写数据功能,防止由于操作不当,导致存储数据被改写。

3)其可同时支持100K bit/s 和 400K bit/s.

使用时注意: 100 kHz (1.8V, 2.5V, 2.7V) , 400 kHz (5V)

4)使用寿命很长: 擦写次数可达到100 0000 次, 数据保存可达100年

1.2 AT24CXX硬件描述

1.2.1 引脚

          AT24CXX有很多类型,例如: AT24C02A/04A/08A/16A/32A 等待,单其封装形式,基本上一致。标准引脚如下表:

详解AT24CXX驱动开发(linux platform tree - i2c应用),芯片驱动分析,linux 驱动开发,驱动开发,linux

1)WP 为写保护引脚,当WP为低电平是,读写功能被enable;当WP为高电平时, 写数据功能被disable, 这时,只能进行读操作。

2)A0 ~ A2为 地址引脚,对于AT24C02,其可表达的地址空间为:000 ~ 111

AT24CXX芯片封装形式如下图:

详解AT24CXX驱动开发(linux platform tree - i2c应用),芯片驱动分析,linux 驱动开发,驱动开发,linux

1.2.2 容量描述

下面以 AT24C02A/04A/08A 为例,描述其存储空间

芯片型号 容量空间( bit) 页数( byte)
AT24C02A 2048 256
AT24C04A 4096 512
AT24C08A 8192 1024

1.2.3 设备地址

参看设备地址表,可知不同型号的芯片,其可使用的地址空间是不一样的。

详解AT24CXX驱动开发(linux platform tree - i2c应用),芯片驱动分析,linux 驱动开发,驱动开发,linux

1) AT24C02: A0A1A2三个地址引脚都可以使用,其可表达的地址范围为: 000 ~ 111

2) AT24C04: A2A1可用, 其可表达的地址范围为: 00 ~ 11

3) AT24C04: A2可用, 其可表达的地址范围为: 0 ~ 1

4) bit: R/W

(R/W)bit 位的值 含义
1 读数据
0 写数据

1.3 操作时序

1.3.1 写单个字节时序

下图为写一个字节的波形图形:

详解AT24CXX驱动开发(linux platform tree - i2c应用),芯片驱动分析,linux 驱动开发,驱动开发,linux

剖析操作步骤如下:

step - 1: Master SDA发起start信号

step - 2: Master 发送设备地址信息, 最低位 bit0 置位为 bit0=0,表示可进行写操作。

step - 3: AT24CXX 响应ACK

step - 4: Master 发送写数据的地址位

Step - 5: AT24CXX 响应ACK

Step - 6: Master 发送写数据

Step - 7: AT24CXX 响应ACK

step - 8: Master SDA发起stop信号

1.3.2 写page字节时序

下图为写一个page的波形图形:

详解AT24CXX驱动开发(linux platform tree - i2c应用),芯片驱动分析,linux 驱动开发,驱动开发,linux

剖析操作步骤如下:

step - 1: Master SDA发起start信号

step - 2: Master 发送设备地址信息, 最低位 bit0 置位为 bit0=0,表示可进行写操作。

step - 3: AT24CXX 响应ACK

step - 4: Master 发送写数据的起始地址

Step - 5: 连续发送数据

for( i = 0; i < n; i++)

{

      Master_send_data();

      Slave_response_ack();

}

step - 6: Master SDA发起stop信号

1.3.3 读取当前数据时序

下图为读当前地址的波形图形:

详解AT24CXX驱动开发(linux platform tree - i2c应用),芯片驱动分析,linux 驱动开发,驱动开发,linux

剖析操作步骤如下:

step - 1: Master SDA发起start信号

step - 2: Master 发送设备地址信息, 最低位 bit0 置位为 bit0=1,表示可进行读操作。

step - 3: AT24CXX 响应ACK

step - 4: AT24CXX 发送写数据

Step - 5: Master 发送NO ACK

step - 6: Master SDA发起stop信号

1.3.4 随机读取数据

下图为随机读取数据的波形图形:

详解AT24CXX驱动开发(linux platform tree - i2c应用),芯片驱动分析,linux 驱动开发,驱动开发,linux

剖析操作步骤如下:

step - 1: Master SDA发起start信号

step - 2: Master 发送设备地址信息, 最低位 bit0 置位为 bit0=1,表示可进行读操作。

step - 3: AT24CXX 响应ACK

step - 4: Master 发送读字节地址

Step - 5: AT24Cxx 响应ACK

Step - 6: AT24Cxx 发送数据

Step - 7: Master收到数据后,发送NO ACK

step - 8: Master SDA发起stop信号

1.3.5 连续读取多个数据

下图为连续读取多个数据的波形图形:

详解AT24CXX驱动开发(linux platform tree - i2c应用),芯片驱动分析,linux 驱动开发,驱动开发,linux

操作逻辑如下:

step - 1: Master SDA发起start信号

step - 2: Master 发送设备地址信息, 最低位 bit0 置位为 bit0=1,表示可进行读操作。

step - 3: AT24CXX 响应ACK

Step - 4: AT24Cxx 发送数据

for( i = 0; i < n; i++)

{

         at24cxx_send_data();

         master_response_ack();

}

Step - 5: Master发送NO ACK

step - 6: Master SDA发起stop信号

2 驱动开发

2.1 硬件接口

在板卡ATK-DL6Y2C上,I2C2的对应接口:

        pinctrl_i2c2: i2c2grp {
            fsl,pins = <
                MX6UL_PAD_UART5_TX_DATA__I2C2_SCL 0x4001b8b0
                MX6UL_PAD_UART5_RX_DATA__I2C2_SDA 0x4001b8b0
            >;
        };

详解AT24CXX驱动开发(linux platform tree - i2c应用),芯片驱动分析,linux 驱动开发,驱动开发,linux

硬件实物图:

详解AT24CXX驱动开发(linux platform tree - i2c应用),芯片驱动分析,linux 驱动开发,驱动开发,linux

AT24CXX硬件工作电路

详解AT24CXX驱动开发(linux platform tree - i2c应用),芯片驱动分析,linux 驱动开发,驱动开发,linux

2.2 代码实现

       本程序主要应用Linux platform 驱动下的I2C接口,在用户层调用read 和write 函数直接操作芯片。linux内核已经实现I2C相关的驱动程序。用户只需在.dts中配置参数即可。

2.2.1 查看设备信息

使用i2c-tools 查看系统的i2信息,然后在/proc/device-tree目录下查看板卡i2c device tree,使用如下命令:

cd /sys/bus/i2c/devices
ls

详解AT24CXX驱动开发(linux platform tree - i2c应用),芯片驱动分析,linux 驱动开发,驱动开发,linux

可以看见: AT24C02挂载I2C-1总线下,其地址位0x50

查看地址下设备名称

cat 1-0050/name

详解AT24CXX驱动开发(linux platform tree - i2c应用),芯片驱动分析,linux 驱动开发,驱动开发,linux

2.2.2 编写代码

 创建drv_15_at24cxx.c,并在该文件中编写驱动程序

/***************************************************************
Copyright  2024-2029. All rights reserved.
文件名     : test_15_at24cxx.c
作者       : tangmingfei2013@126.com
版本       : V1.0
描述       : 测试at24cxx驱动程序
其他       : 无
日志       : 初版V1.0 2024/02/15

***************************************************************/
#include <sys/types.h>
#include <sys/stat.h>
#include <linux/types.h>
#include <linux/i2c-dev.h>
#include <linux/i2c.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <stdlib.h>
#include <linux/fs.h>
#include <unistd.h>
#include <errno.h>
#include <assert.h>
#include <string.h>
#include <time.h>

#define i2c_dev                              "/dev/i2c-1"
#define AT24CXX_ADDR                         0x50


static int fd = -1;


static int at24cxx_drv_init(void)
{
    fd = open(i2c_dev, O_RDWR);
    if( fd < 0 )
    {
        close( fd );
        printf("%s %s i2c device open failure: %s\n",
         __FILE__, __FUNCTION__, strerror(errno));
        return -1;
    }

    ioctl(fd, I2C_TENBIT, 0);
    ioctl(fd, I2C_SLAVE, AT24CXX_ADDR);
    
    printf("init at24cxx!\r\n");
    return fd;
}


int read_page( unsigned char page, unsigned char *rbuff,  unsigned char length )
{
    unsigned char   tempbuff[1];
    int i = 0, ret;
    
    tempbuff[0] = page;  // address 
    ret = write(fd, tempbuff, 1);
    if( ret < 0 )
    {
       printf("%d %s %s i2c device write address fail: %s\n",
          __LINE__, __FILE__, __FUNCTION__, strerror(errno));
       close(fd);
       return -1;
    }
    
    ret = read(fd, rbuff, length);
    if( ret < 0 )
    {
        printf("%d %s %s i2c device read data fail: %s\n", 
         __LINE__ , __FILE__, __FUNCTION__, strerror(errno));
        close(fd);
        return -1;
    }
    printf(" read data to at24c02 in address = %d \r\n ", page);
    for( i=0; i< length; i++ )
    {
        printf(" %x \t ", rbuff[i]);
    }
    printf(" \r\n ");
    
    return 0;
}

int write_page(  unsigned char page,  unsigned char *buff, unsigned char len)
{
    unsigned char   tempbuff[len+1];
    int i = 0, ret;
    
    printf(" write data to at24c02 in address = %d \r\n ", page);
    // step-1: write 
    tempbuff[0] = page;
    for( i=1; i< sizeof(tempbuff); i++ )
    {
        tempbuff[i] = buff[i-1];
        printf(" %x \t ", tempbuff[i]);
    }
    printf(" \r\n ");
    
    ret = write(fd, tempbuff, sizeof(tempbuff));
    if( ret < 0 )
    {
       printf("%d %s %s i2c device write data failure: %s\n",
         __LINE__,  __FILE__, __FUNCTION__, strerror(errno));
       close(fd);
       return -1;
    }
    
    return 0;
}


int main(void)
{
    #define LEN    8
    unsigned startpage = 8;
    unsigned char buff[LEN];
    unsigned char rbuff[LEN];
    int i = 0, index = 0, j= 0;
    
    fd = at24cxx_drv_init();
    
    for( j=0; j < 5; j++ )
    {
        // write data 
        for(i = 0; i < sizeof( buff); i++ )
        {
            buff[i] = 0x20 + index;
            index++;
        }
        
        write_page( startpage, buff, sizeof( buff)); 
        printf(" \r\n \r\n ");
        startpage += 8;
        usleep(20000);   //20ms 
    }
   
    startpage = 8;
    for( j=0; j < 5; j++ )
    {
        read_page( startpage, rbuff, sizeof( rbuff));
        printf(" \r\n \r\n ");
        startpage += 8;
        usleep(20000); //20ms 
    }
    
    return 0;
}




2.2.3 编写Makefile 

创建Makefile文件,编写代码

CFLAGS= -Wall -O2
CC=/home/ctools/gcc-linaro-4.9.4-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc
STRIP=/home/ctools/gcc-linaro-4.9.4-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-strip


test_15_at24cxx: test_15_at24cxx.o
	$(CC) $(CFLAGS) -o test_15_at24cxx test_15_at24cxx.o
	$(STRIP) -s test_15_at24cxx

clean:
	rm -f test_15_at24cxx test_15_at24cxx.o

2.3 编译代码

       使用Make命令编译代码,然后将生成的执行文件copy到NFS下的共享目录中,方便在板卡中执行代码:

详解AT24CXX驱动开发(linux platform tree - i2c应用),芯片驱动分析,linux 驱动开发,驱动开发,linux

在板卡中可以看见:

详解AT24CXX驱动开发(linux platform tree - i2c应用),芯片驱动分析,linux 驱动开发,驱动开发,linux

3 测试

在板卡中运行程序后,可以看见:

详解AT24CXX驱动开发(linux platform tree - i2c应用),芯片驱动分析,linux 驱动开发,驱动开发,linux

4 逻辑分析仪查看波形

4.1 写数据波形

以连续写多个数据为例,分析芯片的驱动波形:

1)写地址波形

详解AT24CXX驱动开发(linux platform tree - i2c应用),芯片驱动分析,linux 驱动开发,驱动开发,linux

2)写数据波形

 详解AT24CXX驱动开发(linux platform tree - i2c应用),芯片驱动分析,linux 驱动开发,驱动开发,linux

3)Stop 信号

详解AT24CXX驱动开发(linux platform tree - i2c应用),芯片驱动分析,linux 驱动开发,驱动开发,linux

4.2 读数据波形

以连续读多个数据为例,分析芯片的驱动波形:

1)写起始地址

详解AT24CXX驱动开发(linux platform tree - i2c应用),芯片驱动分析,linux 驱动开发,驱动开发,linux

3) 读数据byte

详解AT24CXX驱动开发(linux platform tree - i2c应用),芯片驱动分析,linux 驱动开发,驱动开发,linux 4) 结束波形

详解AT24CXX驱动开发(linux platform tree - i2c应用),芯片驱动分析,linux 驱动开发,驱动开发,linux文章来源地址https://www.toymoban.com/news/detail-835639.html

到了这里,关于详解AT24CXX驱动开发(linux platform tree - i2c应用)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • AT24C02(I2C总线)通信的学习

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 学习AT24C02(I2C总线)芯片 RAM()存储速度较快,但容易丢失数据。ROM(Read Only Memory)存储速度较慢,但掉电不丢失数据。在使用时需要两者结合先存入RAM再转存到ROM中。 AT24C02是一种可以实现掉电不丢失

    2024年02月20日
    浏览(37)
  • STM32-I2C通信在AT24C02的应用

    AT24C02是一种失去电源供给后依旧能保持数据的储存器,常用来储存一些配置信息,在系统重新上电之后也可以加载。它的容量是2k bit的EEPROM存储器,采用I2C通信方式。 AT24C02支持两种写操作:字节写操作和页写操作。本实验中我们采用的是字节写操作,就是一个地址一个数据

    2024年02月09日
    浏览(37)
  • 【51单片机】AT24C20数据帧(I2C总线)

    🎊专栏【51单片机】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【Love Story】 🥰大一同学小吉,欢迎并且感谢大家指出我的问题🥰 小吉先向大家道个歉,因为最近在期末突击,所以文章久久没有更新,也请大家多多见谅😥 目录   🎁I2C总线 🏳️‍🌈

    2024年02月08日
    浏览(56)
  • 51单片机——模拟I2C总线与AT24C02通信

    目录 一、写在前面 二、功能描述 三、主要模块介绍 3.1 I2C总线介绍 3.2 I2C总线协议 3.2.1数据有效规定 3.2.2起始信号和停止信号  3.2.3 发送应答和接收应答 3.2.4 主机发送一个字节和接收一个字节 3.3 AT24C02介绍 3.3 字节写和随机读 四、测试文件test.c 五、现象描述 AT24C02芯片有I

    2024年02月14日
    浏览(42)
  • 【STM32】AT24C256硬件I2C读写,基于HAL库

    目录 一、简单介绍 二、配置工程 打开CubeMX,配置时钟,调试接口,工程名,目录等 配置iic 配置串口用于显示信息 三、硬件连接 四、代码编写 一、随机写入一个字节 测试代码 波形如下 代码编写 二、连续写入 代码如下 三、随机读取 测试代码 波形如下 代码编写 四、连续

    2024年02月03日
    浏览(39)
  • STM32基于HAL工程硬件I2C读写AT24C02/04/08数据

    ✨申明:本文章仅发表在CSDN网站,任何其他网站,未注明来源,见此内容均为盗链和爬取,请多多尊重和支持原创! 🍁对于文中所提供的相关资源链接将作不定期更换。 相关篇针对AT24C32及以上容量《STM32基于STM32-HAL工程硬件I2C读取AT24Cxx数据》 🎯本工程使用STM32F103VE+AT24C02实

    2023年04月11日
    浏览(40)
  • Linux驱动开发(I2C系统的重要结构体)

    本篇文章来讲解I2C系统的重要结构体,了解这些结构体对于编写I2C驱动来说是至关重要的,所以要想编写好一个I2C驱动程序那么就必须先了解这些结构体。 这里使用百问网的一张图片来讲解: 一个芯片中可以有多个I2C控制器,并且一个I2C控制器可以控制多个设备。那么在对

    2024年02月07日
    浏览(33)
  • Linux驱动开发之i2c框架讲解到例程

            本篇章在rk3399平台上,基于设备树的i2c驱动开发。i2c直接使用硬件i2c总线,体系结构分为3部分:I2C 核心、I2C 总线驱动和I2C 设备驱动。 I2C 核心 (i2c-core.c)提供了I2C 总线驱动和设备驱动的注册、注销方法等。我们主要了解Linux中i2c的基本框架,分为 i2c主机驱动开发

    2024年02月02日
    浏览(33)
  • linux i2c驱动开发之最简单入门:设备树与驱动的匹配

    1在设备树中声明我们的模拟I2C设备: i2c的设备加入是必须放在某个i2c的总线下面的,我们这里是放在 i2c7下面。 可以直接在设备树搜索i2c7,然后把status 修改为okay,然后再加入设备信息. 这里我们指定和驱动匹配的字符串是 myi2c-dev,在bus segment 上分配的地址是 0x70 。 当然这

    2024年02月16日
    浏览(33)
  • Linux设备驱动开发学习笔记(等待队列,锁,字符驱动程序,设备树,i2C...)

    container_of函数可以通过结构体的成员变量检索出整个结构体 函数原型: 内核开发者只实现了循环双链表,因为这个结构能够实现FIFO和LIFO,并且内核开发者要保持最少代码。 为了支持链表,代码中要添加的头文件是linux/list.h。内核中链表实现核心部分的数据结构 是struct li

    2024年01月22日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包