CH32V103的硬件IIC连续读写AT24系列EEPROM

本文介绍了如何使用CH32V103单片机通过硬件IIC接口实现对AT24系列EEPROM的连续读写操作。在写入过程中,由于AT24系列EEPROM的页面限制,需要进行地址对齐并确保每次写入间隔大于2ms的延时,以避免设备卡死。作者提供了经过实践验证的代码实现。
摘要由CSDN通过智能技术生成

看到网上没有CH32V系列的关于硬件IIC连续读写AT24系列EEPROM的文章。我在借鉴了网上一些资料后在官方例程基础上做了修改,由于AT24系列EEPROM的写Page是有长度限制的,低容量的是8bytes,高容量的是16/32bytes。所以在写之前先要做地址对齐,先将不对齐的部分写入,然后连续按照页大小写入,最后收尾即可。

        要注意的是每次写入之间要加延时,经测试要大于2ms为妙,测试过1ms延时会卡死。

代码如下:

/*
 *@Note
 I2C接口操作EEPROM外设例程: 此代码在官方例程基础上修改,其中部分代码借鉴了stm32等其他类型单片机的IIC流程

 I2C1_SCL(PB10)、I2C1_SDA(PB11)。
 本例程使用 EEPROM 为 AT24Cxx系列。
 操作步骤:
 READ EEPROM:Start + 0xA0 + 8bit Data Address + Start + 0xA1 + Read Data + Stop.
 WRITE EERPOM:Start + 0xA0 + 8bit Data Address + Write Data + Stop.

*/

#include "debug.h"

/**********************************************************************
*@Note:
AT24Cxx:

READ EEPROM:Start + 0xA0 + 8bit Data Address + Start + 0xA1 + Read Data + Stop.
WRITE EERPOM:Start + 0xA0 + 8bit Data Address + Write Data + Stop.
*******************************************************************************/
/* EERPOM DATA ADDRESS Length Definition */
#define Address_8bit     0
#define Address_16bit    1

/* EERPOM DATA ADDRESS Length Selection */
#define Address_Lenth    Address_8bit
//#define Address_Lenth   Address_16bit

/* Global define */
#define SIZE             sizeof(TEXT_Buffer)
//写入和读取的初始地址
#define WR_Address       2
//器件的页大小
#define PAGE_SIZE        16
/* Global Variable */
const u8 TEXT_Buffer[] = {"CH32V103 IIC TEST GOOD LUCK!\r Let's Go!\r AT24C02 Page=8,AT24C4/8/16 Page=16,AT24C32/64 Page=32."};

/*********************************************************************
 * @fn      IIC_Init
 *
 * @brief   Initializes the IIC peripheral.
 *
 * @return  none
 */
void IIC_Init(u32 bound, u16 address)
{
    GPIO_InitTypeDef GPIO_InitStructure = {0};
    I2C_InitTypeDef  I2C_InitTSturcture = {0};

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2, ENABLE);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    I2C_InitTSturcture.I2C_Clock
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值