Перейти к содержанию
    

Помогите настроить SPORT

Ситуация такая: уже 2 дня бьюсь над тем, что бы организовать прием данных с ацп и дальнейшую обработку их процессором BlackFin537. Вроде прописал все настройки, написал прерывания, проверил кучу раз. С осциллографом пролазил CS и SCLK, все правильно приходит, а данных нет.... А если быть точнее, то процессор находится в прерывании постоянно и не отвечает на остальные команды.... состояние регистра SPORT1_STAT= 0045.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

данных нет.... состояние регистра SPORT1_STAT= 0045.

Что-то не сходится: как это их нет, если в статусе написано, что и FIFO заполнено и переполнение уже случилось? Чем вы их вычитываете - ядром или через DMA?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А если быть точнее, то процессор находится в прерывании постоянно и не отвечает на остальные команды....

так может флаг прерывания сбрасывать надо? ну или там все данные вычитать чтобы сам сбросился

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что-то не сходится: как это их нет, если в статусе написано, что и FIFO заполнено и переполнение уже случилось? Чем вы их вычитываете - ядром или через DMA?

Считаю я их ядром. Да, я просто неправильно выразился, а если быть точным, то ошибся.

 

так может флаг прерывания сбрасывать надо? ну или там все данные вычитать чтобы сам сбросился

 

так может флаг прерывания сбрасывать надо? ну или там все данные вычитать чтобы сам сбросился

 

Да, сегодня сделал немного по-другому. Просто после того как данные пришли, я обнулил регистр статуса.

 

Теперь другая проблема данные какие-то странные))) Не могли бы вы подсказать как еще можно сбросить флаг прерывания? И еще несколько просьб, никто не может дать ссылку на литературу о том как порт настроить. Ну т.е. мы задаем параметры СПРОТа и там мы указываем RCLKDIV и RFSDIV, как выбираются их параметры?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Считаю я их ядром. Да, я просто неправильно выразился, а если быть точным, то ошибся.

Тогда прерывание должно сниматься после вычитывания FIFO:

The SPORT RX interrupt is generated when RSPEN = 1 and the RX FIFO

has received words in it. When the core processor has read all the words in

the FIFO, the RX interrupt is cleared.

 

Ну т.е. мы задаем параметры СПРОТа и там мы указываем RCLKDIV и RFSDIV, как выбираются их параметры?

Исходя из нужных частот SCLK и RFS. Все же описано HRM (Clock and Frame Sync Frequencies).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тогда прерывание должно сниматься после вычитывания FIFO:

 

 

 

Исходя из нужных частот SCLK и RFS. Все же описано HRM (Clock and Frame Sync Frequencies).

 

Как это реализовать. В книжке я прочитал) Просто я только 2-ю неделю занимаюсь программированием(( Я вообще учился и работал раньше по другой специальности(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Реализовать что именно? Опишите свою задачу, чтобы не говорить об абстрактных вещах.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Задача считать данные с 14-ти разрядного АЦП (AD 7357) от Аналог Девайс через Sport1? вот текст

 

// настройка SPORT1

*pSPORT1_RCLKDIV= 99;

ssync();

*pSPORT1_RFSDIV = 1000;

ssync();

*pSPORT1_RCR2= 0x0d;

ssync();

*pSPORT1_RCR1= RCKFE | RFSR | IRCLK | IRFS | LRFS | RSPEN;

 

 

Вот прерывание:

EX_INTERRUPT_HANDLER(SPORT1_RX_ISR)

{

if (*pSPORT1_STAT & 1)

{

rxf = *pSPORT1_RX;

rxt = *pSPORT1_RX;

}

 

В данном случае происходит переполнение FiFO, сейчас вариант немного другой:

 

// настройка SPORT1

*pSPORT1_RCLKDIV= 14;

ssync();

*pSPORT1_RFSDIV =6;

ssync();

*pSPORT1_RCR2= 0x10 | RXSE;

ssync();

*pSPORT1_RCR1= RCKFE | RFSR | IRCLK | IRFS | RSPEN;

 

Правда точно щас не скажу значение *pSPORT1_RFSDIV, потому что подбирал.... А проект на работе(( И в прерывание добавил цикл, проверки ROVF|RUVF, если они есть, заново прописать настройки порта... Работает, но мне кажется, что что-то здесь не так...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот прерывание:

EX_INTERRUPT_HANDLER(SPORT1_RX_ISR)

{

if (*pSPORT1_STAT & 1)

Здесь лучше не if, а while.

 

Работает, но мне кажется, что что-то здесь не так...

В прерывании выгребать данные как-то не комильфо. Используйте DMA.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В прерывании выгребать данные как-то не комильфо. Используйте DMA.

 

Неа, условие такое считывать без DMA

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Опять вернулся к SPORT, объясните, пожалуйста, как выбираются

*pSPORT1_RCLKDIV= 14;

*pSPORT1_RFSDIV =6;

Только не надо приводить ссылок из книг. Формула у меня есть, но что туда подставлять?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...