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

 
 
> Работа с 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
 
Start new topic
Ответов
rezident
сообщение Dec 14 2006, 16:24
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 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   Работа с AT45DB021   Dec 12 2006, 11:20
- - Hz!   Проверьте конфигурацию SPI. DataFlash работает в р...   Dec 12 2006, 13:47
- - Moks   Ничего не перепутал. Используется режим 0. У меня...   Dec 13 2006, 12:14
- - beer_warrior   1.Согласованы ли логические уровни? 2.Отрабатывает...   Dec 13 2006, 12:36
- - JeDay   ЦитатаДальше читаю: CS в ноль - 0х52 0х00 0х02 0х0...   Dec 13 2006, 16:31
|- - prottoss   Цитата(JeDay @ Dec 13 2006, 20:31) Цитата...   Dec 14 2006, 00:25
- - rezident   Для работы с AT45 я обычно выбираю 3-й режим SPI. ...   Dec 14 2006, 02:29
- - JeDay   Цитата8-и байт энтой микросхеме достаточно, нафига...   Dec 14 2006, 15:26
|- - prottoss   Цитата(JeDay @ Dec 14 2006, 19:26) Цитата...   Dec 14 2006, 15:55
|- - rezident   Цитата(prottoss @ Dec 14 2006, 18:50) Код...   Dec 16 2006, 02:38
- - Moks   Высылаю вам осциллограммы что у меня получается. К...   Dec 15 2006, 22:10
|- - prottoss   Цитата(Moks @ Dec 16 2006, 02:10) Высылаю...   Dec 15 2006, 22:24
|- - kostian296   Цитата(prottoss @ Dec 16 2006, 01:24) Суд...   Oct 20 2008, 16:57
- - Moks   Ребята! Огромное спасибо за подсказку, я посмо...   Dec 18 2006, 11:19


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

 


RSS Текстовая версия Сейчас: 29th July 2025 - 08:24
Рейтинг@Mail.ru


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