de-vraag
  • Вопросы
  • Метки
  • Пользователи
Оповещения
Вознаграждения
Регистрация
После регистрации, сможете получать уведомления об ответах и комментариях на Ваши вопросы.
Вход
Если у Вас уже есть аккаунт, войдите чтобы проверить новые уведомления.
Тут будут вознаграждения за добавленные вопросы, ответы и комментарий.
Дополнительно
Источник
Редактировать
 MayankTUM
MayankTUM
Вопрос

Проблема чтения чипа EEPROM с использованием протокола I2C

Я пытаюсь прочитать чип EEPROM, поддерживающий протокол I2C (не могу указать номер модели IC, поскольку он не печатается). Конечно, он поддерживает протокол I2C, так как я написал код для его обнаружения с использованием библиотеки I2C и адреса устройства, на который я получил его, 0x51 . Теперь я пытаюсь написать код, который считывает данные с этой микросхемы. Код выглядит следующим образом:

#include 

int addr = 0;

void setup() {
    Wire.begin();//initialise the connection
    Serial.begin(9600);
    while (!Serial) {}
    delay(100);
}

void loop() {
  byte deviceAddress = 0x51;
  byte data = readData(addr, deviceAddress);
  Serial.print(data, HEX);
  Serial.print(" ");
  addr++;
  if(addr%16 == 0) {
     Serial.print('\n');
  }
 //check for 1Kbits first
  if (addr%128 == 0) {
     Serial.println("round complete");
     Serial.println();
     addr = 0;
  }
  delay(100);
}

byte readData(int address, int deviceAddress) {
 //sending device address
  Wire.beginTransmission(deviceAddress);
  Wire.write(address);
  Wire.endTransmission();
  Wire.requestFrom((short int)deviceAddress, 1);
  if(Wire.available()) {
    byte data = Wire.read();
    return data;  
  }
  return 0xAA;//random data
}

Проблема, с которой я столкнулся, - это вернуть адрес (из которого я хочу прочитать данные), поскольку сами данные (например, read (0) возвращает 0, read (1) возвращает 1 и т. Д.). Я даже пытался отлаживать связь I2C с помощью логического анализатора (в данном случае логика Saleae). Снимок экрана показан ниже.

enter image description here

На скриншоте показана логика операции чтения с одного адреса (0x78), но история сохраняется для каждого адреса, т. Е. Я возвращаю адрес вместо данных с адреса.

Выходной код приведенного выше кода выглядит следующим образом:

0 1 2 3 4 5 6 7 8 9 A B C D E F
  10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
  20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F
  30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F
  40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F
  50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F
  60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F
  70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F
  раунд завершен

Можете ли вы помочь мне определить, что, возможно, я делаю неправильно здесь?

Благодарю.









1 2016-03-11T17:07:02+00:00 3
 dda
dda
Редактировал вопрос 6-го января 2017 в 5:22
Arduino
arduino-uno
i2c
eeprom
c
dda
6-го января 2017 в 5:27
2017-01-06T05:27:06+00:00
Дополнительно
Источник
Редактировать
#56788747

Вам нужно передать адрес как два байта, один за другим.

Не делай:

Wire.write(address);

Скорее сделайте:

Wire.write((uint8_t)(address >> 8));//MSB
Wire.write((uint8_t)(address & 0xFF));//LSB
2
0
Alphy13
6-го декабря 2017 в 1:16
2017-12-06T13:16:06+00:00
Дополнительно
Источник
Редактировать
#56788748

Короче говоря, вы должны разделить

Wire.write(address);

в

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

I am working on a similar project right now. I have searched through many different codes and libraries and found the following to work the best: https://playground.arduino.cc/Code/I2CEEPROM

I am using the 24LC1025 who's datasheet can be found here: http://www.microchip.com/datasheet/24LC1025

Я использую версию 1Mb, и она использует 0x51 и 0x50, потому что у нее две страницы. Я подозреваю, что вы найдете свой чип, по крайней мере, похожим из-за адреса I2C, который вы указали. У вас может быть меньшая версия того же чипа, который использует только один адрес.

1
0
4thSpace
11-го марта 2016 в 6:36
2016-03-11T18:36:30+00:00
Дополнительно
Источник
Редактировать
#56788746

Без конкретной информации об микросхеме это будет сложно.

Однако мой опыт работы с EEPROM и I2C заключается в том, что первым действием является запись команды, а затем запись параметров для этой команды, а затем чтение ответа.

Часто в EEPROM есть регистр состояния, который необходимо прочитать (путем написания команды, затем чтения ответа), чтобы определить, готова ли EEPROM к приему другой команды, например записи, чтобы задать адрес для чтения/или/write, а затем фактическую команду чтения.

0
0
Похожие сообщества 3
ARDUINO [RU]
ARDUINO [RU]
675 пользователей
Обсуждение Электронного конструктора Arduino. Проблемы и их решения. Ссылки на интересные статьи и проекты. 🛠 IOT RU: @ProIOT 📶 Esp32 EN: @Proesp_en 📶 Esp32 RU: @Proesp8266 ⚙️ Arduino EN: @ProArduino_en 💻 ВК: https://vk.com/arduino_esp
Открыть telegram
ARDUINO_GODs
ARDUINO_GODs
365 пользователей
@digitalWrite
Открыть telegram
IOT [ARDUINO, ESP, DIY] [RU]
IOT [ARDUINO, ESP, DIY] [RU]
181 пользователей
Интернет Вещей (анг. Internet of Things, IOT) концепция вычислительной сети физических предметов ("вещей") ⚙️ Arduino RU: @ProArduino ⚙️ Arduino EN: @ProArduino_en 📶 esp32 RU: @Proesp8266 📶 esp32 EN: @Proesp_en 💻 ВК: https://vk.com/arduino_esp
Открыть telegram
Добавить вопрос
Категории
Все
Технологий
Культура / Отдых
Жизнь / Искусство
Наука
Профессии
Бизнес
Пользователи
Все
Новые
Популярные
1
Roxana Elizabeth CASTILLO Avalos
Зарегистрирован 5 дней назад
2
Hideo Nakagawa
Зарегистрирован 5 дней назад
3
Sergiy Tytarenko
Зарегистрирован 1 неделю назад
4
shoxrux azadov
Зарегистрирован 1 неделю назад
5
Koreets Koreytsev
Зарегистрирован 1 неделю назад
© de-vraag 2022
Источник
arduino.stackexchange.com
под лицензией cc by-sa 3.0 с атрибуцией