Jump to content
alkom

I2C Память И Битые Байты

Recommended Posts

Привет!

Есть у меня один проект на pic24, который использует EEPROM 24LC256.

И все бы хорошо, но иногда данные записываются некорректно.

Чаще всего такое происходит при записи 4х байтовых чисел, хотя они в основном и пишутся, так что не удивительно. И чаще всего повреждается последний байт числа. Повреждается примерно один из нескольких десятков байт.

Память висит на довольно короткой шине ~1.5 см от контроллера, подтяжки на линиях 4.7кОм. С памятью работаю на частоте 400 кГц, снижение частоты не дало никакого эффекта. Повторяется бага на нескольких одинаковых платах. Закономерности выявить не удалось. Выяснил только что мой код пытается записать правильные данные, то есть повреждаются они именно в процессе записи.

Привожу фрагмент кода для роботы с eeprom:

unsigned char ee_adress(int adr)
{
 unsigned char cmd;
 cmd = 0xA0; // | ((adr >> 7)&0xE);
 while (1)
 {
   StartI2C(); IdleI2C();
   // send command and address msb(3)
   MasterWriteI2C(cmd + WRITE_CMD); IdleI2C();
   if (I2CSTATbits.ACKSTAT == 0)
     break;
   StopI2C(); IdleI2C();
 } // while waiting for ACK
 // 3. send address lsb
 MasterWriteI2C(adr >> 8); IdleI2C();
 MasterWriteI2C(adr & 0xFF); IdleI2C();
 // 4. exit returning the cmd byte
 return cmd;
}

void ee_wrDword(int adr, unsigned long data)
{
 // 1. select address
 ee_adress(adr);
 // 2. stream data out
 MasterWriteI2C((data >> 24) & 0xFF); IdleI2C();
 MasterWriteI2C((data >> 16) & 0xFF); IdleI2C();
 MasterWriteI2C((data >> 8 ) & 0xFF); IdleI2C();
 MasterWriteI2C((data >> 0 ) & 0xFF); IdleI2C();
 // 3. terminate the command sequence
 StopI2C(); IdleI2C();
}

Может кто то сталкивался с подобным? В какую сторону копать? Я уже все на что фантазии хватило перепробовал.

Share this post


Link to post
Share on other sites

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

Хотя протокол допускает запись единичного байта. ( с 24LC256 не работал )

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

Share this post


Link to post
Share on other sites

У EEPROM не страничная организация, там есть только буфер записи в 64 байта. Перед записью проверяется опустошение этого самого буфера, то есть завершение процесса записи (цикл в функции ee_adress()) в полном соответствии с Datasheet. Да и задержки я пробовал добавлять, не помогает :(

Edited by alkom

Share this post


Link to post
Share on other sites

Конденсаторы Panasonic. Часть 4. Полимеры – номенклатура

В заключительной, четвертой статье из цикла «Конденсаторы Panasonic» рассматриваются основные достоинства и особенности использования конденсаторов этого японского производителя на основе полимерной технологии. Главной конструктивной особенностью таких конденсаторов является полимерный материал, используемый в качестве проводящего слоя. Полимер обеспечивает конденсаторам высокую электрическую проводимость и пониженное эквивалентное сопротивление (ESR). Номинальная емкость и ESR отличается в данном случае высокой стабильностью во всем рабочем диапазоне температур. А повышенная емкость при низком ESR идеальна для решения задач шумоподавления и ограничения токовых паразитных импульсов в широком частотном диапазоне.

Читать статью

И этот буфер по какой-то случайности назвали Page!

Даже. если буфер не опустошился, то новая запись в буфер убьёт предыдущее состояние.

Да, мы всё равно не можем проконтролировать это.

Может тайминги не соблюдаются?

А ты WP не дёргаешь?

Share this post


Link to post
Share on other sites

WP не дергаю, не надо оно мне. Выяснил тут новые подробности. Ошибка повторяется на конкретных адресах памяти, раньше не заметил, т. к. запись ведется со смещением. Некоторые ячейки читаются всегда одинаково, в не зависимости от того что в них записали. Пока нашел 2 таких, одна читается как 0 другая как 0x67. Вроде как похоже на битую память, но блин на тестовой прошивке, которая забивает всю память какими либо числами и делает верификацию всё работает, ни одной ошибки блин!

Я уже прилепил чтение и верификацию прямо в процедуру записи - фиг, читается всё тот же мусор, то есть ни в каком другом месте программы ячейки эти не перезаписываются. Мистика блин!

Share this post


Link to post
Share on other sites
                     

STM32G0 - средства противодействия угрозам безопасности

Результатом выполнения требований безопасности всегда является усложнение разрабатываемой системы. Особенно чувствительными эти расходы стали теперь, в процессе массового внедрения IoT. Обладая мощным набором инструментов информационной безопасности, микроконтроллеры STM32G0 производства STMicroelectronics, объединив в себе невысокую цену, энергоэффективность и расширенный арсенал встроенных аппаратных инструментов, способны обеспечить полную безопасность разрабатываемого устройства.

Подробнее...

Память точно целая.

Вот два куска кода для примера:

Просто проверка всех адресов микросхемы:

unsigned long read, write;
 unsigned int adr;
 write = 0xAAAAAAAA;
 for(adr = 0; adr < 0x7FFF; adr+=4)
 {
  if(!(adr%100))
  {
   sprintf(debug_txb, "Adr: %u\r\n", adr);
   U1TXREG = debug_txb[0];
  }
  ee_wrDword(adr, write);
  read = ee_rdDword(adr);
  if (read != write)
  {
   sprintf(debug_txb, "Adr: %u Write: %lu Read: %lu", adr, write, read);
   U1TXREG = debug_txb[0];
  }
 }

это работает без запинки.

А вот код который должен бы работать:

for(i = 0; i < 8; i++)
{
if((RtccTimeDate.f.hour == DEC2BCD(ctrl_points[i])) && (RtccTimeDate.f.min == 0))
{
 int j;
 int pointer = ee_rdInt(ADDR_POINTER);
 for (j = 0; j < COUNTERS; j++)
 {
  ee_wrDword(pointer + j*4 + i*24, counters[j].total_value);
 }
}
}

Но не работает( Отладчиком захожу в функцию записи - все параметры передаются правильно, вроде как записывается, а читается фигня.

Share this post


Link to post
Share on other sites

Я писал протокол на ассемблере, поэтому не понимай ничего другого.

Попробуй записать чип программатором, а верификацию сделай в устройстве.

Потом наоборот. Тогда точно будет известно где ошибка - может при чтении возникает.

Тестовую программу не используй, сначала запиши весь объём FFами , потом нулями.

Тогда траблу можно увидеть просто глазом.

А ты в PICе модуль I2C используешь?

А у тебя адресация идёт по четыре байта?

В смысле запись и чтение по четыре байта?

Попробуй читать память полностью - sequential read весь объём, а записывать page write по 64 байта.

Edited by ГОГА рижский

Share this post


Link to post
Share on other sites

В общем там действительно страничная организация памяти и если во время последовательной записи упираемся в конец страницы то все что дальше просто игнорируется. Хотя в их даташите я так этого и не нашел, видимо мое знание английского не дотягивает. Теперь маленькие объемы пишу просто побайтово, а большие страницами. Пока все работает, спасибо за помощь!

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Similar Content

    • By Arvalon
      Здравствуйте.
      Есть камера с шиной I2C и интерфейсом "Camera Port on 21 pin ZIF connector". Информация по сигналам в наличии.
      Есть ли возможность подключить её к ПК под управлением Linux/Window (не считая физического переходника 21 пин ZIF - ножки микросхемы)? Поиск по сети выдал следующий способ. В нём используется I2C-USB переходник из USBasp программатора и микросхема MCP23017 (I2C расширитель портов). Написано что микросхема MCP23017 имеет 16 I/O портов (из 28). Далее напрашивается вопрос, хватит ли выводов микросхемы что бы подключить камеру? Читаю спецификацию на микросхему и не донца понимаю, кажется хватает.
      Опционально, можно ли избавиться от самостоятельного изготовления связки I2C-USB переходник + MCP23017 а воспользоваться готовым? Есть ли в продаже адаптер I2C-USB с достаточным количеством портов? На AliExpress'е что-то не нашлось подходящего.

      MCP23017.pdf
    • By Илья Говжеев
      Поделитесь опытом , кто уже пробывал из arduino сделать программатор pic? 

    • By ilmeko
      Доброго времени суток всем.
      Начал экспериментировать с  WiFi модулем ESP8266. Потребовалась необходимость производить запись и чтение в постоянную память данного модуля, для сохранения настроек сети. Но код не отрабатывает должным образом. Имя (ssid) сети содержит нижнее подчеркивание, так вот этот символ не сохраняется в памяти, при последующем чтении его как будто и не было.
      void setup() { //Подключаемся к сети с сахраненными настройками WiFi.begin(EEPROM_read(0,32).c_str(), EEPROM_read(32,64).c_str()); Serial.print("Connecting to "); Serial.println(EEPROM_read(0,32).c_str()); // Проверяем подключение uint8_t i = 0; while (WiFi.status() != WL_CONNECTED && i++ < 20) { Serial.print("."); delay(500); } if (i == 21) { // Если подключение не произошло, то: Serial.println(""); Serial.print("Could not connect to "); Serial.println(EEPROM_read(0,32).c_str()); delay(500); WiFi.disconnect(); // Отключаем WIFI WiFi.mode(WIFI_AP);// Меняем на режим точки доступа WiFi.softAPConfig(apIP, apIP,(255, 255, 255, 0));// Задаем настройки сети WiFi.softAP(_ssidAP, _passwordAP);// Включаем WIFI в режиме точки доступа Serial.println(""); Serial.print("AP IP address: "); Serial.println(WiFi.softAPIP()); delay(500); char* _ssid = "K_W"; //Переменная для хронения ssid char* _password = "1234"; //Переменная для хронения password EEPROM_write(_ssid, 0); //Пишем ssid в eeprom EEPROM_write(_password, 32); //Пишем password в eeprom delay(500); Serial.println(EEPROM_read(0, 32)); Serial.println(EEPROM_read(32, 64)); } } void EEPROM_write(String buffer, int N) //Запись в eeprom { EEPROM.begin(512); delay(10); for (int L = 0; L < 32; ++L) { EEPROM.write(N + L, buffer[L]); } EEPROM.commit(); } String EEPROM_read (int min, int max) //Чтение eeprom { EEPROM.begin(512); delay(10); String buffer; for (int L = min; L < max; ++L) if (isAlphaNumeric(EEPROM.read(L))) buffer += char(EEPROM.read(L)); return buffer; } Подскажите, что я делаю не так?  Весь код отрабатывет должным образом, кроме записи и/или чтения этого злаполучного нижнего подчеркивания(K_W)
      Ответ в порт после перезагрузки:
      Connecting to KW ..................... Could not connect to KW AP IP address: 192.168.4.1 KW 1234  
      Сменить настройки в роутере не выход, хотя и проще.
    • By Терентенко Андрей
      Добрый день! Имею следующую ситуацию : на базе  PIC16f676  создал приблуду для "управления нештатной магнитолой с руля", а именно  сигнал с руля это 4,8в и в зависимости от нажатой кнопки падает дискретной до 0.8в мк с помощью АЦП отслеживает  на магнитолу паралельно кнопкам кинул оптрони которыми управляет МК. Питание от LM с фильтрующими конденсаторами. При тестових прогонах всё работало как надо (программно реализовано защиту от дребезга аж на 0.1 сек в поисках решений) и в машине  и от штатного БП . Но заметил закономерность сейчас на улице - 2 и при первом запуске минут 5, МК "шумит" несоотвецтвует нажатия на руле кнопке  на магнитоле ! Сигнал с руля смотрел стабильный без дребезга , притом когда тестил вынес магнитолу подключил всё работало гуд но пока устанавливал закручивал она остыла и начинались эти тацы . Кто что подскажет? МК или ЛМ могут так реагировать на температуру ? Прошу прощения у модераторов за повторение теми (может в этом разделе будет актуальней)
    • By voltex
      Всем привет! Подскажите, пожалуйста, как правильно считать данные с внешней eeprom по шине spi, в данном случае 25LC256.
      Написал код ссылаясь на даташит. Собрал схему в протеусе, подключил spi отладчик и вот что получил в итоге. Так же не могу проверить получается записать данные в память или нет. Весь код прикрепил.
       

      main.c
  • Сообщения

    • Я понимаю, когда речь идет о качестве, но не о громкости. Представьте себе компьютерные АС, которых не слышно при подключении к встроенной звуковухе. 
    • А вот Вам доброе лицо нашей артистки Марии Кожевниковой (35лет). Матери троих детей. Звезды сериала "Универ". Оцените! Какие чудеса творит косметика. Фото без макияжа и с макияжем.
    • Не, кина не смотрел. Я просто знаю, что простые схемы "от любого пульта" корректно не работают. Для этого мне даже кина не надо показывать. Простые схемы самые нестабильные.
    • это чё очередной ушник ретро при таких позорных мощностях  с такой искажухой  или конструкция для начинающих для развития двигательных навыков паяния плат а там питалово 75 вольтей и укусить может нехило)))))))) ? 2030 таким в руки !)))
    • @tilarids А ты видео смотрел где эта схемка была выложена? Там ведь всё подробно обьясняется что и как.
    • Я говорил лишь за усилитель зенфона согласно исследованиям ссылки, данной ранее. Там чётко указано измеренное Rout 3.2ома и даются рекомендации по наушникам. Читайте ссылку, там всё распедалено. Если найдёте схему и узнаете параметры цап'а то можно делать выводы о качестве звука. Но скажу сразу, что мр3 плейер той же ценовой категории в этом плане на голову выше зенфона. Поймите главное, что данные гаджеты разной специализации. Смартфон играет музыку, фотографирует но недостаточно хорошо как заточенные под это плейер и фотик. С компом такая же хня. Встроенная звуковуха/видюха не даёт того качества как купленная отдельно и установленная в слот. В зенфоне хард поменять нельзя. Маемо шо е. Усё.
    • 36 и 38 кГц для Вас одно и то же ?
  • Покупай!

×
×
  • Create New...