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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Работа с AT45DB021, При чтении фигня всякая
Moks
сообщение Dec 12 2006, 11:20
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 28-11-05
Из: Москва
Пользователь №: 11 510



Привет! Проконсультируйте меня по поводу AT45DB021. Я вот только пытась работать с ней. И проблема вот в чём: я при чтении данных получаю всякую хрень. Правда, управляю я памятью не Атмеловским контроллером, а Силдабовским, да не суть важно, SPI он и в Африке SPI.

Я вот, к примеру хочу на 2ю страницу памяти (0х01 страница) и 2ю ячейку (0х01 ячейка) послать значение 0х73.

Я шлю:
CS в ноль - 0х82 0х00 0х02 0х01 0х73 CS в единицу.

Дальше читаю:
CS в ноль - 0х52 0х00 0х02 0х01 0х00 0х00 0х00 0х00 читаю буфер SPI - CS в единицу.

Но в приёмном буфере я вижу типа 0хВ7. Вообще непонятно почему. То ли при чтении какие-то проблемы, то ли при записи. Нет у тебя никаких идей по этому поводу?
Заранее спасибо.

blink.gif
Go to the top of the page
 
+Quote Post
Hz!
сообщение Dec 12 2006, 13:47
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 5-05-06
Из: Минск
Пользователь №: 16 792



Проверьте конфигурацию SPI. DataFlash работает в режимах 0 и 3. Возможно вы что вы что-то перепутали.
Go to the top of the page
 
+Quote Post
Moks
сообщение Dec 13 2006, 12:14
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 28-11-05
Из: Москва
Пользователь №: 11 510



Ничего не перепутал. Используется режим 0.
У меня на осциллографе фигня страшная на SO. Постараюсь нарисовать "ЭТО" в виде осциллограмм. На ножках SCK и SI всё как надо (по крайней мере похоже на правду).
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Dec 13 2006, 12:36
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



1.Согласованы ли логические уровни?
2.Отрабатывается ли BUSY?


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
JeDay
сообщение Dec 13 2006, 16:31
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 276
Регистрация: 22-09-05
Из: Kiev
Пользователь №: 8 818



Цитата
Дальше читаю:
CS в ноль - 0х52 0х00 0х02 0х01 0х00 0х00 0х00 0х00 читаю буфер SPI - CS в единицу.


Добавьте еще один 0x00 в конце.
4 нулевых байта - "Additional Don’t Care Bytes", 5-й нужен для чтения сохраненной переменной из буфера.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Dec 14 2006, 00:25
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(JeDay @ Dec 13 2006, 20:31) *
Цитата
Дальше читаю:
CS в ноль - 0х52 0х00 0х02 0х01 0х00 0х00 0х00 0х00 читаю буфер SPI - CS в единицу.


Добавьте еще один 0x00 в конце.
4 нулевых байта - "Additional Don't Care Bytes", 5-й нужен для чтения сохраненной переменной из буфера.
8-и байт энтой микросхеме достаточно, нафига ей 9-ый лепить? И еще хотелось бы добавить про вот такой ньюанс:

Для нормальной работы МС необходимо после подачи питания переждать некоторое время, указанное в даташите на МС в разделе POWER-ON/RESET STATE. Для AT45DB081B, например, данное время равно 20 мс... Я с первого наскока на такие грабли наступил)


--------------------
Go to the top of the page
 
+Quote Post
rezident
сообщение Dec 14 2006, 02:29
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Для работы с AT45 я обычно выбираю 3-й режим SPI.
Могу для примера предложить свою библиотеку для работы с DataFlash серии AT45. В этом архиве нет некоторых макросов, но думаю сами догадаетесь как они должны выглядеть? wink.gif Я писал ее когда-то для MSP430, но не думаю, что будут сложности при портировании ее на AVR или Silab-овый МК. В процедуре инициализации есть автоопределение типа DataFlash по таблице путем чтения сигнатуры кристалла. Можете уже на этом этапе (инициализации) проверить, правильно ли работает ваша процедура чтения?
Прикрепленные файлы
Прикрепленный файл  at45lib.zip ( 4.99 килобайт ) Кол-во скачиваний: 122
 
Go to the top of the page
 
+Quote Post
JeDay
сообщение Dec 14 2006, 15:26
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 276
Регистрация: 22-09-05
Из: Kiev
Пользователь №: 8 818



Цитата
8-и байт энтой микросхеме достаточно, нафига ей 9-ый лепить?


У меня такая же проблема была с чтением данных. Когда добавил 9-й байт все стало на свои места.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Dec 14 2006, 15:55
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(JeDay @ Dec 14 2006, 19:26) *
Цитата
8-и байт энтой микросхеме достаточно, нафига ей 9-ый лепить?


У меня такая же проблема была с чтением данных. Когда добавил 9-й байт все стало на свои места.
Странна все это какта... Весь мир восемь байт посылает, а Вашей нада девять...Шайтан в микросхеме аднака...

Даташит то откройте, да почитайте и посчитайте ского, куда и чаво smile.gif


--------------------
Go to the top of the page
 
+Quote Post
rezident
сообщение Dec 14 2006, 16:24
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Путаница обычно бывает когда забывают принцип SPI: для того чтобы что-то считать, нужно что-то передать. Если читать регистр приемника SPI сразу по окончании передачи последнего формального байта, то и результат будет соответствующим (неверным). Поэтому в данном случае правильный результат получается после передачи мастером 9-го байта, который соответствует первому принятому байту из памяти DataFlash. Если нужно считать допустим десять байт, то соотвественно нужно и передать десять байт после последнего формального.
Думаю, что prottoss , просто не допускает мысли, что для кого-то принцип SPI (см. выше) еще недопонят wink.gif
Go to the top of the page
 
+Quote Post
prottoss
сообщение Dec 14 2006, 16:50
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(rezident @ Dec 14 2006, 20:24) *
Путаница обычно бывает когда забывают принцип SPI: для того чтобы что-то считать, нужно что-то передать. Если читать регистр приемника SPI сразу по окончании передачи последнего формального байта, то и результат будет соответствующим (неверным). Поэтому в данном случае правильный результат получается после передачи мастером 9-го байта, который соответствует первому принятому байту из памяти DataFlash. Если нужно считать допустим десять байт, то соотвественно нужно и передать десять байт после последнего формального.
Думаю, что prottoss , просто не допускает мысли, что для кого-то принцип SPI (см. выше) еще недопонят wink.gif
Хм... А что сдесь понимать то? записали 8 раз данные в SPDR - для меня это 8 раз послать данные по SPI...

Вот ваш исходник:

Код
//================================================
// Чтение из DataFlash произвольного количества
// байт данных с произвольного адреса
//------------------------------------------------
//аргументы: указатель на структуру данных DataFlash,
//           указатель на буфер приемника данных,
//           стартовый адрес в DataFlash,
//           количество читаемых байт
//возвращает:количество прочитанных байт
//================================================
xWord at45RndRead(st_at45_Data *pntr, xByte *pdst, xLong startAddr, xWord size)
{ //xByte *pdst=pDst;
  xWord byteCntr=0;                               //счетчик считанных байт
  xWord pageAddr, byteAddr;
  if((startAddr+(xLong)size)>pntr->maxMemSize)    //урежем кол-во запрошенных
  { size=(xWord)(pntr->maxMemSize-startAddr);     //до реального размера
  }                                               //DataFlash
  if (size==0) return (0);                        //нет размера - нет записи
  pageAddr=(xWord)(startAddr/(xLong)pntr->maxBufSize);//получим номер страницы
  byteAddr=(xWord)(startAddr%(xLong)pntr->maxBufSize);//номер байта в странице
  xWord tmp=(pntr->maxBufSize)>>8;                //выделим второй байт
  while (tmp)
  { pageAddr<<=1;                                 //выровняем номер страницы
    tmp>>=1;
  }
  pageAddr+=(byteAddr>>8);                        //добавим второй байт
  //----- проверяем готовность DataFlash ---------
  at45WaitReady(pntr);                            //ждем готовности DataFlash
  DelayAccess();                                  //задержка между обращениями
  //----- чтение основной памяти DataFlash -------



// С ЭТОГО МОМЕНТА НАЧИНАЕТСЯ ОТПРАВКА КОМАНДЫ ЧИПУ: комм PROTTOSS


  [b]SET_CS_DATAFLASH;                               //установим CS для DataFlash
  txrxByteSpi(at45_ContArrayRead1, pntr->num);    //передаем номер команды
  txrxByteSpi((xByte)(pageAddr>>8), pntr->num);   //передаем старший байт номера
                                                  //страницы
  txrxByteSpi((xByte)pageAddr, pntr->num);        //передаем младший байт номера
                                                  //страницы и старший бит
                                                  //номера байта
  txrxByteSpi((xByte)byteAddr, pntr->num);        //передаем младший байт номера
                                                  //байта
  txrxByteSpi(0, pntr->num);                      //формальная передача
  txrxByteSpi(0, pntr->num);                      //формальная передача
  txrxByteSpi(0, pntr->num);                      //формальная передача
  txrxByteSpi(0, pntr->num);                      //формальная передача[/b]



// КОМАНДА ПОСЛАНА - ЧИТАЕМ ДАННЫЕ: комм PROTTOSS


  while (byteCntr<size)                           //читаем данные в буфер
  { *pdst++=txrxByteSpi(0, pntr->num);            //приемника данных в
    byteCntr++;                                   //соответствии с заданным
  }                                               //количеством
  RESET_CS_DATAFLASH;                             //сбросим CS для DataFlash
  return(byteCntr);
}


Вопрос: сколько байт Вы послали в команде памяти, что бы начать читать массив? Для тех, кем принцип еще не допонят выделенно комментарием со строчными буквами


--------------------
Go to the top of the page
 
+Quote Post
Moks
сообщение Dec 15 2006, 22:10
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 28-11-05
Из: Москва
Пользователь №: 11 510



Высылаю вам осциллограммы что у меня получается. Как я раньше писал, что я получаю не то значение.
Но потом что-то произошло, и на SO стала полная ерунда. Её рисунок прикрепляю, посмотрите!

Прикрепленное изображение
Go to the top of the page
 
+Quote Post
prottoss
сообщение Dec 15 2006, 22:24
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(Moks @ Dec 16 2006, 02:10) *
Высылаю вам осциллограммы что у меня получается. Как я раньше писал, что я получаю не то значение.
Но потом что-то произошло, и на SO стала полная ерунда. Её рисунок прикрепляю, посмотрите!

Прикрепленное изображение
Судя по рисунку он в высокоимпедансном состоянии? Вы выборку чипа то делаете?



Для начала попробуйте не читать/писать из/в чип, а поздороваться с ним))) Прочитайте статус регистр, посмотрите сигнатурку и т.п. Для этого Вам надо выбрать чип, послать код команды, послать холостой байт, при этом приняв данные из регистра статуса, отпустить чип.



Бо, если вы все это делаете, а чип молчит, может вы его того... Упаси Господь...


--------------------
Go to the top of the page
 
+Quote Post
rezident
сообщение Dec 16 2006, 02:38
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(prottoss @ Dec 14 2006, 18:50) *
Код
// КОМАНДА ПОСЛАНА - ЧИТАЕМ ДАННЫЕ: комм PROTTOSS


  while (byteCntr<size)                           //читаем данные в буфер
  {

                            *pdst++=txrxByteSpi(0, pntr->num);            //приемника данных в
// ТОЛЬКО В РЕЗУЛЬТАТЕ ВЫПОЛНЕНИЯ ЭТОЙ ^^^^^ КОМАНДЫ БУДЕТ ПРОЧИТАН ПЕРВЫЙ БАЙТ ДАННЫХ

    byteCntr++;                                   //соответствии с заданным
  }                                               //количеством
RESET_CS_DATAFLASH; //сбросим CS для DataFlash

Вопрос: сколько байт Вы послали в команде памяти, что бы начать читать массив? Для тех, кем принцип еще не допонят выделенно комментарием со строчными буквами

Ответ: предварительно 8 байт, включая фиктивные. Но после 8-го байта данных еще не будет принято. Они появятся после передачи 9-го и последующего байт.
Для разъяснения прилагаю еще и функцию txrxByteSpi. Напоминаю, что это для MSP430 писалось.

Код
xByte txrxByteSpi(xByte data, xByte num)          //прем/передача байта
{ xWord tmp=65535;                                //счетчик тайм-аута SPI
  if (num==0)                                     //номер порта SPI=0?
  { IFG1&=~URXIFG0;                               //да, сбросим флаг готовности
                                                  //приемника
    while (((U0TCTL&TXEPT)==0)&&(tmp--));           //ждем пока не освободится
                                                  //передатчик
    if (tmp) U0TXBUF=data;                        //передаем байт и
    while (((IFG1&URXIFG0)==0)&&(tmp--));           //ждем подтверждения приема
    if (!(tmp))                                   //если байт не был принят
    { initSpi(SPI_MASTER, num);                  //и/или передан, за промежуток
                                                  //времени около 10мс, то
                                                  //проинициализируем SPI
      return(0);
    }
    else return(U0RXBUF);                         //вернем принятый байт
  }
  else                                            //нет, номер порта SPI=1
  { IFG2&=~URXIFG1;                               //сбросим флаг готовности
                                                  //приемника
    while (((U1TCTL&TXEPT)==0)&&(tmp--));           //ждем пока не освободится
                                                  //передатчик
    if (tmp) U1TXBUF=data;                        //передаем байт и
    while (((IFG2&URXIFG1)==0)&&(tmp--));           //ждем подтверждения приема
    if (!(tmp))                                   //если байт не был принят
    { initSpi(SPI_MASTER, num);                  //и/или передан, за промежуток
                                                  //времени около 10мс, то
                                                  //проинициализируем SPI
      return(0);
    }
    else return(U1RXBUF);                         //вернем принятый байт
  }
}
Go to the top of the page
 
+Quote Post
Moks
сообщение Dec 18 2006, 11:19
Сообщение #15


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 28-11-05
Из: Москва
Пользователь №: 11 510



Ребята!
Огромное спасибо за подсказку, я посмотрел пример, у меня идея была правильная, я просто опкодом ошибся, выбрал режим не SPI0 /3, а для bit-level timing! Теперь всё номально. biggrin.gif
ОГРОМНОЕ СПАСИБО всем, кто помогал! Удачи!
Ещё раз тысяча благодарностей всем! cranky.gif
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 30th June 2025 - 13:33
Рейтинг@Mail.ru


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