Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Тема закрыта

EEPROM AT45DB081D + AVR

Пн июл 16, 2012 12:26:08

Добрый день!.помогите запустить еепромку.
Суть проблемы в том что пишу в буфер данные допустим
-> 0b 1111 1111 а при считывание с еепромки получаю 0b 0111 1111 <-
-> 0b 0111 1111 чтение 0b 1011 1111
-> 0b 0011 1111 чтение 0b 1001 1111
-> 0b 0001 1111 чтение 0b 1000 1111
в общем она берет стирает старший бит данных и переносит его в 7-мой бит .
в чем может быть проблема ?? :shock:
код по даташу ниже будут картинки .
Код:
int i;
   unsigned char temp = 0x80; //(1<<7); SPIF

   PORT_SPI=(1<<DD_SS);                           //PORTB
   DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK)|(1<<DD_SS); //DDRB
   SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);

//запись в буфер
PORTB &= ~(1<<4); //SS=0
     
  SPDR = 0x84;            //опкод записи в буфер 1
  while (!(SPSR & temp));
  SPDR =0;                //не имеет значения 
  while (!(SPSR & temp));
  SPDR =0;                // не имеет значения 
  while (!(SPSR & temp));
  SPDR =0;                // адрес в буфере
  while (!(SPSR & temp));

  SPDR =0b00001111;  //данные
  while (!(SPSR & temp));
     
PORTB |= (1<<4); //SS=1


//чтение из буфера
PORTB &= ~(1<<4); // SS=0
 
  SPDR = 0x54;               //опкод чтение из буфера 1    
  while (!(SPSR & temp));
  SPDR =0;                 // не имеет значения 
  while (!(SPSR & temp));
  SPDR =0;                 // не имеет значения 
  while (!(SPSR & temp));
  SPDR =0;                 // не имеет значения 
  while (!(SPSR & temp));
  SPDR =0;                 // адрес в буфере
  while (!(SPSR & temp));

  SPDR =0x00;              // не имеет значения 
  while (!(SPSR & temp));
  i=SPDR;  //чтение
 
PORTB |= (1<<4); // SS=1
Вложения
Без имени-5.jpg
Рисунки с даташа
(90.22 KiB) Скачиваний: 684

Re: EEPROM AT45DB081D + AVR

Пн июл 16, 2012 18:20:48

вроде как правильно, только зачем нужен temp и while (!(SPSR & temp));, можно например так while(!(SPSR & (1<<SPIF))); - наверное хекс будет меньше (проверка бита в регистре).
почему i int, i=SPDR, тогда уж i=(int) SPDR;
Посмотрел свои исходники - буфер заполнял весь (264 байта), переписывал командой 0х83 в main memory. Читал командой 0хЕ8 без буфера. Все отлично работало.

Re: EEPROM AT45DB081D + AVR

Вт июл 17, 2012 12:06:56

Ну с буфером вроде все работает читает пишет пришлось вот эти биты установить
Код:
SPCR = (1<<SPE) | (1<<MSTR)| (1<<CPOL) | (1<<CPHA);
теперь пытаюсь содержимое буфера записать в страницу и прочитать ее потом но чет оно не хочет этого делать =( выложите исходник если он у вас остался .

Re: EEPROM AT45DB081D + AVR

Вт июл 17, 2012 13:15:53

остались исходники консольного приложения для PC - вначале тренировался на порту LPT.
Потом был куплен для записи AT45 программатор Тритон, а в устройстве (для воспроизведения звука) стояла тини13 и уже записанная звуком AT45. Программа для тини написана была на АБ - там только чтение.
Может пригодится:
LPT_AT45p.zip
(1.72 KiB) Скачиваний: 326

Re: EEPROM AT45DB081D + AVR

Вт июл 17, 2012 15:32:50

Может это пригодится.
Вложения
read_from_at45.rar
(724 байт) Скачиваний: 379

Re: EEPROM AT45DB081D + AVR

Вт июл 17, 2012 17:31:43

Спасибо за код,буду сидеть разбираться :)

Re: EEPROM AT45DB081D + AVR

Ср июл 18, 2012 17:34:21

блин чет все равно не хочет читать с самой памяти.в буфер все пишется читается .когда читаю с самой памяти все байты получите равны 0xFF;
по сути это вить значит что в еепром не чего не записалось и я читаю стертые данные ?

Re: EEPROM AT45DB081D + AVR

Чт июл 19, 2012 05:32:07

тут можно еще почитать: http://electronix.ru/forum/index.php?showtopic=103639

Re: EEPROM AT45DB081D + AVR

Чт июл 19, 2012 10:37:49

WP и RESET подтянуты к питанию?

Re: EEPROM AT45DB081D + AVR

Пт июл 20, 2012 09:41:14

Уф ура товарищи :)) все заработало все проблема заключалась в том что я не проверял регистр статуса на занятость еепромки
.Сделал проверки перед каждым действием записи или чтение и все пошло :) Спасибо всем за помощь !

Re: EEPROM AT45DB081D + AVR

Сб июл 21, 2012 20:37:13

Возник еще один вопрос .По даташу написано что размер странице по умолчанию стоит 264 байта но я читаю регистр статуса сразу после инициализации SPI и в нем нулевой бит стоит 1-ца то биш размер страницы 256 байт . и при чтение страницы тоже читается до 255 байта а дальше 0xFF.В общем как можно сделать размер страницы 264 байта ?
Тема закрыта