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

Помогите побороть SPORT

Доброго времени суток. В своей программе принимаю данные от АЦП по двум каналам через спорт1. АЦП 14 разрядов, вроде настроил порт, посмотрел осциллограммы, меня все устраивает (по осциллограмме посчитал). Но данные принимаю какие-то кривые, и принимаю их 1 раз, а потом буфер переполняется(

Пример команды на сичтывание:

rsx = *pSort1_RX;

rxf = *pSort1_RX;

Правильный ли формат команды на считывание данных? И еще а регистре статуса сам блэкфин 537 скидывает 1-й бит (о наличие данных в фифо) или же его надо самому в ручную скинуть?

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


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

Могу ответить касательно BF533, возможно для 537 есть различия на не думаю.

Чтение делаем так int_rx_data = *pSPORT1_RX16;

Если память не изменяет есть еще и регистр 32-разрядный, может и вовсе только приведение типов. Уже не понмю. Бит статуса не сбрасываем.

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


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

а разве нужно указывать размер int_rx_data = *pSPORT1_RX16?

Просто получается ситуация что в FIFO данные приходят, а по команде rsx = *pSort1_RX я не забираю их, а новые приходят и происходит переполнение. Может кто-нить сталкивался или у кого-нить есть мысли какие-нить, просто я уже перепробовал все, даже абсурдные мысли...

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


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

А автоматизировать приём с DMA не пробовали? Складывать в буфер.

Если ядро занято в более приоритетном обработчике и не успевает вовремя читать FIFO, то и будет получаться потеря данных.

 

 

 

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


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

а разве нужно указывать размер int_rx_data = *pSPORT1_RX16?

В данном случае нужно. Это следует из определений (cdefBF534.h):

#define pSPORT1_RX         ((volatile unsigned long  *)SPORT1_RX)
#define pSPORT1_RX32         ((volatile unsigned long  *)SPORT1_RX)
#define pSPORT1_RX16         ((volatile unsigned short *)SPORT1_RX)

Видно, что pSPORT1_RX и pSPORT1_RX32 - это одно и то же. Таким образом, операция int_rx_data = *pSPORT1_RX читает 32-разрядный регистр вместо 16-разрядного.

Кстати - проблема может быть именно в этом (сейчас не помню, что будет, если SPORT настроен на 16 разрядов, а читаются 32)

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


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

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

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

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

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

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

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

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

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

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