|
Работа с AT45DB021, При чтении фигня всякая |
|
|
|
Dec 12 2006, 11:20
|
Участник

Группа: Участник
Сообщений: 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. Вообще непонятно почему. То ли при чтении какие-то проблемы, то ли при записи. Нет у тебя никаких идей по этому поводу? Заранее спасибо.
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 14)
|
Dec 12 2006, 13:47
|
Участник

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

|
Проверьте конфигурацию SPI. DataFlash работает в режимах 0 и 3. Возможно вы что вы что-то перепутали.
|
|
|
|
|
Dec 13 2006, 12:14
|
Участник

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

|
Ничего не перепутал. Используется режим 0. У меня на осциллографе фигня страшная на SO. Постараюсь нарисовать "ЭТО" в виде осциллограмм. На ножках SCK и SI всё как надо (по крайней мере похоже на правду).
|
|
|
|
|
Dec 13 2006, 16:31
|
Местный
  
Группа: Свой
Сообщений: 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-й нужен для чтения сохраненной переменной из буфера.
|
|
|
|
|
Dec 14 2006, 00:25
|

Гуру
     
Группа: Свой
Сообщений: 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 мс... Я с первого наскока на такие грабли наступил)
--------------------
|
|
|
|
|
Dec 14 2006, 15:26
|
Местный
  
Группа: Свой
Сообщений: 276
Регистрация: 22-09-05
Из: Kiev
Пользователь №: 8 818

|
Цитата 8-и байт энтой микросхеме достаточно, нафига ей 9-ый лепить? У меня такая же проблема была с чтением данных. Когда добавил 9-й байт все стало на свои места.
|
|
|
|
|
Dec 14 2006, 16:50
|

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

|
Цитата(rezident @ Dec 14 2006, 20:24)  Путаница обычно бывает когда забывают принцип SPI: для того чтобы что-то считать, нужно что-то передать. Если читать регистр приемника SPI сразу по окончании передачи последнего формального байта, то и результат будет соответствующим (неверным). Поэтому в данном случае правильный результат получается после передачи мастером 9-го байта, который соответствует первому принятому байту из памяти DataFlash. Если нужно считать допустим десять байт, то соотвественно нужно и передать десять байт после последнего формального. Думаю, что prottoss , просто не допускает мысли, что для кого-то принцип SPI (см. выше) еще недопонят  Хм... А что сдесь понимать то? записали 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); } Вопрос: сколько байт Вы послали в команде памяти, что бы начать читать массив? Для тех, кем принцип еще не допонят выделенно комментарием со строчными буквами
--------------------
|
|
|
|
|
Dec 15 2006, 22:10
|
Участник

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

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

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

|
Цитата(Moks @ Dec 16 2006, 02:10)  Высылаю вам осциллограммы что у меня получается. Как я раньше писал, что я получаю не то значение. Но потом что-то произошло, и на SO стала полная ерунда. Её рисунок прикрепляю, посмотрите!
Судя по рисунку он в высокоимпедансном состоянии? Вы выборку чипа то делаете? Для начала попробуйте не читать/писать из/в чип, а поздороваться с ним))) Прочитайте статус регистр, посмотрите сигнатурку и т.п. Для этого Вам надо выбрать чип, послать код команды, послать холостой байт, при этом приняв данные из регистра статуса, отпустить чип. Бо, если вы все это делаете, а чип молчит, может вы его того... Упаси Господь...
--------------------
|
|
|
|
|
Dec 16 2006, 02:38
|
Гуру
     
Группа: Свой
Сообщений: 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); //вернем принятый байт } }
|
|
|
|
|
Dec 18 2006, 11:19
|
Участник

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

|
Ребята! Огромное спасибо за подсказку, я посмотрел пример, у меня идея была правильная, я просто опкодом ошибся, выбрал режим не SPI0 /3, а для bit-level timing! Теперь всё номально. ОГРОМНОЕ СПАСИБО всем, кто помогал! Удачи! Ещё раз тысяча благодарностей всем!
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|