|
Частота прерываний под Linux'ом, реально достижимая |
|
|
|
 |
Ответов
(45 - 53)
|
Aug 17 2012, 13:34
|
Знающий
   
Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858

|
Цитата(TigerSHARC @ Aug 17 2012, 17:03)  1) зачем заводить busy на CS АЦП? Ведь CS должен быть в низком уровне во время всей посылки. 2) вы предлагаете настроить слейв на хост процессоре и формировать на этом же процессоре клок таймером для передачи данных? 1) посмотрите PS - этот вариант намного лучше, я его дописал подумавши  но даже то что я изначально написал будет работать только хуже - смотрите диграмму и лучше не одну и почитайте даташит - данные читаются после того как busy в низком уровне при этом t 4 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 - Aug 17 2012, 13:57
|
|
|
|
|
Aug 17 2012, 14:16
|

Практикующий маг
     
Группа: Свой
Сообщений: 3 634
Регистрация: 28-04-05
Из: Дубна, Моск.обл
Пользователь №: 4 576

|
Цитата(sasamy @ Aug 17 2012, 17:34)  2) да - формировать на одном таймере CONVST + CS используя оба канала A и B, на втором SPI CLK - при этом и АЦП и SPI хост-процессора работают как slave. Канал на котором CS сконфигурировать как триггер для сброса счетчика второго таймера - чтобы не парится со смещением фаз которая может возникнуть при неодновременном включении таймеров - так у вас гарантированно все будет работать синхронно. Когда CS в неактивном состоянии оба слейва будут игнорировать клоки. А что, красиво! Эх гдеж Вы были раньше  Я б наверно, так и сделал с самого начала, но терь уж оставлю как есть, а способ может в будущем пригодится. Тут есть один момент изза которого работа в прерывании предпочтительна для меня - с ДМА нет возможности обрабатывать текущие данные, а мне то как раз надо. ЗЫ. Я бы сделал чуть подругому, Канал на котором CS я бы использовал для старта второго таймера, а в нем бы настроил считалочку от 0 до 127, чтобы вырабатывалось ровно 128 импульсов. В конце счета таймер сам сбрасывается в 0 и останавливается.
|
|
|
|
|
Aug 17 2012, 15:27
|
Знающий
   
Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858

|
Цитата(Alexashka @ Aug 17 2012, 18:16)  Тут есть один момент изза которого работа в прерывании предпочтительна для меня - с ДМА нет возможности обрабатывать текущие данные, а мне то как раз надо. Делаете буферы у PDC по 16 байт и получаете ровно то что вы делали без DMA но уже с DMA и не надо натирать мозоли - данные при входе в обработчик уже готовые лежат в памяти. Цитата ЗЫ. Я бы сделал чуть подругому, Канал на котором CS я бы использовал для старта второго таймера, а в нем бы настроил считалочку от 0 до 127, чтобы вырабатывалось ровно 128 импульсов. В конце счета таймер сам сбрасывается в 0 и останавливается. честно говоря не могу сообразить - как это сделать.
Сообщение отредактировал sasamy - Aug 17 2012, 15:51
|
|
|
|
|
Aug 17 2012, 21:01
|
Знающий
   
Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858

|
Цитата(Alexashka @ Aug 17 2012, 23:20)  Т.е второй таймер генерит постоянно, а первый вырабатывает чип селект такой длительности, чтобы в его активный период уложилось ровно 128 импульсов второго таймера. Я правильно понял идею? В целом да, только чипселект вырабатывается исходя из того чтобы он был неактивен на время (t 1max + t CONVmax) - это максимальное время после подачи импульса на линиях CONVST когда АЦП выдает сигнал BUSY, в оставшееся время t CYCLE - (t 1max + t CONVmax) он активен и за это время второй таймер должен выдать 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 будет просто t CONVmax без t 1 - просмотрел где стрелка на диаграмме заканчивается
Сообщение отредактировал sasamy - Aug 17 2012, 22:07
|
|
|
|
|
Aug 19 2012, 21:34
|
Знающий
   
Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858

|
Цитата(TigerSHARC @ Aug 18 2012, 10:06)  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 - Aug 19 2012, 21:57
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|