alexeika007 0 29 марта, 2012 Опубликовано 29 марта, 2012 · Жалоба Доброго времени суток. В своей программе принимаю данные от АЦП по двум каналам через спорт1. АЦП 14 разрядов, вроде настроил порт, посмотрел осциллограммы, меня все устраивает (по осциллограмме посчитал). Но данные принимаю какие-то кривые, и принимаю их 1 раз, а потом буфер переполняется( Пример команды на сичтывание: rsx = *pSort1_RX; rxf = *pSort1_RX; Правильный ли формат команды на считывание данных? И еще а регистре статуса сам блэкфин 537 скидывает 1-й бит (о наличие данных в фифо) или же его надо самому в ручную скинуть? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
uriy 4 29 марта, 2012 Опубликовано 29 марта, 2012 · Жалоба Могу ответить касательно BF533, возможно для 537 есть различия на не думаю. Чтение делаем так int_rx_data = *pSPORT1_RX16; Если память не изменяет есть еще и регистр 32-разрядный, может и вовсе только приведение типов. Уже не понмю. Бит статуса не сбрасываем. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexeika007 0 29 марта, 2012 Опубликовано 29 марта, 2012 · Жалоба а разве нужно указывать размер int_rx_data = *pSPORT1_RX16? Просто получается ситуация что в FIFO данные приходят, а по команде rsx = *pSort1_RX я не забираю их, а новые приходят и происходит переполнение. Может кто-нить сталкивался или у кого-нить есть мысли какие-нить, просто я уже перепробовал все, даже абсурдные мысли... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Gradient 1 30 марта, 2012 Опубликовано 30 марта, 2012 · Жалоба А автоматизировать приём с DMA не пробовали? Складывать в буфер. Если ядро занято в более приоритетном обработчике и не успевает вовремя читать FIFO, то и будет получаться потеря данных. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DPL 0 8 апреля, 2012 Опубликовано 8 апреля, 2012 · Жалоба а разве нужно указывать размер 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) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться