Arduino使用I2C集成电路

问题

您想要使用一个集成电路封装的I2C外设,例如串行EEPROM。当您需要比Arduino板上具有更多的永久数据存储,并且想要使用外部存储芯片来增加容量时,可以使用此类EEPROM。

解决方案

本示例使用Microchip Technology的24LC128 I2C-enabled 串行EEPROM。图13-9显示了连接方式。如果您正在使用3.3V板,请将Vcc连接到3.3V而不是5V,以避免损坏您的板。


I2C EEPROM连接

本示例提供了类似于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所示。


24LC128的地址值

本示例中使用的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

标签:示例   集成电路   字节   函数   数据表   芯片   内存   位置   操作   地址   数据

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top