gorlanovmax

Проблема при работе с внешней EEPROM

20 сообщений в этой теме

gorlanovmax    2

Доброго времени суток, работаю с AtMega128. Пишу на CodeVisionAVR.

Пишется бортовой компьютер со стрелочной индикацией, соответственно надо хранить большое количество картинок для отображения положения стрелки.

Необходимо использовать внешнюю память, остановился на 24LC512.

Но никак не могу ее запустить.

Шина i2c точно работает, т.к. на ней еще установлены часы на базе DS3231.

Часы отлично программируются и выдают данные.

При этом память постоянно выдает FF во всех ячейках.

Последовательность чтения и записи полностью соответствует даташиту.

Не могу понять в чем моя ошибка.

Код библиотеки для памяти:

#include <delay.h>

#define Ext_EEPROM_Adr 0b10100000 // Адрес 24LC512 на I2C шине

/* read a byte from the EEPROM */
unsigned char eeprom_read(unsigned char address2, unsigned char address1) //Функция чтения из внешней EEPROM
{
unsigned char data;                    
i2c_start();                       //Кидаем команду "Cтарт" на шину I2C
i2c_write(Ext_EEPROM_Adr);         //Кидаем на шину адрес 24LC512
i2c_write(address2);               //Старший байт адресного пространства 24LC512
i2c_write(address1);               //Младший байт
i2c_stop();                        //Посылаем команду "Cтоп"
i2c_start();                       //Снова посылаем "старт" в шину
i2c_write(Ext_EEPROM_Adr | 1);     //Обращаемся к 24LC512 в режиме чтения, т.е. по адресу 101000001
data=i2c_read(0);                  //Принимаем данные с шины и сохраняем в переменную
i2c_stop();                        //Посылаем команду "Cтоп"
return data;                       //Возвращаем значение прочитанного
}

/* write a byte to the EEPROM */
void eeprom_write(unsigned char address2, unsigned char address1, unsigned char data) //Функция записи во внешнюю EEPROM
{   
i2c_start();                           //Кидаем команду "Cтарт" на шину I2C
i2c_write(Ext_EEPROM_Adr);             //Кидаем на шину адрес 24LC512
i2c_write(address2);                   //Старший байт адресного пространства 24LC512
i2c_write(address1);                   //Младший байт
i2c_write(data);                       //Посылаем байт для записи
i2c_stop();                            //Посылаем команду "Стоп"
delay_ms(5);                           //Даем микросхеме время записать данные, EEPROM довольно медлительна
}

 

тестовый код записи:

//объявление переменных
unsigned char low_byte, message[23]={'H','E','L','L','O',',',' ','e','x','t','e','r','n','a','l',' ','E','E','P','R','O','M','!'};

for(low_byte=0; low_byte<23; low_byte++)   
 {
    eeprom_write(0x00, low_byte, message[low_byte]); 
 }   

код чтения из памяти:

for(low_byte=0; low_byte<23; low_byte++) 
{
    i=eeprom_read(0x00,low_byte);
    TFT9341_Draw_Char(10+(low_byte*11),100,RED,WHITE,i,3 );
    delay_ms(100);
} 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Yurkin2015    320

При чтении: i2c_stop(); в середине не нужен.

Нога WP соединена с общим проводом?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
gorlanovmax    2

WP на земле.

остановку шины при чтении убрал - изменений не последовало.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    556
23 минуты назад, Yurkin2015 сказал:

При чтении: i2c_stop(); в середине не нужен.

Наоборот, при записи не нужен.
При чтении, идёт сначала запись адреса, затем рестарт, потом команда с установленным битом чтения, затем чтение данных.
 

Вот, из рабочего проекта :

/********************************************************************************************/
static char read_block(unsigned char* pBuf, unsigned int address, unsigned int size){
char ret=0;
unsigned short  adr=address;
unsigned char   b16 = *((unsigned char*)&address+2);
unsigned char   cmd[2]={0xA0 | ((b16&0x01)<<1), 0xA1 | ((b16&0x01)<<1)};
I2C_ENTER_ATOMIC();
    I2C_Start();
    if(I2C_Send(&cmd[0], 1)){
        ret=1;
        if(!I2C_Send((unsigned char*)&adr+1, 1))    ret=0;
        if(!I2C_Send((unsigned char*)&adr, 1))      ret=0;  
        I2C_Restart();
        if(!I2C_Send(&cmd[1], 1))                   ret=0;
        if(!I2C_Recive(pBuf, size))                 ret=0;
    }
    I2C_Stop();
I2C_EXIT_ATOMIC();
return ret;
}
/********************************************************************************************/
static char write_block(const unsigned char* pBuf, unsigned int address, unsigned int size){
char ret=0;
unsigned short  adr=address;
unsigned char b16 = *((unsigned char*)&address+2);
unsigned char   cmd[2]={0xA0 | ((b16&0x01)<<1), 0xA1 | ((b16&0x01)<<1)};
I2C_ENTER_ATOMIC();
    I2C_Start();
    if(I2C_Send(&cmd[0], 1)){
        ret=1;
        if(!I2C_Send((unsigned char*)&adr+1, 1))    ret=0;
        if(!I2C_Send((unsigned char*)&adr, 1))      ret=0;  
        if(!I2C_Send(pBuf, size))                   ret=0;
    }
    I2C_Stop();
I2C_EXIT_ATOMIC();
return ret;
}
/********************************************************************************************/

Может быть чем-нибудь поможет.
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Yurkin2015    320

Ну, осталось про ноги А0 А1 А2 спросить, на земле сидят?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
gorlanovmax    2

у lc512 есть только А0 и А1,  обе сидят на земле.

у меня в чтении рестарт есть изначально.

при записи нет.

поэтому и чешу репу, что вроде все верно, а не работает

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    556

И ещё. Между записями должна быть выдержана пауза, порядка 5 мс. (если не ошибаюсь).
А у Вас, на сколько я вижу, идёт запись 23 байт без всяких задержек.
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Yurkin2015    320
18 минут назад, gorlanovmax сказал:

 

у lc512 есть только А0 и А1

 

Ну, не знаю, у меня в даташитах все три ноги есть. Может, всё же одна нога потерялась?

 

7 минут назад, Alex сказал:

на сколько я вижу,

Если приглядеться, то задержку видно ...

  • Одобряю 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    556
3 минуты назад, Yurkin2015 сказал:

Если приглядеться, то задержку видно ...

Блин, точно, не заметил :blush:


 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
gorlanovmax    2

Да, задержка есть.

Микруха стоит на плате с часами.

Все три ноги повешены на землю.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
artos5    290

У меня была проблема что до 8 байт писалось , а больше нет. Проблема в задержке была. А тут , если код нормальный то может и микруха не рабочая ..

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Yurkin2015    320
3 часа назад, gorlanovmax сказал:

Все три ноги повешены на землю.

Ну, тогда пошагово проверять - отвечает ли микросхема на команды? Послать старт и одну единственную команду: если все ноги и адреса правильные - должен быть ответ.

i2c_start();                       //Кидаем команду "Cтарт" на шину I2C

// Проверяем ответ Acknowledge

if(i2c_write(Ext_EEPROM_Adr)) TFT9341_String(10, 10, GREEN, WHITE,"OK", 2); // получили ответ !

else TFT9341_String(10, 10, RED, WHITE, "BAD", 3); // ответа нет :(

 

  • Одобряю 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
gorlanovmax    2
В 20.06.2017 в 08:40, artos5 сказал:

микруха не рабочая ..

пробовал сначала на этой плате 32-ю. с тем же результатом. потом купил 512-ю

В 20.06.2017 в 12:04, Yurkin2015 сказал:

Ну, тогда пошагово проверять

Спасибо, сегодня вечером проверю

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
gorlanovmax    2
В 20.06.2017 в 12:04, Yurkin2015 сказал:

Ну, тогда пошагово проверять - отвечает ли микросхема на команды? Послать старт и одну единственную команду: если все ноги и адреса правильные - должен быть ответ.


i2c_start();                       //Кидаем команду "Cтарт" на шину I2C

// Проверяем ответ Acknowledge

if(i2c_write(Ext_EEPROM_Adr)) TFT9341_String(10, 10, GREEN, WHITE,"OK", 2); // получили ответ !

else TFT9341_String(10, 10, RED, WHITE, "BAD", 3); // ответа нет :(

 

Выдает ошибку.

При этом вот такой код:

i2c_start();
ack=i2c_write(Ext_EEPROM_Adr);
sprintf(lcd_buff,"%03u",ack);
TFT9341_String(10, 10, GREEN, WHITE,lcd_buff, 3); 
i2c_stop();

Выдает 0 на экране.

Если я правильно понимаю, то 0 значит отсутствие ошибки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Yurkin2015    320

У меня для Вас плохие новости. Ноль - значит ответ-подтверждение от микросхемы не получили.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
snn_krs    46
В 19.06.2017 в 21:51, gorlanovmax сказал:

#define Ext_EEPROM_Adr 0b10100000 // Адрес 24LC512 на I2C шине

Похоже у вас ошибка в адресе. Советую сделать цикл запись - чтение для всех адресов с 0b10100000 по 0b10101110 и посмотреть

на какой адрес будет ответ. По умолчанию на плате перемычки не запаяны и адрес 0b10101110

  • Одобряю 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    556

Нормально всё у него с адресом.
И о каких перемычках речь идёт ?
 

Цитата

Ноль - значит ответ-подтверждение от микросхемы не получили

Ещё не факт. Ноль может означать и присутствие ACK-бита, т.к. он нулевой.
Нужно смотреть функцию i2c_write.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Yurkin2015    320

Будьте споки, я посмотрел эту функцию прежде чем ответить :)

  • Одобряю 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    556

А, ну тады ой, звиняйте :)


 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
gorlanovmax    2
4 часа назад, snn_krs сказал:

Похоже у вас ошибка в адресе. Советую сделать цикл запись - чтение для всех адресов с 0b10100000 по 0b10101110 и посмотреть

на какой адрес будет ответ. По умолчанию на плате перемычки не запаяны и адрес 0b10101110

Спасибо. Действительно проблема была в этом.

Хотя ноги и звонятся на землю.

Все пишет и читает

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Похожие публикации

    • Автор: AronIIStone
      Добрый день
      Возникла ситуация: имеется ноутбук IBM ThinkPad t20 с запароленым Bios. Пароль никто не помнит, но он зашит в 24rf08. Его можно прочитать програмкой для считывания данной микросхемы, но для этого нужен программатор. Можно ли использовать в качестве такого программатора Ардуино, чтобы он вопринимался этой программой как надо, и если можно, то как нужно подключить их и какой скетч залить в ардуинку? 
      Саму программу выложу чуть позже, если необходимо - с мобильника сижу. 
      Спасибо 
    • Автор: Oleg031
      Прошу Вашей помощи уважаемые форумчане!
      Автором В. Нефёдовым, г. Брянск была предложена интересная схема "Универсального микроконтроллерного зарядного устройства", http://www.radioradar.net/radiofan/power_supply/microcontroller_universal_charger.html#comment,
      которая была мной повторена. Схема рабочая, но по причине моей неграмотности в программировании - работает у меня не корректно! А именно не могу правильно записать при программировании через eXtreme Burner в EEPROM приведенные им коды: по адресу 00H - 2СН, по адресу 01H - 03H, по адресу 02H - 0BEH, по адресу 03H -64H. Не понимаю что, как и куда писать. Не судите строго!
      Прошу либо скиньте фотку как это должно выглядеть в программе, либо файл .eep
    • Автор: Brender3000
      Санкт-Петербург.  По цене договоримся легко, но желательно (если с пересылом) такое кол-во сразу прикидывать, чтобы хотя бы примерно, ну от 500 р , Просто из-за 200 р. на почту лень бегать и там еще очередь стоять. Фотки нужных МС пришлю заранее естественно, большая часть в кучу в аттаче.
      Связь или здесь в лс или:
      Ватсап +79117214333
      Вконтакт  https://vk.com/the_working_dead
      Список:
      ====================================
      SSM2166S - усилитель микрофона с настройкой компрессии и подавлением шумов, корпус SOIC-14
      http://www.analog.com/media/en/technical-documentation/data-sheets/SSM2166.pdf
      INA128UA - высокоточный инструментальный ОУ с низким потреблением 700мкА,питание ±2.25 V to ±18 V, корпус SO-8
      http://www.ti.com/lit/ds/symlink/ina129.pdf
      A3964SB - драйвер шагового движка
      https://media.digikey.com/pdf/Data Sheets/Allegro PDFs/3964.pdf
      740L600 - оптопара, TTL-буфер
      http://213.114.131.21/_pdf/74_TTL/74OL6000.pdf
      AQW213EH - сдвоенная оптопара
      https://ru.mouser.com/ds/2/315/panasonic electric works_aqw-dip-current-limiting--1196835.pdf
      HT9200A - генератор тонального сигнала/2.5V~5.5V/3.58MHz/Serial/8 DIP/
      http://www.farnell.com/datasheets/79214.pdf
      RPM6938 - ИК приемник
      https://www.mouser.com/ds/2/348/rpm6900-313874.pdf
      IDT7202LA - асинхронный FIFO на полевиках 1024x9
      https://www.mouser.com/ds/2/464/IDT_7200-7202_DST_20171127-880469.pdf
      PCF7942AT - транспондер и контроллер бесконтактного досутпа
      http://www.ic72.com/pdf_file/p/70131.pdf
      VB027 - высоковольтный драйвер катушек зажигания
      http://pdf.datasheetcatalog.com/datasheet/stmicroelectronics/5589.pdf
       
      SP706-EP - низкопотребляющий контроллер напряжения 4.40V DIP-8
      http://pdf.datasheetcatalog.com/datasheet/sipex/SP708CN.pdf
      DS1013S - 3 линии задержки
      http://www.phenix.bnl.gov/phenix/WWW/muon/muid_fee/whitus/data_sheets/DS1013.pdf
      TCM38C17IDL- 4 канальный ИКМ
      https://media.digikey.com/pdf/Data Sheets/Texas Instruments PDFs/TCM38C17IDL.pdf
      LF398AN - усилитель выборки и хранения
      http://www.ti.com/lit/ds/symlink/lf398-n.pdf
      MAX7408 - эллиптический фильтр низких частот 5 порядка
      https://datasheets.maximintegrated.com/en/ds/MAX7408-MAX7415.pdf
      LXT6234QE - мультиплексор, корпус PQFP-100
      http://www.ic72.com/pdf_file/l/151749.pdf
      2N4012 - n-p-n биполярный транзистор
      http://kazus.ru/datasheets/pdf-data/1946963/NJSEMI/2N4012.html
      M27V160-100FX1 - 16 Mbit (2Mb x8 or 1Mb x16) EEPROM корпус FDIP42WB (с окошком)
      https://ru.mouser.com/ds/2/389/stmicroelectronics_cd00001045-1204542.pdf
      MAX9388EUP - мультиплексор, корпус TSSOP-20
      https://datasheets.maximintegrated.com/en/ds/MAX9386-MAX9388.pdf
      PGA204BU - инструментальный ОУ с настройкой КУ, SOIC-16
      http://www.ti.com/lit/ds/symlink/pga204.pdf
      MAX211EWI -  Трансивер RS-232, SO-28
      https://datasheets.maximintegrated.com/en/ds/MAX200-MAX213.pdf
      ALTERA MAX EPM9320ALC84-10 - ПЛИС
      https://www.altera.com/en_US/pdfs/literature/ds/archives/m9000.pdf



    • Автор: Onerock
      Ребята, вот читаю форум и думаю - может помочь кому необходимо.
      есть кальки и программаторы еепром, процессоров. если в Москве, подъезжайте. помогу. 
      либо отправляйте дампы. могу пересчитать.
    • Автор: Игорь Плессер
      Доброго времени суток!
      Делаю библиотеку для расширения возможностей EEPROM!Помогите в создании, идеями, мыслями, предложениями и всем в этом роде!
      Планирую добавить:
      -Чтение\запись отдельных битов;
      -Возвращение размера EEPROM(в байтах);
      -Возвращение размера отдельной строки в памяти EEPROM(в байтах);
      -Возвращение размера незанятой памяти EEPROM(в байтах, но желательно КБ);
      -Вывод\ввод данных EEPROM по UART/SPI/I2C(взаимодействие 2x EEPROM);
      -Чтение\запись STRING/HEX/BIN;
      -Еще хочу реализовать хранение символьных картинок типа(если возможно):
      ////////////////////////////////////////////////////////////////////////////////////////////////////////
      //#####//#####//####//####//#####//#////#//#////////////////////////#////////
      //#//////////#//////////#////#//#////#//#//////#//#/#/#//#//////////////#////////#////////
      //#####//#####//####//####//#//////#//#////#//#//////////###////////###////
      //#//////////#//////////#////////#//#////#//////#//#////#//#//////////////#////////#////#//
      //#####//#####//#////////#///#///#####//#////#//#####//#####//#//##////
      ////////////////////////////////////////////////////////////////////////////////////////////////////////
      Здесь написано EEPROMLib!
      -Ваши идеи,мысли,предложения!
      Всех кто будет содействовать(т.е. портиртировать из интернета или предлагать свои рабочие процедуры\функции и т.п.) созданию библиотеки запишу
      в начале библиотеки ник\имя,как человека\людей содействовавших\помогавших в создании библиотеки EEPROMLib!
      P.S. Сильно не ругайте!За то что по пустякам дергаю!