неділю, 22 липня 2012 р.

Робота з EEPROM пам'яттю 24CXX -- огляд

Виникла в мене короткотермінова потреба писати в EEPROM пам'ять (*0) серії мікросхем 24CXX на фоні довготермінової потреби освоїти роботу із мікроконтролерами. Хочу поділитися своїм досвідом. Нічого унікального в ньому немає -- все багато раз описано, але українською ще не бачив. Та й раптом комусь згодиться (хоча б мені, але пізніше :). 


Ця серія мікросхем має ємність від 1 кілобіта до 1 мегабіта. Власне, числа після 24С вказують ємність мікросхеми в кілобітах.

Працюють вони по інтерфейсу I2C -- Inter-Integrated Circuit (TWI  -- Two Wire Interface, в термінології Atmel, вживається з патентних міркувань). Звичайно, цим інтерфейсом користуються багато які пристрої -- термометри, акселерометри, тощо, але поки говоримо про пам'ять.

I2C


Написано про цю шину багато і гарно:
Тому особливо розповсюджуватися не буду. В двох словах. 

Основне призначення -- з'єднання елементів схеми в межах одного приладу, відповідно -- малі віддалі, довгі провідники небажані. Довгі -- це більше десятка-другого сантиметрів. З іншого боку, добитися успішної роботи на відстанях в метри цілком можна, див. наприклад обговорення тут. Швидкодія -- від 10кбіт/с до 100кбіт/с, або у швидкому режимі -- 400 кбіт/с. Окремі пристрої підтримують вищу швидкість. Якщо дуже треба, наприклад для відлагодження, то можна майже від нуля -- режим задається швидкістю генерації імпульсів синхронізації (див. нижче), варто лише слідкувати за шириною фронту сигналу, (порядку 250 нс), щоб пристрої реагували коректно. Тобто, шина достатньо повільна. Зате проста у використанні, а швидкодія потрібна далеко не всім пристроям. 

Шина двох-провідна (хоча, земля і живлення теж потрібні). Одна з ліній, SСL, служить для сигналів синхронізації, друга, SDA -- для даних. Обидві лінії, через резистори (порядку 10кОм, точніше -- див. даташіти), підтягнуті до 1 (+5В, +3.3В, в залежності від типу мікросхем). Потрібно це, щоб лінія переходила в 1 сама, а до 0 її мусили активно притискувати пристрої на шині. Важливо: не можна переключати вивід контролера на OUT і давати на нього 1 (+5В) -- елементарно може виникнути коротке замикання, наприклад якщо в цей момент котрийсь пристрій на шині буде притискувати її до нуля.

Один із пристроїв -- ведучий (Master), решта -- підлеглі (Slave). Взагалі, може бути кілька ведучих, існують правила арбітражу, але не будемо заглиблюватися в такі нетрі.

Передача бітів відбувається завжди наступним чином. "Ритм" задає Master. Поки на лінії SCL є 0, пристрій що передаватиме дані, виставляє на SDA значення біта, яке він хоче передати. Коли SCL стає рівним 1, змінювати SDA не можна -- відбувається зчитування біта. Якщо пристрій, що отримує дані, не встигає їх переварити, він може притискати SCL до 0. Нагадуємо, вона, "по замовчуванню", притягнута до 1 резистором, і її слід активно опускати (притискати) до 0. Тому, Master, генеруючи тактовий сигнал, має поводитися тактовно (мила тавтологія вийшла :) -- детектувати виникнення таких ситуацій, коли він відпустив лінію, а вона не піднялася до 1, виявивши -- зачекати.
Передача бітів. (Взято з атмелівського даташіту на AT24XXX)
Під час передачі біта SDA змінюватися не може. Ініціювання передачі здійснюється, навпаки, так: під час SCL=1 лінія SDA переходить з 1 в 0. Це називається Start. Аналогічно, сигнал Stop, завершення передачі, подається переходом лінії SDA з 0 в 1 коли SCL=1.
Start i Stop сигнали. (Взято з атмелівського даташіту на AT24XXX)
Байти передаються, починаючи із старшого біта. Після кожних восьми біт очікується сигнал ACK -- пристрій, який приймав дані, на час одного такту, притискає лінію SDA до 0. Якщо цього не відбулося (пристрій щось не зрозумів, зламався, а той просто відсутній), говорять про ситуацію NACK -- відсутність підтвердження. 

Ініціювати зв'язок може тільки Master. Перше, що він робить після сигналу Start -- передає семи-бітну адресу Slave-пристрою, до якого звертається  + восьмий біт, R/W, який вказує, будемо читати (1) чи писати (0). Якщо пристрій з такою адресою є на шині, він відповідає ACK, на 9-му такті притискаючи лінію SDA в 0. Далі здійснюється той чи інший обмін даними. 

Ще одна важлива деталь. Іноді потрібно щось передати підлеглому пристрою, а потім щось від нього отримати. Наприклад, мікросхемі пам'яті передати адресу байта, який ми хочемо прочитати, а потім отримати цей байт. Для цього прийнято використовувати хитрий трюк. Master ініціює запис, передає адресу бажаних даних (скажімо, два байти), після того, не подаючи Stop, знову робить Start (так званий повторний старт), але вже в режимі читання. У відповідь пам'ять повертає замовлене.  Цей трюк не фіксується стандартом, але є загальноприйнятою практикою.

7-бітна адресація в теорії дозволяє звертатися до 127 пристроїв на одній шині. На практиці це не можливо, так як зазвичай кілька старших біт адреси конкретного типу пристроїв фіксовані. Наприклад, мікросхеми серії 24C мають старші біти адреси 1010b, але іноді дозволяють керувати трьома молодшими. Тому схема, що використовує 127 I2C пристроїв буде відверто непрактичною :-)

За різноманітними деталями, графіками, діаграмами сигналів, див. посилання вище. 


EEPROM серії 24CXX



PDIP-8 (Plastic DIP, 8 виводів)
Для дослідів у моєму розпорядженні є M24C04 фірми STMicroelectronix (ST), ємністю 4кбіт та AT24C128 фірми Atmel, ємністю 128 кбіт, у корпусах PDIP8-300. Документацію (datasheet) на них легко знайти в Інтернет. Зокрема, лінки на офіційну документацію, актуальні на момент написання вказано вище. 

Виглядають вони так, як на рисунку праворуч. Такі собі 8-ногі тараканчики.

Можуть працювати лише в режимі Slave I2C пристрою.

Щоб взнати призначення ніжок-виводів, звернемося до даташітів. 

Впізнаємо SDA -- лінію даних та SCL -- лінію синхронізації, описані вище. Вони, в обох мікросхем (різних виробників) мають номери 5 і 6. Вивід GND -- земля, Vcc -- живлення. WC -- Write Control, якщо виставлена в 1 (підтягується до Vcc), запис заборонено, якщо 0 (підтягується до GND) -- дозволено. WC всередині мікросхемки підтягнутий до 0, тобто якщо немає потреби керувати записом, його можна не під'єднувати (*1). NC -- всього лиш Not Connected -- не використовується ні для чого (*2).

З виводами 1, 2, 3 -- складніше. Розглянемо їх для кожної мікросхеми окремо.

Керування апаратними адресами


Для мікросхем великого (відносно :) розміру, зокрема наших Атмелівських, розміром 128/256 кбіт, A0 і A1 задають два молодших біта апаратної адреси мікросхеми. Адреса має вигляд, у двійковому представленні: 1 0 1 0 0 A1 A0, тобто байт адреси, який слід передати зразу після сигналу Start, виглядатиме так:
Таким чином, на одній шині може знаходитися до чотирьох різних мікросхем типу AT24C128/AT24C256, із різними комбінаціями A1 A0 (яких якраз 4 -- 00, 01, 10, 11).

Ці виводи, якщо їх залишити непід'єднаними,  підтягнуться до 0. Однак, їх стосуватиметься те ж, що написано і для WC (див. також (*1) ).

Мікросхеми малого розміру, 1-16кбіт, зокрема наша від ST, M24Cxx, поводяться хитріше. Для різних розмірів поведінка різна. Для M24C01/M24C02 (нагадуємо, 1 або 2 кбіт) можна  використовувати всі три, E0, E1, E2 і апаратна адреса виглядає так:
1 0 1 0| E2 E1 E0 | R/W 
Тому можна одночасно підключати 8 таких мікросхемок, із сумарною ємністю 8 або 16 кбіт.
Для M24C04 (якраз такої, з якою експериментуватимемо, 4 кбіт) -- можна використовувати лише E1 і E2. Тобто, не більше 4 таких мікросхем на шині, сумарною ємністю знову 16 кбіт.
1 0 1 0| E2 E1 A8 | R/W
При тому, молодший біт апаратної адреси, A8, є старшим бітом адреси байта в мікросхемці. Тобто, фактично, 24С04 являє собою два пристрої шини I2C, які відрізняються молодшим бітом адреси. Кожен із них має ємність 2кбіт - 256 байт, і може адресуватися одним байтом.

Аналогічно, для 24С08, можна керувати лише E2, а A9 i A8 -- старші біти адреси байта, є молодшими бітами апаратної. (Або, 24C08 можна розглядати як 4 окремих пристрої, розміром 256 байт кожен):
 1 0 1 0| E2 A9 A8 | R/W 
24C16 може бути на шині одна, три молодших біти апаратної адреси міститимуть старші біти адреси байт даних (24C16 -- 8 пристроїв на шині, розміром 256 байт).
1 0 1 0| A10 A9 A8 | R/W

"Логічний" протокол обміну інформацією з мікросхемами


Вище ми розібралися, як фізично передати конкретні біти та як вибрати конкретний пристрій, мікросхемку на шині. Однак, які саме біти їй слід передавати, щоб добитися потрібного -- читати її вміст та писати в неї?

Почнемо з найпростішого -- запис байта за довільною адресою для "великої" мікросхеми. Тут все просто:
  1. Подається сигнал Start
  2. Передаються 7 біт адреси пристрою, в нашому випадку -- мікросхеми пам'яті + біт 0 (R/W -- запис), очікується ACK від неї.
  3. Передаємо старший байт адреси в пам'яті. Очікуємо ACK.
  4. Передаємо молодший байт адреси в пам'яті. Очікуємо ACK. 
  5. Передаємо байт для запису. Якщо все добре, пам'ять відповість ACK. Якщо проблеми, або просто запис заборонено високим рівнем на WC, повернуть NACK -- запис не вдався.
  6. Посилаємо сигнал Stop.
Нагадую, що всі байти передаються, починаючи з найстаршого біта. Виглядає це якось так, як на рисунку:
* -- біт ігнорується, + -- біт ігнорується для 128 кбіт, просто немає таких великих адрес
(взято з атмелівського даташіта на AT24C128/256)
Для "малих", розміром 1-2 кбіт, процедура відрізнятиметься лише тим, що адреса передаватиметься одним байтом. (2 кбіт -- 256 байт, якраз вистачає). Малі ж, розміром 4/8/16 кбіт адресуватимуться хитріше:
  1. Подається сигнал Start
  2. З адреси (довжиною, відповідно, 9/10/11 біт) виділяються старші 1/2/3 біти.
  3. Адреса пристрою на шині генерується так: береться адреса мікросхеми,  задана E2/E1 (4 кбіт); E1 (8 кбіт); стандартна 1010000b (16 кбіт), і замість молодших 1/2/3 бітів ставляться отримані на попередньому кроці.
  4. Пристрою передаються 7 біт адреси, отриманих на попередньому кроці + біт 0 (R/W -- запис), очікується ACK від неї.
  5. Передаємо байт -- молодших вісім бітів адреси в пам'яті. Очікуємо ACK. 
  6. Передаємо байт для запису. Якщо все добре, пам'ять відповість ACK. Якщо проблеми, або просто запис заборонено високим рівнем на WC, повернуть NACK -- запис не вдався.
  7. Посилаємо сигнал Stop.
Відповідна діаграма:
Сигнал на лінії SDA при записі одного байта на 24C01/02/04/08/16 (взято з даташіта ST на M24C01/02/04/08/16)
Наприклад, для 24C04 це може виглядати так:

  uint8_t A9=(byte_number >> 8) & 0x01; // Виділяємо 9-й біт
  // Біт 0 апаратної адреси device_id має бути рівним нулю
  uint8_t cur_device_id=device_id | A9

Надалі, щоб не бути дуже вже багатослівними, розглядатимемо роботу лише з "великими" мікросхемами. Для "малих" відмінність буде лише в тому, що слід виділяти 9 і старші біти адреси байта, і поміщати їх в молодші біти апаратної адреси, перш ніж звертатися до пристрою, а після сигналу Start передавати згенеровану так апаратну адресу та молодших 8 біт адреси в пам'яті -- один байт. (Див. пункти 2-3 та 5 попереднього списку.) Однак, про цю відмінність слід завжди пам'ятати!

Трішки складнішим є читання довільного байта. Спочатку "в мікросхемку" слід записати адресу байта, потім прочитати його. Для цього робимо так:
  1. Подається сигнал Start
  2. Передаються 7 біт адреси пристрою, в нашому випадку -- мікросхеми пам'яті + біт 0 (R/W -- запис), очікується ACK від неї.
  3. Передаємо старший байт адреси в пам'яті. Очікуємо ACK.
  4. Передаємо молодший байт адреси в пам'яті. Очікуємо ACK. 
  5. Передаємо знову сигнал Start (так-званий повторний старт). Адресу пристрою виставляємо ту ж (адже ми звертаємося до тієї ж мікросхеми, що й в попередніх кроках), однак тепер біт R/W -- 1, читання. Очікуємо ACK.
  6. Читаємо переданий Slave-пристроєм, пам'яттю, байт.
  7. Передаємо NACK. Повідомляємо таким чином їй, що ми отримали бажане. 
  8. Посилаємо сигнал Stop. 
Знову глянемо на діаграму з  атмелівського даташіта:

Пам'ять має внутрішній лічильник поточної адреси, байт, на який він вказує, можна прочитати, не передаючи його адреси. Для цього слід після сигналу Start передати адресу пристрою + біт R/W=1 -- режим читання. Такий режим називається читанням за поточною адресою (Current Address Read). Після кожного прочитаного байта внутрішній лічильник збільшується на 1, переходячи до наступної адреси. (Навіть якщо читання відбулося за довільною адресою). Також під час запису він встановлюється на байт, наступний після записаного.
Читання за поточною адресою. (Взято з атмелівського даташіта)
Крім того, мікросхеми підтримують запис сторінками (Page Write) та послідовне читання (Sequential Read).

Пам'ять мікросхем серії 24C ділиться на сторінки фіксованого розміру. Запис в межах сторінки можливий за одне звернення. Для цього потрібно, після передачі адреси, просто продовжувати посилати байти. Сигнал Stop означатиме завершення передачі. Розмір сторінок запису "великих" та "малих" мікросхем відрізняється.  Великі, 128/256 біт, мають розмір сторінки 64 байта, малі, 01/02/04/08/16 -- 16 байт (*3). Тобто, якщо є послідовність байт, чиї адреси відрізняються лише 4-ма для "малих", 6-ма для "великих" молодшими бітами, після передачі адреси, слід просто продовжувати посилати байти. Таким чином за один запис можна передати до 64 байта великій і 16 байтів малій мікросхемам.

Увага! Якщо спробувати послідовно записувати за край сторінки, відбудеться "згортання" і запис відбуватиметься з її початку.

Запис сторінками. (Взято з атмелівського даташіта)
Послідовне читання ще простіше -- поки у відповідь на передані пам'яттю дані не подано NACK, мікросхема передаватиме наступний байт та збільшуватиме лічильник поточної адреси. Досягнувши останнього, перейде на початок, байт з адресою 0, і продовжить далі. Для завершення слід відповісти NACK і подати сигнал Stop. Що цікаво, як показав прямий експеримент, (разом із мовчанкою в даташітах), послідовне читання легко проскакує межу між частинами "малої" мікросхеми, не зважаючи на відсутність зміни апаратної адреси.

Послідовне читання. (Взято з атмелівського даташіта)

Підключення


Схема надзвичайно проста -- різні пристрої під'єднуються до спільних ліній SDA та SCL (так-зване "монтажне І"), які підтягнуто резисторами порядку 10кОм до живлення (Vcc) (*4).

Найпростіший приклад, контролер, з'єднаний шиною I2C з єдиним пристроєм, M24C04:

Схема 1.
Конкретний контролер спеціально не уточнено, інші його виводи не показано для простоти.
WC, якщо потреби дозволяти-забороняти запис немає, або шкода ноги контролера, можна залишити так, або для надійності -- заземлити.
В наведеній конфігурації: E1,E2 заземлені, адреса мікросхеми: 1010000b, або 0x50. Реально вона займе дві адреси -- цю, та 1010001b, або 0x51 для байт з номерами від 256 до 511.
R1,R2 ~ 10кОм.
Більш складний варіант, коли під'єднано дві різні мікросхеми пам'яті:


Схема 2.
Конкретний контролер спеціально не уточнено, інші його виводи не показано для простоти.
Обидва WC, якщо потреби дозволяти-забороняти запис немає, або шкода ноги контролера, можна залишити так, або для надійності -- заземлити.
В наведеній конфігурації: E1,E2 заземлені, адреса мікросхеми M24C04: 1010000b/ 1010001b, або 0x50/0x51;
A1 під'єднано до живлення, A0 заземлено, щоб уникнути колізії по адресі з M24C04, таким чином, адреса AT24C256:  1010010b, або 0x52.
R1,R2 ~ 10кОм
Зверніть увагу, що адреса AT24C128 вибрана так, щоб не конфліктувати з двома адресами, присвоєними M24C04 (в даному випадку, із E1=E2=0, заземленими -- 0x50 i 0x51).

Підсумок


В цьому "есе" ми розглянули три важливих питання:
  1. Що таке шина I2C, як вона працює.
  2. Як працювати з EEPROM по протоколу I2C.
  3. Під'єднання мікросхем пам'яті до мікроконтролера.
Володіючи цією інформацію, наступного разу спробуємо поспілкуватися із цими мікросхемками -- записати дані, прочитати їх,  тощо.

Увага, в початковому варіанті поста була груба помилка на тему адресації байт в "малих" мікросхемах, виправлена 24-07-2012.

Додаток

 

Фізичні характеристики мікросхем

Даташіти містять ще одну важливу інформацію -- про максимально припустимі (*5) та нормальні робочі параметри "навколишнього середовища" мікросхем. Це напруги живлення, напруги на виводах, температури, споживані струми і т.д. і т.п. Щоб запобігти невірній роботі чи пошкодженню пристроїв, слід уважно пильнувати, чи не порушуємо ми вказаних виробником обмежень.

Наведемо найбільш суттєві параметри, щоб створити уявлення, з чим доведеться мати справу.

Для Атмелівських (лише сімейства з робочим діапазоном 4.5-5.5В, решта тут не розглядаємо):
  • Максимальний діапазон робочої температури: -55С -- +125С
  • Максимальний діапазон температури зберігання: -65С -- +150С
  • Максимальна напруга на будь-яких виводах: -1.0 -- 7 В
  • Максимальна робоча напруга: 6.25В
  • Максимальний струм, що може витікати з виводу: 5.0мА
  • Робоча температура:  -40С -- +125С
  • Робоча напруга: Vcc = +4.5В - +5.5V (згадується також діапазон 2.7-5.5В)
  • Типове споживання струму під час запису, при Vcc=5В, на частоті 400кГц: 2мА (не більше 3мА)
  • Типове споживання струму під час читання, при Vcc=5В, на частоті 400кГц: 1мА (не більше 2мА)
  • Споживання в режимі Standby: 6мкА
  • Типовий струм, що входить/виходить через виводи керування: 0.10/0.05 мкА (не більше 3.0/3.0 мкА)
  • Вхідна напруга, що відповідає логічному 0: -0.6 -- 0.3*Vcc
  • Вхідна напруга, що відповідає логічному 1: Vcc*0.7 -- Vcc+0.5В
  • Вихідна напруга, що відповідає логічному 0: максимум 0.4В
  • Максимальна частота -- 1МГц. (400кГц для схем з Vcc=2.5В) (характеристики сигналу - див. даташіт).
  • Кількість циклів запису, за температури 25С: 100 000--1 000 000. (?) 
  • Середній час збереження даних: 100 років.
Для мікросхем фірми ST (M24C04-WBN6P), серії W, рівня 6:
  • Максимальний діапазон робочої температури: -40С -- +130С
  • Максимальний діапазон температури зберігання: -65С -- +150С
  • Максимальна напруга на будь-яких виводах: -0.5 -- 6.5 В
  • Максимальна робоча напруга: 5.5В (?)
  • Максимальний струм, що може витікати з виводу: 5.0мА
  • Робоча температура:  -40-85С.
  • Робоча напруга: Vcc = +2.5В - +5.5V
  • Типове споживання струму під час запису, при Vcc=5В, на частоті 400кГц: не вказано, але не більше 2мА
  • Типове споживання струму під час читання, при Vcc=5В, на частоті 400кГц: не вказано, але не більше 2мА
  • Споживання в режимі Standby: 1 мкА
  • Типовий струм, що входить/виходить через виводи керування: не вказано, але не більше 2.0/2.0 мкА
  • Вхідна напруга, що відповідає логічному 0: -0.45 -- 0.3*Vcc
  • Вхідна напруга, що відповідає логічному 1: Vcc*0.7 -- Vcc+1В 
  • Вихідна напруга, що відповідає логічному 0: максимум 0.4В
  • Максимальна частота -- 400кГц
  • Кількість циклів запису, за температури 25С: 100 000-1 000 000. (?) 
  • Середній час збереження даних: 40 років.
Знаками питання відмічено параметри, вказані неоднозначно. Додатково для них вказано:
  • Максимальну температуру паяння: 260С
  • Максимальну статичну напругу ("іскра" від людини): 4000В 


Виноски

(*0) Так, писати EEPROM пам'ять це тавтологія, ну і що? :-)

(*1) Однак при цьому схема може ставати чутливою до завад, всіляких наводок і т.д. -- опір внутрішнього підтягуючого резистора типово великий, 100кОм і більше, він може не справлятися. Зокрема, в даташіті Atmel пише:

WRITE PROTECT (WP): The write protect input, when connected to GND, allows normal write
operations. When WP is connected high to VCC, all write operations to the memory are inhib-
ited. If the pin is left floating, the WP pin will be internally pulled down to GND if the capacitive
coupling to the circuit board VCC plane is <3 pF. If coupling is >3 pF, Atmel recommends con-
necting the pin to GND
.


Тому, якщо це не сильно ускладнює схему, краще не залишати виводи "підвішеними".

(*2) Хоча, траплялися згадки, що насправді такі виводи іноді можуть бути до чогось там в середині під'єднані, призводячи до проблем.

(*3) Даташіт ST, на мікросхеми M24C01/02/04/08/16 говорить тільки про 16-байтові сторінки, однак аналогічний атмелівський стверджує, що AT24C01/02 мають 8-байтові сторінки.

(*4) Процедуру вибору резисторів описано в даташітах. Великі резистори -- менше енергоспоживання, більша чутливість до завад. Чим менший резистор, тим більше можлива швидкодія -- швидкість переключення, так як саме через них відбувається перезарядка ємності ліній (така собі "паразитна" RC-ланка), але й струм, що споживається, росте. Слід пам'ятати і про обмеження на максимальний струм, що може "виходити" з мікросхем.

(*5) Зазвичай, максимально припустимі параметри вказуються, за умови, що всі решта -- в нормі, та наголошується, що тривале їх знаходження поблизу граничних значень сильно зменшує термін служби.

9 коментарів:

  1. Дякую за опублікований матеріал.

    ВідповістиВидалити
  2. Дякую, дуже корисна інформація!

    ВідповістиВидалити
  3. Скільки шукав, лише у цій статті знайшов потрібну інформацію. Дякую!

    ВідповістиВидалити
  4. Дяка! Оце вже розписав так розписав :)

    ВідповістиВидалити
  5. До речі, як я пам'ятаю, головна мета повторного старту — забезпечити атомарність звертання у системі з декількома ведучими. Тобто перший крок — запис адреси — заносить адресу у внутрішній регістр мікросхеми і головне, щоб до читання ніхто її не змінив.

    ВідповістиВидалити
  6. Працював з STM32F103xx.
    Звертався до "малої мікросхеми" (E2=E1=E0) за адресою: 0х50 і нічого не виходило. тоді змінив адресу на 0хА0 і все запрацювало.
    Майте це на увазі!
    0хА0 = 0х50 << 1

    ВідповістиВидалити
    Відповіді
    1. Так, це відома річ, адресою на I2C є біти [7..1] байту і в документації на мікросхеми вказуються зазвичай вони, без нульового біта R/W. А далі залежить від використаної бібліотеки, деякі зсувають вліво самостійно. Вірне не лише для EEPROM, а для i2c взагалі, на це ж саме тут напоролися http://replace.org.ua/post/109319/#p109319
      І ще непогана тема по EEPROM на replace http://replace.org.ua/topic/9430/

      Видалити
    2. Автор видалив цей коментар.

      Видалити
    3. The control byte consists of a four bit control code; for
      the 24XX64 this is set as 1010 binary for read and write
      operations

      Видалити