Праблема чытання чып 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
}

Праблема я сутыкнуўся, я атрымаць назад адрас (ад якога я хачу прачытаць дадзеныя) як саміх дадзеных (напрыклад, для чытання (0) вяртае 0, чытанне (1) вяртае 1 і гэтак далей). Я нават спрабаваў адладзіць сувязь I2C з выкарыстаннем лагічнага аналізатара (Saleae логіка ў дадзеным выпадку). Здымак экрана паказаны ніжэй.

enter image description here

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

Выхад прыведзенага вышэй кода выглядае наступным чынам:

<�Р> 0 1 2 3 4 5 6 7 8 9 A B C D Е 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 5Е 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
@MikaelPatel: Я дам паспрабаваць з 16-бітным адрасам і вы ведаеце, што вынікі.
дададзена аўтар mcrumley, крыніца
@NickGammon: Проста каб пераканацца, што змесціва не 0x00, 0x01, і г.д. Я паспрабаваў выканаць аперацыю запісу на чып. Але вынік для чытання пасля запісу, застаецца тым жа самым. Можа быць, я павінен паспрабаваць выкарыстоўваць 16-разрадныя адрасы, як Вы прапанавалі, а таксама.
дададзена аўтар mcrumley, крыніца
@NickGammon: Я паспрабаваў з дапамогай 16-бітнага адрасы, але без поспеху. Дадзеныя, якія я атрымаў у адказ гэта ўсё нулі. Можа быць, таму што цяпер я атрымліваю назад першыя 8 біт, якія я пішу, г.зн. 0x00. Я таксама шукаў у бібліятэцы i2c, што Вы прапанавалі ў сваім блогу. dsscircuits.com/articles/arduino-i2c-master-library . Ці можаце вы мне дапамагчы ў разуменні таго, што менавіта registerAddress тут? Яго прымяненне ў многіх функцыях гэтай бібліятэкі, for.e.g.I2c.write (адрас, registerAddress * дадзеныя, numberBytes). Дзякуй!
дададзена аўтар mcrumley, крыніца
Ааа OK. Я рабіў зваротны інжынерны праект і чып на самай справе COB. Я павінен затым Decap гэта неяк і ўбачыць ўнізе. Дзякуй ў любым выпадку.
дададзена аўтар mcrumley, крыніца
Колькі ног (пальцы) робіць чып ёсць?
дададзена аўтар Nick Gammon, крыніца
Я згодны з Мікаэль таксама можна паспрабаваць адправіць 16-бітны адрас. Так, напрыклад, паслаць нуль, а затым адрас. У любым выпадку, вы можаце быць упэўнены ў тым, што чып ня здараецца, ёсць 0x00, 0x01 і г.д. ўнутры сваёй памяці?
дададзена аўтар Nick Gammon, крыніца
Гэта залежыць ад прылады, але некаторыя з іх рэгістр дзесьці пісаў да яе выклікае ўнутраныя біты павінны быць устаноўлены. Шчыра кажучы, спрабуючы дапамагчы напісаць/прачытаць ад невядомага прылады практычна немагчыма. За $ 5 можна купіць чып, які вы ведаеце нумар дэталі і можа атрымаць тэхнічны пашпарт.
дададзена аўтар Nick Gammon, крыніца
Як аб выкарыстанні 16-бітнага адрасы? Вось спасылка на драйвер, які я напісаў для Коша; github.com/mikaelpatel/Cosa/blob/master/libraries/ AT24CXX/& hellip;
дададзена аўтар Mikael Patel, крыніца

3 адказы

Вам трэба перадаць адрас як два байта, адзін за адным.

Не рабіце:

Wire.write(address);

Хутчэй за ўсё, зрабіце наступнае:

Wire.write((uint8_t)(address >> 8));//MSB
Wire.write((uint8_t)(address & 0xFF));//LSB
2
дададзена

Карацей кажучы, вы павінны падзяліць

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 becuase яго ёсць дзве старонкі. Я падазраю, што вы знойдзеце свой чып, па меншай меры, падобна, з-за I2C адрасоў вы пералічылі. Вы можаце мець меншую версію той жа чып, які выкарыстоўвае толькі адзін адрас.

1
дададзена

Без пэўнай інфармацыі чыпа гэта будзе цяжка.

Тым не менш, мой досвед працы з ЭСППЗОМ і I2C з'яўляецца тое, што першым дзеянне, каб напісаць каманду, а затым запісаць параметр (ы) для гэтай каманды, а затым прачытаць адказ.

Часта, ёсць рэгістр стану ў EEPROM, які павінен быць прачытаны (напісаўшы каманду, а затым чытае адказ), каб вызначыць, ці з'яўляецца EEPROM гатовы атрымаць іншую каманду, як пісаць, каб усталяваць адрас для чытання/або/запіс, а затым фактычная каманды чытання.

0
дададзена