2013-05-31 2 views
2

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

В соответствии с this webpage, мой SCK подключен к контакту 13 и мой СДА подключен к контакту 11.

У меня есть две функции, i2c_eeprom_write_byte и i2c_eeprom_read_byte, взятые из this example.

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.

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

ответ

0

Отладка аппаратных средств без осциллографа или логического анализатора будет проблемой.

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

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

delay(10); 

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

Аналогичным образом, при добавлении этого в середине транзакции

println(... 

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

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

2

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

Смежные вопросы