專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機教程網(wǎng) >> STM32 >> 瀏覽文章

對Rainbow板載I2C EEPROM AT24C08進行讀寫

作者:huqin   來源:本站原創(chuàng)   點擊數(shù):  更新時間:2014年04月20日   【字體:

  Rainbow板載一顆型號為AT24C08的I2C EEPROM,可以用于存儲1KB的數(shù)據(jù)。Rainbow經(jīng)過封裝后對AT24C08操作的函數(shù)如下:
   
    1、sEE_Init() 初始化I2C以及EEPROM,要對EEPROM進行操作,必須首先調(diào)用這個函數(shù)進行初始化
   
    2、sEE_DeInit() 釋放硬件資源,在完成對EEPROM中數(shù)據(jù)讀寫后,必須調(diào)用這個函數(shù)釋放相應(yīng)的硬件資源

    3、uint8_t sEE_ReadBuffer(uint8_t* pBuffer, uint16_t ReadAddr, uint16_t NumByteToRead)
       功能:從EEPROM指定的地址開始,讀取指定個數(shù)的數(shù)據(jù)
       參數(shù):
           pBuffer 保存數(shù)據(jù)的緩沖
           ReadAddr EEPROM起始地址
           NumByteToRead 需要讀取的數(shù)據(jù)個數(shù)
       返回值:
           sEE_OK表示操作成功,其他值表示操作失敗(超時)

    4、uint8_t sEE_WriteBuffer(uint8_t* pBuffer, uint16_t WriteAddr, uint16_t NumByteToWrite)
       功能:向EEPROM中指定地址寫入指定數(shù)量數(shù)據(jù)
       參數(shù):
           pBuffer 需要寫入數(shù)據(jù)的起始地址
           WriteAddr EEPROM寫入數(shù)據(jù)的地址
           NumByteToWrite 需要寫入的數(shù)據(jù)個數(shù)
       返回值:
           sEE_OK表示操作成功,其他值表示操作失敗(超時)

    在軟件包的“Projects\AT24C08”文件夾包含了本文的完整工程,可以直接編譯、燒寫和調(diào)試。這個程序主要展示如何在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;

//比較兩個數(shù)組的數(shù)據(jù)是否相等的函數(shù)原型
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數(shù)據(jù)
  sEE_WriteBuffer(Tx1_Buffer, sEE_WRITE_ADDRESS1, BUFFER_SIZE1);

  //需要讀取的數(shù)據(jù)量
  NumDataRead = BUFFER_SIZE1;
 
  //讀取剛才寫入的數(shù)據(jù)
  sEE_ReadBuffer(Rx1_Buffer, sEE_READ_ADDRESS1, NumDataRead);
 
  //比較讀出的數(shù)據(jù)和寫入的數(shù)據(jù),看是否相等
  TransferStatus1 = Buffercmp(Tx1_Buffer, Rx1_Buffer, BUFFER_SIZE1);
  //數(shù)據(jù)相等,寫入成功
  if (TransferStatus1 == PASSED)
  {
    Serial.println(" Transfer 1 PASSED  ");
  }
  //向第二個地址寫入Tx2_Buffer數(shù)據(jù)
  sEE_WriteBuffer(Tx2_Buffer, sEE_WRITE_ADDRESS2, BUFFER_SIZE2);

  //需要讀取的數(shù)據(jù)量
  NumDataRead = BUFFER_SIZE2; 
 
  //讀取剛才寫入的數(shù)據(jù)
  sEE_ReadBuffer(Rx2_Buffer, sEE_READ_ADDRESS2, NumDataRead);

  //比較讀出的數(shù)據(jù)和寫入的數(shù)據(jù),看是否相等
  TransferStatus2 = Buffercmp(Tx2_Buffer, Rx2_Buffer, BUFFER_SIZE2);
  //數(shù)據(jù)相等,寫入成功
  if (TransferStatus2 == PASSED)
  {
    Serial.println(" Transfer 2 PASSED  ");
  }

  sEE_DeInit();
  Serial.println("I2C EE end...");
}

//判斷兩個uint8_t數(shù)組的數(shù)據(jù)否相等,如果相等返回PASSED
TestStatus Buffercmp(uint8_t* pBuffer1, uint8_t* pBuffer2, uint16_t BufferLength)
{
  while(BufferLength--)
  {
    if(*pBuffer1 != *pBuffer2)
    {
      return FAILED;
    }
   
    pBuffer1++;
    pBuffer2++;
  }

  return PASSED; 
}

    上面的程序編譯無誤后,將程序燒寫到Rainbow中,然后在電腦上運行串口調(diào)試工具并和Rainbow連接成功,可以在串口調(diào)試工具中看到兩次對EEPROM讀寫和比較的日志。
 

關(guān)閉窗口

相關(guān)文章