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

Частота прерываний под Linux'ом

to sasamy:

Интересный подход. Но если инженеры AD делают на прерываниях то наверное это тоже вариант. Предложенный вами подход интересен, но не могли бы вы уточнить:

1) зачем заводить busy на CS АЦП? Ведь CS должен быть в низком уровне во время всей посылки.

2) вы предлагаете настроить слейв на хост процессоре и формировать на этом же процессоре клок таймером для передачи данных?

Вообще очень интересный вариант, надо будет сравнить реализации.

Изменено пользователем TigerSHARC

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


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

1) зачем заводить busy на CS АЦП? Ведь CS должен быть в низком уровне во время всей посылки.

2) вы предлагаете настроить слейв на хост процессоре и формировать на этом же процессоре клок таймером для передачи данных?

 

1) посмотрите PS - этот вариант намного лучше, я его дописал подумавши :) но даже то что я изначально написал будет работать только хуже - смотрите диграмму и лучше не одну и почитайте даташит - данные читаются после того как busy в низком уровне при этом t4 BUSY falling edge to CS falling edge setup time = 0, те можно напрямую засадить, но там проблема небольшая правда в том что время оцифровки плавает - в общем лучше смотрите PS :)

2) да - формировать на одном таймере CONVST + CS используя оба канала A и B, на втором SPI CLK - при этом и АЦП и SPI хост-процессора работают как slave. Канал на котором CS сконфигурировать как триггер для сброса счетчика второго таймера - чтобы не парится со смещением фаз которая может возникнуть при неодновременном включении таймеров - так у вас гарантированно все будет работать синхронно. Когда CS в неактивном состоянии оба слейва будут игнорировать клоки.

 

Но если инженеры AD делают на прерываниях то наверное на прерываниях все-таки можно обрабатывать клоки порядка сотен килогерц

 

можно но не нужно - производительность системы упадет настолько что проще 8 битник поставить - с таким подходом вам и core i7 будет мало для задачи :) но инженеров AD можно понять - они могут использовать только стандартные ф-ции ядра чтобы иметь хоть какой-то шанс пропихнуть все в ванильное ядро - вам это не грозит :)

Изменено пользователем sasamy

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


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

2) да - формировать на одном таймере CONVST + CS используя оба канала A и B, на втором SPI CLK - при этом и АЦП и SPI хост-процессора работают как slave. Канал на котором CS сконфигурировать как триггер для сброса счетчика второго таймера - чтобы не парится со смещением фаз которая может возникнуть при неодновременном включении таймеров - так у вас гарантированно все будет работать синхронно. Когда CS в неактивном состоянии оба слейва будут игнорировать клоки.

А что, красиво! Эх гдеж Вы были раньше :rolleyes: Я б наверно, так и сделал с самого начала, но терь уж оставлю как есть, а способ может в будущем пригодится. Тут есть один момент изза которого работа в прерывании предпочтительна для меня - с ДМА нет возможности обрабатывать текущие данные, а мне то как раз надо.

ЗЫ. Я бы сделал чуть подругому, Канал на котором CS я бы использовал для старта второго таймера, а в нем бы настроил считалочку от 0 до 127, чтобы вырабатывалось ровно 128 импульсов. В конце счета таймер сам сбрасывается в 0 и останавливается.

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


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

Тут есть один момент изза которого работа в прерывании предпочтительна для меня - с ДМА нет возможности обрабатывать текущие данные, а мне то как раз надо.

 

Делаете буферы у PDC по 16 байт и получаете ровно то что вы делали без DMA но уже с DMA и не надо натирать мозоли - данные при входе в обработчик уже готовые лежат в памяти.

 

ЗЫ. Я бы сделал чуть подругому, Канал на котором CS я бы использовал для старта второго таймера, а в нем бы настроил считалочку от 0 до 127, чтобы вырабатывалось ровно 128 импульсов. В конце счета таймер сам сбрасывается в 0 и останавливается.

 

честно говоря не могу сообразить - как это сделать.

Изменено пользователем sasamy

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


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

Делаете буферы у PDC по 16 байт и получаете ровно то что вы делали без DMA но уже с DMA и не надо натирать мозоли - данные при входе в обработчик уже готовые лежат в памяти.

 

 

 

честно говоря не могу сообразить - как это сделать.

Просто у меня сейчас сделано чтение по параллельному интерфейсу, как его зарядить на ДМА я так и не придумал.

 

По второму. Да, без дополнительной обвязки снаружи похоже не сделать...Т.е идея была стробировать тактовый сигнал таймера пока тот считает от 0 до 127. Хм, да, чтото я замечтался :) Тут даже нет выхода на ножку тактового сигнала. Выходит Ваш вариант единственно реализуемый. Т.е второй таймер генерит постоянно, а первый вырабатывает чип селект такой длительности, чтобы в его активный период уложилось ровно 128 импульсов второго таймера. Я правильно понял идею?

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


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

sasamy предложил красивое решение, но если взять пример с прерыванием от ацп, то я запускаю прием данных по spi pdc в функции прерывания и принимаю ровно 16 байт.

В случае если писать все на таймерах то непонятно где вызывать прием данных. Или как-то по-хитрому надо настроить DMA при инициализации драйвера?

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


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

Т.е второй таймер генерит постоянно, а первый вырабатывает чип селект такой длительности, чтобы в его активный период уложилось ровно 128 импульсов второго таймера. Я правильно понял идею?

 

В целом да, только чипселект вырабатывается исходя из того чтобы он был неактивен на время (t1max + tCONVmax) - это максимальное время после подачи импульса на линиях CONVST когда АЦП выдает сигнал BUSY, в оставшееся время tCYCLE - (t1max + tCONVmax) он активен и за это время второй таймер должен выдать 128 импульсов.

 

В случае если писать все на таймерах то непонятно где вызывать прием данных.

 

PDC выставляет флаг ENDRX flag is set when the PERIPH_RCR register reaches zero по заполнению текущего буфера, а spi генерирует прерывание SPI Interrupt Enable Register - ENDRX: End of Receive Buffer Interrupt Enable

 

продолжая заполнять второй скопировав и обнулив SPI_RNCR, SPI_RNPR - я же приводил цитату из даташита, в обработчике нужно записать новое значение в SPI_RNCR, SPI_RNPR и сделать необходимые манипуляции с данными и так по кругу.

 

PS для BUSY будет просто tCONVmax без t1 - просмотрел где стрелка на диаграмме заканчивается

Изменено пользователем sasamy

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


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

Получается PDC настраивается один раз во время инициализации и тут же запускается прием. Как только заполняется буфер(мне нужен 1Мб например) в прерывании от spi обнуляем указатели и забираем данные. BUSY не используем.

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


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

BUSY не используем.

 

Можно и третий вариант - три таймера, на одном таймере только CONVST, на втором CS, на третьем SPI CLK, у 2 и 3 для синхронизации использовать в качестве триггера спадающий фронт BUSY. В этом случае можно увеличить время чтения чтобы все в один канал SPI уместить (продолжать читать когда уже BUSY активен - глаавное успеть до спадающего фронта ) - у этого АЦП относительно медленный SPI

Data can be read from the AD7606 at any time other than on

the falling edge of BUSY because this is when the output data

registers are updated with the new conversion data.

Изменено пользователем sasamy

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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