Arduino使用I2C集成电路
问题
您想要使用一个集成电路封装的I2C外设,例如串行EEPROM。当您需要比Arduino板上具有更多的永久数据存储,并且想要使用外部存储芯片来增加容量时,可以使用此类EEPROM。
解决方案
本示例使用MicrochipTechnology的24LC128I2Cenabled串行EEPROM。图139显示了连接方式。如果您正在使用3。3V板,请将Vcc连接到3。3V而不是5V,以避免损坏您的板。
I2CEEPROM连接
本示例提供了类似于ArduinoEEPROM库(见第18。1节)的功能,但它使用通过I2C连接的外部EEPROM提供了大大增加的存储容量:I2CEEPROM示例程序从24LC128中读取和写入数据includeWire。hconstbyteEEPROMID0x50;24LC128EEPROM的I2C地址第一个可读的ASCII字符!的ASCII码是33:intthisByte33;voidsetup(){Serial。begin(9600);while(!Serial);对于Leonardo和大多数基于ARM的板子都需要Wire。begin();Serial。println(正在向EEPROM写入1024个字节);for(inti0;i1024;i){I2CEEPROMWrite(i,thisByte);下一个字符thisByte;if(thisByte126)也可以写成if(thisByte)thisByte33;重新开始}Serial。println(正在从EEPROM读取1024个字节);intthisByte33;for(inti0;i1024;i){charcI2CEEPROMRead(i);if(c!thisByte){Serial。println(读取错误);break;}else{Serial。print(c);}thisByte;if(thisByte126){Serial。println();thisByte33;重新开始新一行}}Serial。println();Serial。println(完成。);}voidloop(){}此函数类似于Arduino的EEPROM。write()voidI2CEEPROMWrite(unsignedintaddress,bytedata){Wire。beginTransmission(EEPROMID);Wire。write((int)highByte(address));Wire。write((int)lowByte(address));Wire。write(data);Wire。endTransmission();delay(5);等待I2CEEPROM完成写操作}此函数类似于EEPROM。read()byteI2CEEPROMRead(unsignedintaddress){bytedata;Wire。beginTransmission(EEPROMID);Wire。write((int)highByte(address));Wire。write((int)lowByte(address));Wire。endTransmission();Wire。requestFrom(EEPROMID,(byte)1);while(Wire。available()0)等待数据;dataWire。read();returndata;}
讨论
本示例展示了具有128K内存的24LC128芯片;还有容量更高和更低的类似芯片(本示例参见部分的Microchip链接有一个交叉参考表)。芯片的地址使用标有A0到A2的三个引脚设置,在0x50到0x57的范围内,如表132所示。
24LC128的地址值
本示例中使用的Wire库与本章中其他示例中使用的方式相似,因此请阅读这些示例以了解如何初始化和请求从I2C设备中读取数据的代码解释。
写入和读取操作是特定于EEPROM的,并包含在i2cEEPROMWrite和i2cEEPROMRead函数中。这些操作以Wire。beginTransmission到设备的I2C地址开始。然后是一个2字节的值,表示读取或写入操作的内存位置。在写函数中,地址后跟要写入的数据在本例中,将一个字节写入内存位置。
读操作将内存位置发送到EEPROM,然后是Wire。requestFrom(EEPROMID,(byte)1);。这返回刚刚设置的地址处内存中的一个字节数据。
如果您需要加快写入速度,可以用状态检查替换5毫秒的延迟,以确定EEPROM是否准备好写入新字节。请参阅数据表第7节中描述的应答轮询技术。您也可以按页写入64个字节而不是单独写入,详细信息请参见数据表第6节。
芯片记住给定的地址,并且每次执行读取或写入操作时都会移动到下一个顺序地址。如果要读取多个字节,则可以设置起始地址,然后执行多个请求和接收。Wire库可以在单个请求中读取或写入最多32个字节。尝试读取或写入更多字节可能会导致字节被丢弃。
标记为WP的引脚用于设置写入保护。在此电路中,它连接到地面,以使Arduino可以写入内存。将其连接到5V会防止任何写入操作发生。这可以用于将持久数据写入内存,然后防止意外覆盖。