EVASH Ultra系列EEPROM与通用型MCU:以Arduino为例
在嵌入式系统开发中,可靠的数据存储解决方案至关重要。EVASH Ultra系列EEPROM以其高可靠性和快速写入速度而闻名,非常适合多种应用场景。本文将展示如何在Arduino平台上使用EVASH Ultra系列EEPROM进行数据存储。
一、硬件连接
- 连接引脚:
- Arduino的SCL (A5) 连接到 EVASH Ultra EEPROM 的 SCL。
- Arduino的SDA (A4) 连接到 EVASH Ultra EEPROM 的 SDA。
- 电源和地分别连接到 EEPROM 的 Vcc 和 GND。
- 上拉电阻: I2C总线上的SCL和SDA线需要通过上拉电阻连接到电源,一般使用4.7kΩ的电阻。
二、软件实现
使用Arduino的Wire库进行I2C通信。以下是一个基本的读写示例代码。
初始化代码
c
复制代码
#include <Wire.h>
#define EEPROM_ADDRESS 0x50 // EVASH Ultra EEPROM I2C地址
void setup() {
Wire.begin(); // 初始化I2C
Serial.begin(9600); // 初始化串口用于调试输出
}
写入操作
c
复制代码
void EEPROM_Write(uint16_t memAddress, uint8_t *data, uint16_t size) {
Wire.beginTransmission(EEPROM_ADDRESS);
Wire.write((int)(memAddress >> 8)); // 发送高字节地址
Wire.write((int)(memAddress & 0xFF)); // 发送低字节地址
for (uint16_t i = 0; i < size; i++) {
Wire.write(data[i]); // 发送数据
}
Wire.endTransmission();
delay(5); // 确保写入完成
}
读取操作
c
复制代码
void EEPROM_Read(uint16_t memAddress, uint8_t *data, uint16_t size) {
Wire.beginTransmission(EEPROM_ADDRESS);
Wire.write((int)(memAddress >> 8)); // 发送高字节地址
Wire.write((int)(memAddress & 0xFF)); // 发送低字节地址
Wire.endTransmission();
Wire.requestFrom(EEPROM_ADDRESS, size);
for (uint16_t i = 0; i < size; i++) {
if (Wire.available()) {
data[i] = Wire.read(); // 读取数据
}
}
}
主函数示例
c
复制代码
void loop() {
uint8_t writeData[4] = {0x12, 0x34, 0x56, 0x78}; // 待写入数据
uint8_t readData[4]; // 读取数据缓冲区
// 写数据到EVASH Ultra EEPROM
EEPROM_Write(0x0000, writeData, 4);
// 延时以确保写入完成
delay(100);
// 读数据从EVASH Ultra EEPROM
EEPROM_Read(0x0000, readData, 4);
// 输出读取的数据到串口
Serial.print("Read Data: ");
for (int i = 0; i < 4; i++) {
Serial.print(readData[i], HEX);
Serial.print(" ");
}
Serial.println();
// 循环延时
delay(2000);
}
三、详细说明
I2C初始化: 使用Wire.begin()初始化I2C接口,确保Arduino能够通过I2C正确与EVASH Ultra EEPROM通信。
写入操作: EEPROM_Write函数通过I2C接口将数据写入EVASH Ultra EEPROM的指定地址。首先发送内存地址,然后发送数据。
读取操作: EEPROM_Read函数从EVASH Ultra EEPROM的指定地址读取数据。首先发送内存地址,然后请求数据。
主循环: 在主循环中,演示了如何写入和读取数据,并通过串口监视器输出读取的数据。
经典代码示例:EVASH Ultra系列EEPROM与STM32的集成
硬件连接
连接引脚:
STM32的I2C_SCL (时钟) 连接到 EVASH Ultra256 EEPROM 的 SCL。
STM32的I2C_SDA (数据) 连接到 EVASH Ultra256 EEPROM 的 SDA。
电源和地分别连接到 EEPROM 的 Vcc 和 GND。
上拉电阻: I2C总线上的SCL和SDA线需要通过上拉电阻连接到电源,一般使用4.7kΩ的电阻。
软件实现
2C初始化和错误处理
c
复制代码
#include "stm32f4xx_hal.h"
// I2C句柄
I2C_HandleTypeDef hi2c1;
// EVASH Ultra256 EEPROM地址
#define EVASH_ULTRA256_ADDRESS 0xA0
// 初始化I2C
void I2C_Init(void) {
hi2c1.Instance = I2C1;
hi2c1.Init.ClockSpeed = 100000; // 100kHz
hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
hi2c1.Init.OwnAddress1 = 0;
hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
hi2c1.Init.OwnAddress2 = 0;
hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
if (HAL_I2C_Init(&hi2c1) != HAL_OK) {
// 初始化错误处理
Error_Handler();
}
}
// 错误处理函数
void Error_Handler(void) {
// 用户可以在这里定义自己的错误处理代码
while(1);
}
写入操作c
复制代码
HAL_StatusTypeDef EVASH_Ultra_Write(uint16_t MemAddress, uint8_t *pData, uint16_t Size) {
return HAL_I2C_Mem_Write(&hi2c1, EVASH_ULTRA256_ADDRESS, MemAddress, I2C_MEMADD_SIZE_16BIT, pData, Size, HAL_MAX_DELAY);
}
读取操作c
复制代码
HAL_StatusTypeDef EVASH_Ultra_Read(uint16_t MemAddress, uint8_t *pData, uint16_t Size) {
return HAL_I2C_Mem_Read(&hi2c1, EVASH_ULTRA256_ADDRESS, MemAddress, I2C_MEMADD_SIZE_16BIT, pData, Size, HAL_MAX_DELAY);
}
主函数示例c
复制代码
int main(void) {
HAL_Init();
SystemClock_Config(); // 配置系统时钟
I2C_Init(); // 初始化I2C
uint8_t writeData[4] = {0x12, 0x34, 0x56, 0x78}; // 待写入数据
uint8_t readData[4]; // 读取数据缓冲区
// 写数据到EVASH Ultra EEPROM
if (EVASH_Ultra_Write(0x0000, writeData, 4) != HAL_OK) {
// 写入错误处理
Error_Handler();
}
// 读数据从EVASH Ultra EEPROM
if (EVASH_Ultra_Read(0x0000, readData, 4) != HAL_OK) {
// 读取错误处理
Error_Handler();
}
while (1) {
// 主循环
}
}
I2C初始化: 初始化I2C接口,设置时钟速度、地址模式等参数,确保STM32能够通过I2C正确与EVASH Ultra256 EEPROM通信。
写入操作: EVASH_Ultra_Write函数通过I2C接口将数据写入EVASH Ultra256 EEPROM的指定地址。使用HAL_I2C_Mem_Write函数,指定EEPROM地址、内存地址和数据长度等参数。
读取操作: EVASH_Ultra_Read函数从EVASH Ultra256 EEPROM的指定地址读取数据。使用HAL_I2C_Mem_Read函数,指定EEPROM地址、内存地址和数据长度等参数。
错误处理: 如果在初始化、写入或读取过程中出现错误,Error_Handler函数将处理这些错误。开发者可以根据实际需求修改错误处理逻辑。
系统时钟配置: 在SystemClock_Config函数中,您需要根据具体的系统需求配置系统时钟,这里省略了具体实现。