реклама на сайте
подробности

 
 
> Проблемы с EEPROM 24LC16B, Чтение и запись данных с N-го раза
Grigorij
сообщение May 19 2008, 12:32
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 71
Регистрация: 10-03-07
Пользователь №: 26 038



Здравствуйте.

Возникла необходимость записывать данные в EEPROM 24LC16B. Для реализации интерфейса I2C взял исходник из примеров от HI-TECH-а, предварительно убрав некоторые ф-ции и подкорректировав под PIC16F690 (исправил номера портов и добавил ф-цию настройки SSP). Чтение и запись данных из/в EEPROM осуществляется с помощью следующих ф-ций:
Код
void WriteI2CEEPROM(unsigned char data)
{
       StartI2C();
       SendByteI2C(0xA0 | (EEPROMBlock << 1));
    
       I2CReadAck();
    
       SendByteI2C(EEPROMAddr);
    
       I2CReadAck();
    
       SendByteI2C(data);
       I2CReadAck();
        
       StopI2C();
}

//чтение данных из EEPROM
int ReadI2CEEPROM(void)
{
      int data = -1;    
    
      StartI2C();
      SendByteI2C(0xA0 | (EEPROMBlock << 1));
      I2CReadAck();
      
      SendByteI2C(EEPROMAddr);
      I2CReadAck();
      
      StartI2C();
      SendByteI2C(0xA0 | (EEPROMBlock << 1) | 0x01);
      I2CReadAck();
      
      data = ReadByteI2C();
      StopI2C();
      
       return data;
}


Далее в основной программе пытаюсь записать данные в EEPROM и прочить их:
Код
...
     EEPROMAddr  = 0x04; //адрес для записи данных
     EEPROMBlock = 0;

     WriteI2CEEPROM(21);

     DelayMs(10); //задержка на время записи данных

     EEPROMAddr  = 0x04; //адрес для чтения данных
     EEPROMBlock = 0;
    
     IntNumber = ReadI2CEEPROM();
...

При выполении кода, в IntNumber все время получаю число 255. Однако если вызвать несколько раз ф-цию WriteI2CEEPROM(21) (точное число раз не скажу, т.к. ф-цию вызывал в основном цикле программы для проверки правильности передачи данных с помощью осциллографа), то данные все ж таки в EEPROM записывают и их можно прочитать.

В чем может быть проблема?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Сергей Борщ
сообщение May 19 2008, 12:55
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Grigorij @ May 19 2008, 15:32) *
Код
      
      data = ReadByteI2C();
      StopI2C();
      
       return data;
}
В чем может быть проблема?
Не знаю, как у вас реализована ReadByteI2C(), но между чтением последнего байта и StopI2C() должен посылаться NACK. Проверьте, делает ли это ваша ReadByteI2C(). И, согласен с rezident, анализировать результат I2CReadAck() нужно обязательно. При этом можно не делать паузу после записи - память начнет давать ACK как только закончит запись.
В железе все нормально (подтяжки есть?) ?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 11:52
Рейтинг@Mail.ru


Страница сгенерированна за 0.01323 секунд с 7
ELECTRONIX ©2004-2016