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

 
 
> SPI не выставляет биты конца передачи, AT91SAM7S64
MiklPolikov
сообщение Jan 24 2012, 05:50
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 015
Регистрация: 23-01-07
Из: Москва
Пользователь №: 24 702



С SPI происходит что-то странное :
Биты RDRF, TDRE по которым можно судить об окончании передачи иногда выставляются, а иногда нет

Код в kiel:

*AT91C_SPI_CR=AT91C_SPI_SPIEN; //инициализация
*AT91C_SPI_MR=AT91C_SPI_MSTR;
AT91C_BASE_SPI->SPI_CSR[0]=0xC02 ;
......................

transmit_data=(0<<6)|(0x6<<1)|(0<<0); //передача-приём
*AT91C_SPI_TDR=transmit_data;
while(!(*AT91C_SPI_SR & AT91C_SPI_RDRF) {} // ждём пока закончится передача, на этой строчке зависает.
receive_data=*AT91C_SPI_RDR;


Смотрю под отладкой. Зависает каждый раз в разный момент.
Причём проблема появилась после того как я включил WDT и раскидал по коду команду его сброса.

У меня много прерываний, предположил что программа уходит в прерывание и пропускает момент когда
в регистре выставилась 1, но одновременно успевает её сбросить. Отключил половину-ничего не изменилось.
Да и весь остальной код(USB, UART, чтение портов по прерываниям ) работает безглючно.

А у этой проблемы с SPI прямая зависимость от включенного WDT и его периодического сброса .

Я правильно понимаю, что выставление битов в регистре SPI_SR ни как не зависит от сотояния линии MISO , потому что SPI просто считает свои же
такты ?
Кто что посоветует ?


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 6)
DmitryM
сообщение Jan 24 2012, 07:15
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 583
Регистрация: 7-06-06
Из: Таганрог
Пользователь №: 17 840



Цитата(MiklPolikov @ Jan 24 2012, 08:50) *
С SPI происходит что-то странное :
Биты RDRF, TDRE по которым можно судить об окончании передачи иногда выставляются, а иногда нет
*AT91C_SPI_MR=AT91C_SPI_MSTR;

transmit_data=(0<<6)|(0x6<<1)|(0<<0); //передача-приём

А где настройка какой из чип-селектов будет работать?? *AT91C_SPI_MR=AT91C_SPI_MSTR | (0xe<<PCS_OFFSET); - для нулевого чип-селекта.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jan 24 2012, 09:21
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(MiklPolikov)
Кто что посоветует ?

Прежде всего посмотрите БЕЗ отладчика.
Go to the top of the page
 
+Quote Post
MiklPolikov
сообщение Jan 24 2012, 12:23
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 015
Регистрация: 23-01-07
Из: Москва
Пользователь №: 24 702



Цитата(aaarrr @ Jan 24 2012, 12:21) *
Прежде всего посмотрите БЕЗ отладчика.


Да, с этого и начал. Всё то же самое.


Ещё, вот такой код

while(1)//ждём пока закончится передача
{
x=*AT91C_SPI_SR;
if(x & AT91C_SPI_RDRF!=0)
break;
}

и такой

while(!(*AT91C_SPI_SR & AT91C_SPI_RDRF) {} // ждём пока закончится передача

По-разному работают. Виснет в обеих, но в разное время.

Цитата(DmitryM @ Jan 24 2012, 10:15) *
А где настройка какой из чип-селектов будет работать?? *AT91C_SPI_MR=AT91C_SPI_MSTR | (0xe<<PCS_OFFSET); - для нулевого чип-селекта.

У меня сигнал CS управляется не NCPS SPI , а просто ногой IO


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post
Aaron
сообщение Jan 24 2012, 12:56
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 243
Регистрация: 5-10-06
Из: Зеленоград
Пользователь №: 21 007



А у вас SPI на какой частоте работает? AT91C_SPI_MR - у вас FDIV = 0 The SPI operates at MCK. У меня на практике максимум заработало стабильно на MCK/64 (1МГц), правда там проблема была с физическими уровнями CLK, а так-то SPI с программной точки зрения работал хорошо.

Далее, AT91C_SPI_MR->MODFDIS = 0 - Mode fault detection is enabled. Может у вас выскакивает fault? sm.gif Проверьте SPI_SR->MODF на всякий случай.
И там же, DLYBCS для начала выставьте в максимальное значение, а далее по мере необходимости уменьшайте.

Ещё, вы прерывания не используете, всё софтварно обрабатываете?
Go to the top of the page
 
+Quote Post
MiklPolikov
сообщение Jan 24 2012, 13:57
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 015
Регистрация: 23-01-07
Из: Москва
Пользователь №: 24 702



Цитата(Aaron @ Jan 24 2012, 15:56) *
А у вас SPI на какой частоте работает? AT91C_SPI_MR - у вас FDIV = 0 The SPI operates at MCK. У меня на практике максимум заработало стабильно на MCK/64 (1МГц), правда там проблема была с физическими уровнями CLK, а так-то SPI с программной точки зрения работал хорошо.

Далее, AT91C_SPI_MR->MODFDIS = 0 - Mode fault detection is enabled. Может у вас выскакивает fault? sm.gif Проверьте SPI_SR->MODF на всякий случай.
И там же, DLYBCS для начала выставьте в максимальное значение, а далее по мере необходимости уменьшайте.

Ещё, вы прерывания не используете, всё софтварно обрабатываете?


Aaron, спасибо !
Действиельно выскакивает FAULT , хотя под отладкой я этот бит не вижу. И когда он выскакивает, SPIENS переходит в 0 т.е. SPI отключается.
Отключил Fault Detection и всё стало хорошо.

Но теперь другой вопрос : почему происходит FAULT ?
Fault - это когда на NPCS мастера кто-то выставляет свой уровень, т.е. встречаются два мастера.
Но у меня на всех линиях NPCS выбран IO порт , т.е. периферия отключена. По идее SPI не должен при этом конфликтовать
с теми уровнями которые при этом на пинах .


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post
Aaron
сообщение Jan 25 2012, 07:30
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 243
Регистрация: 5-10-06
Из: Зеленоград
Пользователь №: 21 007



Это может быть всё что угодно. Например, у меня сиё чудо происходит из-за помех на линиях. Пока плата просто на столе - идут косяки. Помещаю её в экранирующий пакетик, проблемы исчезают wink.gif А при отладке пошаговое выполнение, и там может просто не получается нормально "нарваться" на помеху.
Опять же, сопли могут быть. У вас порты как инициализируются? если используете at91lib, то может что-то типа такого?
#define HW_SPI0_MISO {1 << 15, AT91C_BASE_PIOA, AT91C_ID_PIOA, PIO_PERIPH_A, PIO_PULLUP}
Также допускаю возможность появления MODF как раз из-за того, что хардварных ног NPCS у вас нет. Мало ли, модуль SPI считает, что не может выставить NPCS вот и вываливается?

Кстати, очень интересно узнать, вы на какой скорости SPI мастер всё же запустили? проверили, чтобы уровни сигналов нормальные были? У меня SPI master на 1 Мбит максимум нормально пошёл, при 2 Мбит и выше MOSI нормально, а вот CLK скакал не от 0 до 3,3 В, а от 1,2 до 1,6 В примерно. Зато в режиме SPI slave 16 Мбит нормально, больше просто мастер не мог выдавать.

Сообщение отредактировал Aaron - Jan 25 2012, 07:38
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 21:39
Рейтинг@Mail.ru


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