Запись во внешнюю EEPROM через SPI

Я пытаюсь записать в EEPROM отдельного устройства, чтобы настроить поведение устройства, и управляю устройством с помощью Arduino Uno.

Согласно этой веб-странице, мой SCK подключен к контакту 13, а мой SDA подключен к контакту 11.

У меня есть две функции, i2c_eeprom_write_byte и i2c_eeprom_read_byte, взятые из этого примера.

void i2c_eeprom_write_byte( int deviceaddress, unsigned int eeaddress, byte data ) {
    Wire.begin(deviceaddress); // MUST INCLUDE, otherwise Wire.endTransmission hangs
    // called once, in setup
    int rdata = data;
    Wire.beginTransmission(deviceaddress);

    Wire.write((int)(eeaddress >> 8)); // MSB
    Wire.write((int)(eeaddress & 0xFF)); // LSB    
    Wire.write(rdata);

    Wire.endTransmission(false);

}
byte i2c_eeprom_read_byte( int deviceaddress, unsigned int eeaddress ) {
    byte rdata = 0xFF;
    Wire.beginTransmission(deviceaddress);
    Wire.write((int)(eeaddress >> 8)); // MSB
    Wire.write((int)(eeaddress & 0xFF)); // LSB
    Wire.endTransmission();
    delay(10);
    Wire.requestFrom(deviceaddress,1);


    int avail = Wire.available();
    Serial.println(avail);
    if (Wire.available()) rdata = Wire.read();

    // there's a bug here with Wire.available. It's returning 0 (ie, 0 bytes to be read),
    // when it should be returning 1, since I want 1 byte.

    return rdata;
}

Моя проблема в том, что Wire.available() всегда возвращает 0, что означает, что ведомое устройство ничего не отправляет ведущему устройству, Arduino.

Как читать с ведомого устройства?


person Scott    schedule 31.05.2013    source источник


Ответы (2)


Похоже, вы используете библиотеку I2C для записи на устройство SPI — это не одно и то же! Большинство внешних EEPROM используют I2C (используя контакты 4 и 5 на Uno).

person Mark    schedule 02.07.2013

Отладка оборудования без осциллографа или логического анализатора будет сложной задачей.

Простая двойная проверка состоит в том, чтобы подтвердить, что контакты адреса были подключены для настройки адреса, который вы закодировали. Если повезет, вы просто найдете неверный адрес, исправите его, и все начнет работать.

Остерегайтесь того, как вы отлаживаете. Этот

delay(10);

Вы добавили, что это огромное количество времени для устройства, работающего со скоростью 100 кбит/с (или быстрее). Задержка может не только нарушить связь, но и помочь вам в отладке. Вы не упоминаете устройство, но подтверждаете, может ли оно выдержать такую ​​большую паузу. Запись в память может занять некоторое время, но чтение происходит почти мгновенно по сравнению с тактовой частотой 100 кГц.

Точно так же, добавив это в середине транзакции

 println(...

может быть частью проблемы. Если у вас есть Serial со скоростью 9600 бод по умолчанию, передача этого одного символа прервет транзакцию I2C.

Если у вас есть прицел, единственный трюк, который я могу предложить, — это заменить подтягивающий резистор парой резисторных делителей, которая подтягивает SDA и SCL к напряжению, равному логической 1, но не равному Vcc (5 В в вашем случае?) . Например, выберите пару резисторов, которые удерживают линии на уровне 4,8 В. При таком расположении вы можете увидеть разницу между отсутствием устройств, управляющих шиной, и устройством, управляющим логической 1.

person jdr5ca    schedule 01.06.2013