问题
您想要使用一个集成电路封装的I2C外设,例如串行EEPROM。当您需要比Arduino板上具有更多的永久数据存储,并且想要使用外部存储芯片来增加容量时,可以使用此类EEPROM。
解决方案
本示例使用Microchip Technology的24LC128 I2C-enabled 串行EEPROM。图13-9显示了连接方式。如果您正在使用3.3V板,请将Vcc连接到3.3V而不是5V,以避免损坏您的板。
本示例提供了类似于Arduino EEPROM库(见第18.1节)的功能,但它使用通过I2C连接的外部EEPROM提供了大大增加的存储容量:
/*
I2C EEPROM示例程序
从24LC128中读取和写入数据
*/
#include
const byte EEPROM_ID = 0x50; //24LC128 EEPROM的I2C地址
//第一个可读的ASCII字符“!”的ASCII码是33:
int thisByte = 33;
void setup()
{
Serial.begin(9600);
while (!Serial) ; //对于Leonardo和大多数基于ARM的板子都需要
Wire.begin();
Serial.println("正在向EEPROM写入1024个字节");
for (int i = 0; i < 1024; i++)
{
I2CEEPROM_Write(i, thisByte);
//下一个字符
thisByte++;
if (thisByte == 126) //也可以写成if (thisByte == '~')
thisByte = 33; //重新开始
}
Serial.println("正在从EEPROM读取1024个字节");
int thisByte = 33;
for (int i = 0; i < 1024; i++)
{
char c = I2CEEPROM_Read(i);
if (c != thisByte)
{
Serial.println("读取错误");
break;
}
else
{
Serial.print(c);
}
thisByte++;
if (thisByte == 126)
{
Serial.println();
thisByte = 33; //重新开始新一行
}
}
Serial.println();
Serial.println("完成.");
}
void loop()
{
}
//此函数类似于Arduino的EEPROM.write()
void I2CEEPROM_Write(unsigned int address, byte data)
{
Wire.beginTransmission(EEPROM_ID);
Wire.write((int)highByte(address));
Wire.write((int)lowByte(address));
Wire.write(data);
Wire.endTransmission();
delay(5); //等待I2C EEPROM完成写操作
}
//此函数类似于EEPROM.read()
byte I2CEEPROM_Read(unsigned int address)
{
byte data;
Wire.beginTransmission(EEPROM_ID);
Wire.write((int)highByte(address));
Wire.write((int)lowByte(address));
Wire.endTransmission();
Wire.requestFrom(EEPROM_ID, (byte)1);
while (Wire.available() == 0) //等待数据
;
data = Wire.read();
return data;
}
讨论
本示例展示了具有128K内存的24LC128芯片;还有容量更高和更低的类似芯片(本示例“参见”部分的Microchip链接有一个交叉参考表)。芯片的地址使用标有A0到A2的三个引脚设置,在0x50到0x57的范围内,如表13-2所示。
本示例中使用的Wire库与本章中其他示例中使用的方式相似,因此请阅读这些示例以了解如何初始化和请求从I2C设备中读取数据的代码解释。
写入和读取操作是特定于EEPROM的,并包含在i2cEEPROM_Write和i2cEEPROM_Read函数中。这些操作以Wire.beginTransmission到设备的I2C地址开始。然后是一个2字节的值,表示读取或写入操作的内存位置。在写函数中,地址后跟要写入的数据——在本例中,将一个字节写入内存位置。
读操作将内存位置发送到EEPROM,然后是Wire.requestFrom(EEPROM_ID,(byte)1);。这返回刚刚设置的地址处内存中的一个字节数据。
如果您需要加快写入速度,可以用状态检查替换5毫秒的延迟,以确定EEPROM是否准备好写入新字节。请参阅数据表第7节中描述的“应答轮询”技术。您也可以按页写入64个字节而不是单独写入,详细信息请参见数据表第6节。
芯片记住给定的地址,并且每次执行读取或写入操作时都会移动到下一个顺序地址。如果要读取多个字节,则可以设置起始地址,然后执行多个请求和接收。Wire库可以在单个请求中读取或写入最多32个字节。尝试读取或写入更多字节可能会导致字节被丢弃。
标记为WP的引脚用于设置写入保护。在此电路中,它连接到地面,以使Arduino可以写入内存。将其连接到5V会防止任何写入操作发生。这可以用于将持久数据写入内存,然后防止意外覆盖。
页面更新:2024-05-30
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号