专注电子技术学习与研究
当前位置:单片机教程网 >> STM32 >> 浏览文章

对Rainbow板载I2C EEPROM AT24C08进行读写

作者:huqin   来源:本站原创   点击数:  更新时间:2014年04月20日   【字体:

  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读写和比较的日志。
 

关闭窗口

相关文章