|
Проблема с SPI, зависает при обращении к SPDR |
|
|
|
Oct 7 2010, 10:33
|
Группа: Новичок
Сообщений: 8
Регистрация: 13-04-10
Пользователь №: 56 609

|
Atmega 128 и память AT45DB321, читаю статус памяти, SELECT(); status = DF_SPI_RW(StatusReg); status = DF_SPI_RW(0x00); DESELECT();
static uint8_t DF_SPI_RW( uint8_t tx ) { uint8_t rx; SPDR = tx; while(!(SPSR & 0x80)); rx = SPDR; return rx; } при первом чтении все ОК, но при повторном чтении, на строке status = DF_SPI_RW(0x00); программа зависает, т.е. SPSR не взводиться. Возможно есть проблемы с памятью, но почему не взводится флаг SPSR? Ведь насколько я понимаю, мастер устройству пофиг на реакцию слэйв устройства на SPI?
|
|
|
|
2 страниц
< 1 2
|
 |
Ответов
(15 - 20)
|
Oct 8 2010, 15:31
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(Alex Truhin @ Oct 7 2010, 09:33)  uint8_t rx; SPDR = tx; while(!(SPSR & 0x80)); rx = SPDR; при первом чтении все ОК, но при повторном чтении, на строке status = DF_SPI_RW(0x00); программа зависает, т.е. SPSR не взводиться Явно есть проблема с периферией МК, нельзя ли оторвать SCLK и MOSI от чипа памяти и повторить тест? Ещё интересует, почему вы читаете статус памяти, но не дожидаетесь готовности бита BUSY? Вот кусок из старой библиотеки Код //================================================ // Ожидание готовности DataFlash, // проверяем BUSY в регистре статуса //------------------------------------------------ //аргументы: нет //возвращает:значение регистра статуса //================================================ xByte at45WaitReady(st_at45_Data *pntr) { xByte res=0; SET_CS_DATAFLASH; //установим CS для DataFlash txrxByteSpi(at45_StatusRegRead1, pntr->num); //передаем номер команды while (!(res&AT45BUSY)) //ждем пока не установится { res=txrxByteSpi(0, pntr->num); //бит READY/nBUSY в регистре } //статуса DataFlash RESET_CS_DATAFLASH; //сбросим CS для DataFlash return(res); }
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Oct 8 2010, 17:16
|
Группа: Новичок
Сообщений: 8
Регистрация: 13-04-10
Пользователь №: 56 609

|
Спасибо всем за рекомендации и советы, теперь только в понедельник посмотрю, отпишу результаты. Цитата =GM=: Ещё интересует, почему вы читаете статус памяти, но не дожидаетесь готовности бита BUSY? Вот кусок из старой библиотеки BUSY смотрю при переключении страниц, при запросе статуса его смотреть не нужно, это видно и из примеров atmel, и по логике, т.к. busy, согласно документации, можно проверять 2 способами, либо проверять на выводе (если он есть), либо проверять бит статуса.
|
|
|
|
|
Oct 8 2010, 21:20
|

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

|
Цитата(V_G @ Oct 8 2010, 17:47)  Если вопрос по теме топика, то в мастер-режиме пин SS никак не задействован, его можно настраивать как угодно и манипулировать вручную. Это не по теме топика (у автора он настроен на вывод), но для полноты картины: в мастер-режиме, будучи настроенным на ввод эта ножка используется: Цитата If SS is configured as an input, it must be held high to ensure Master SPI operation. If the SS pin is driven low by peripheral circuitry when the SPI is configured as a master with the SS pin defined as an input, the SPI system interprets this as another master selecting the SPI as a slave and starting to send data to it. To avoid bus contention, the SPI system takes the following actions: 1. The MSTR bit in SPCR is cleared and the SPI system becomes a slave. As a result of the SPI becoming a slave, the MOSI and SCK pins become inputs. 2. The SPIF flag in SPSR is set, and if the SPI interrupt is enabled, and the I-bit in SREG is set, the interrupt routine will be executed.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Oct 11 2010, 03:48
|
Местный
  
Группа: Участник
Сообщений: 298
Регистрация: 26-01-09
Из: Пермь
Пользователь №: 43 940

|
Цитата А можно поинтересоваться что у Вас с пином SS (используется или нет и как настроен - вход или выход) ? Цитата Это не по теме топика (у автора он настроен на вывод), Цитата If SS is configured as an input, it must be held high to ensure Master SPI operation. If the SS pin is driven low by peripheral circuitry when the SPI is configured as a master with the SS pin defined as an input, the SPI system interprets this as another master selecting the SPI as a slave and starting to send data to it. Это именно по теме топика и именно это я и хотел порекомендовать проверить!!!!!
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|