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讀寫和比較的日志。