Rainbow板载一颗型号为AT24C08的I2C EEPROM,可以用于存储1KB的数据。Rainbow经过封装后对AT24C08操作的函数如下:
1、sEE_Init() 初始化I2C以及EEPROM,要对EEPROM进行操作,必须首先调用这个函数进行初始化
2、sEE_DeInit() 释放硬件资源,在完成对EEPROM中数据读写后,必须调用这个函数释放相应的硬件资源
3、uint8_t sEE_ReadBuffer(uint8_t* pBuffer, uint16_t ReadAddr, uint16_t NumByteToRead)
功能:从EEPROM指定的地址开始,读取指定个数的数据
参数:
pBuffer 保存数据的缓冲
ReadAddr EEPROM起始地址
NumByteToRead 需要读取的数据个数
返回值:
sEE_OK表示操作成功,其他值表示操作失败(超时)
4、uint8_t sEE_WriteBuffer(uint8_t* pBuffer, uint16_t WriteAddr, uint16_t NumByteToWrite)
功能:向EEPROM中指定地址写入指定数量数据
参数:
pBuffer 需要写入数据的起始地址
WriteAddr EEPROM写入数据的地址
NumByteToWrite 需要写入的数据个数
返回值:
sEE_OK表示操作成功,其他值表示操作失败(超时)
在软件包的“Projects\AT24C08”文件夹包含了本文的完整工程,可以直接编译、烧写和调试。这个程序主要展示如何在Rainbow中对EEPROM进行读写,看看main.cpp的代码:
#include "WProgram.h"
#include "stm32_i2c_ee.h"
typedef enum {FAILED = 0, PASSED = !FAILED} TestStatus;
#define countof(a) (sizeof(a) / sizeof(*(a)))
#define sEE_WRITE_ADDRESS1 0x00
#define sEE_READ_ADDRESS1 0x00
#define BUFFER_SIZE1 (countof(Tx1_Buffer)-1)
#define BUFFER_SIZE2 (countof(Tx2_Buffer)-1)
#define sEE_WRITE_ADDRESS2 (sEE_WRITE_ADDRESS1 + BUFFER_SIZE1)
#define sEE_READ_ADDRESS2 (sEE_READ_ADDRESS1 + BUFFER_SIZE1)
uint8_t Tx1_Buffer[] = "STM32F10xx I2C Tx1_Buffer";
uint8_t Tx2_Buffer[] = "STM32F10xx I2C Tx2_Buffer";
uint8_t Rx1_Buffer[BUFFER_SIZE1], Rx2_Buffer[BUFFER_SIZE2];
__IO TestStatus TransferStatus1 = FAILED, TransferStatus2 = FAILED;
__IO uint16_t NumDataRead = 0;
//比较两个数组的数据是否相等的函数原型
TestStatus Buffercmp(uint8_t* pBuffer1, uint8_t* pBuffer2, uint16_t BufferLength);
int main()
{
boardInit();
Serial.begin();
Serial.println("I2C EE start...");
//初始化I2C EEPROM
sEE_Init();
//向第一个地址写入Tx1_Buffer数据
sEE_WriteBuffer(Tx1_Buffer, sEE_WRITE_ADDRESS1, BUFFER_SIZE1);
//需要读取的数据量
NumDataRead = BUFFER_SIZE1;
//读取刚才写入的数据
sEE_ReadBuffer(Rx1_Buffer, sEE_READ_ADDRESS1, NumDataRead);
//比较读出的数据和写入的数据,看是否相等
TransferStatus1 = Buffercmp(Tx1_Buffer, Rx1_Buffer, BUFFER_SIZE1);
//数据相等,写入成功
if (TransferStatus1 == PASSED)
{
Serial.println(" Transfer 1 PASSED ");
}
//向第二个地址写入Tx2_Buffer数据
sEE_WriteBuffer(Tx2_Buffer, sEE_WRITE_ADDRESS2, BUFFER_SIZE2);
//需要读取的数据量
NumDataRead = BUFFER_SIZE2;
//读取刚才写入的数据
sEE_ReadBuffer(Rx2_Buffer, sEE_READ_ADDRESS2, NumDataRead);
//比较读出的数据和写入的数据,看是否相等
TransferStatus2 = Buffercmp(Tx2_Buffer, Rx2_Buffer, BUFFER_SIZE2);
//数据相等,写入成功
if (TransferStatus2 == PASSED)
{
Serial.println(" Transfer 2 PASSED ");
}
sEE_DeInit();
Serial.println("I2C EE end...");
}
//判断两个uint8_t数组的数据否相等,如果相等返回PASSED
TestStatus Buffercmp(uint8_t* pBuffer1, uint8_t* pBuffer2, uint16_t BufferLength)
{
while(BufferLength--)
{
if(*pBuffer1 != *pBuffer2)
{
return FAILED;
}
pBuffer1++;
pBuffer2++;
}
return PASSED;
}
上面的程序编译无误后,将程序烧写到Rainbow中,然后在电脑上运行串口调试工具并和Rainbow连接成功,可以在串口调试工具中看到两次对EEPROM读写和比较的日志。