看到网上没有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