读24cxx EEPROM

读写EEPROM

EPPROM使用的是ST的M24C64芯片,MCU使用的是NXP的RT1051芯片,所以以下代码用的是NXP提供的fsl库和STM32的库略有不同。

IIC初始化

使用单片机硬件IIC接口,只需要配置时钟,引脚,设置波特率,其他获取默认设置就可以使用了。若芯片没有接到单片机的IIC接口用GPIO模拟IIC时序也可以实现功能,但是需要在对应时序加临界区保护。

IIC时序

使用硬件IIC可以跳过本部分内容。

开始结束时序

IIC开始时序和结束时序如图1所示:
IIC时序

图1 IIC开始和结束符
开始时序: SCL高电平时,拉低SDA 结束时序:先拉高SCL,然后拉高SDA ### 数据发送

数据发送

图2 数据传输
因为这是个从站芯片,所以DATA IN和OUT相对于单片机来说是反的,即单片机输出是从站芯片的输入。SCL拉高后,根据数据拉高或者拉低SDA电平。bit9是等待从站发送的ACK

芯片地址

芯片地址

图3 芯片地址
24系列高4位是产商固定的1010,A2-A0这三位取决于硬件,若都是接地就是000,若A0接上拉电阻,其他接地则是001。最后一位1代表读,0代表写.

使用硬件IIC的需要注意,在配置结构体中地址可能需要右移一位,读写会在结构体另外参数配置,库函数中会拼接成一个字节的。需要关注一下库函数怎么实现的,这个坑我也踩了一会。

读写EEPROM

这个只需要参考数据手册的时序图发送或者接受数据就ok了,野火的教程中比较详细。正点原子的比较简单好懂。但是一定要看数据收册!一定要看数据收册!数据收册!
写数据时序图

图4 写数据时序图

踩的坑

一个非常简单的读写EEPROM的实验,因为硬件正好是IIC引脚所以准备直接用,不用模拟的IIC,在正点原子和野火几乎每个开发板都有IIC的实验,所以我直接用了里面的代码,但是发现读回来都是0xFF,然后百度了一下有个老哥说需要配置引脚为开漏输出,不然M24C64的引脚拉不下去。我照着修改了配置,发现并不行。

u8 AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite)
{	
    u8 status=0;
    u8 writedata=0;
    
    writedata=DataToWrite;
    
    //配置I2C xfer结构体
    at24cxx_xfer.slaveAddress=AT24C02_ADDR;     //设备地址
    at24cxx_xfer.direction=kLPI2C_Write;        //写入数据
    at24cxx_xfer.subaddress=(u32)WriteAddr;     //要读取的寄存器地址
    at24cxx_xfer.subaddressSize=1;              //地址长度一个字节
    at24cxx_xfer.data=&writedata;               //要写入的数据
    at24cxx_xfer.dataSize=1;                    //写入数据长度1个字节
    at24cxx_xfer.flags=kLPI2C_TransferDefaultFlag;
    
    if(LPI2C_MasterTransferBlocking(LPI2C1,&at24cxx_xfer)==kStatus_Fail)
        status=1;
    
    delay_ms(10);      //AT24C02写周期最大5ms,所以这里要有延时
    return status;	 
}

然后看了下官方fsl库函数里面的定义的也就这几个东西,并不是因为缺少配置才导致读取失败。

struct _lpi2c_master_transfer
{
    uint32_t
        flags; /*!< Bit mask of options for the transfer. See enumeration #_lpi2c_master_transfer_flags for available
                  options. Set to 0 or #kLPI2C_TransferDefaultFlag for normal transfers. */
    uint16_t slaveAddress;       /*!< The 7-bit slave address. */
    lpi2c_direction_t direction; /*!< Either #kLPI2C_Read or #kLPI2C_Write. */
    uint32_t subaddress;         /*!< Sub address. Transferred MSB first. */
    size_t subaddressSize;       /*!< Length of sub address to send in bytes. Maximum size is 4 bytes. */
    void *data;                  /*!< Pointer to data to transfer. */
    size_t dataSize;             /*!< Number of bytes to transfer. */
};

度娘上也有好多人说把开发板上的EEPROM卸了换M24C64不能读写,讲道理ST也是个大厂,不会做的这么难用才对。后来看了datesheet才恍然大悟。因为24C64有8KB的存储空间,而24C02只有256B的空间所以地址大小不一致,所以24C64的地址占了2个字节。
在这里插入图片描述

图5 24C64时序图

在这里插入图片描述

图6 24C02时序图
24C02的word address只有一个字节。啰嗦一句**一定要看数据收册!一定要看数据收册!数据收册!** 以上内容参考正点原子野火历程,将自己踩的坑整理出来。只是用来分享所学知识无商业用途。若理解错误还希望大佬指出,欢迎大家留言交流。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
IIC指的是Inter-Integrated Circuit的缩写,是一种用于集成电路之间通信的串行通信接口协议。而HAL是硬件抽象层的缩写,是一种软件接口,用于向上层软件屏蔽底层硬件的细节,使开发人员可以更方便地编写应用程序。 24CXX是一款序列EEPROM芯片系列,其中的XX代表了具体的容量,比如24C02表示容量为2K,24C16表示容量为16K。 所以,将IIC模拟HAL 24CXX的意思是通过IIC协议来模拟实现对24CXX系列芯片的写操作。在实际的应用中,可以使用IIC接口去连接24CXX芯片,并通过编写相应的软件代码来实现对其写的功能。 首先,需要初始化IIC通信的参数,包括IIC的控制线和时钟频率。然后,通过IIC的起始信号发送设备地址和写操作类型,以确定要访问的特定芯片。 接下来,根据具体的写操作,可以通过IIC发送相应的命令和数据,通过SCL时钟线和SDA数据线与24CXX芯片进行通信。对于操作,可以从24CXX芯片取数据,并在需要时进行处理。对于写操作,可以将数据写入24CXX芯片的相应位置。 通过IIC模拟HAL 24CXX,可以实现对24CXX芯片的写操作,包括取存储的数据、写入新的数据或修改已有数据等功能。这样的实现可以帮助开发人员更好地使用24CXX系列芯片的存储能力,并在各种应用场景中发挥作用,如数据日志记录、数据存储、设备状态保存等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柒妖71

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值