TigerSHARC 0 17 августа, 2012 Опубликовано 17 августа, 2012 (изменено) · Жалоба to sasamy: Интересный подход. Но если инженеры AD делают на прерываниях то наверное это тоже вариант. Предложенный вами подход интересен, но не могли бы вы уточнить: 1) зачем заводить busy на CS АЦП? Ведь CS должен быть в низком уровне во время всей посылки. 2) вы предлагаете настроить слейв на хост процессоре и формировать на этом же процессоре клок таймером для передачи данных? Вообще очень интересный вариант, надо будет сравнить реализации. Изменено 17 августа, 2012 пользователем TigerSHARC Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sasamy 0 17 августа, 2012 Опубликовано 17 августа, 2012 (изменено) · Жалоба 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 можно понять - они могут использовать только стандартные ф-ции ядра чтобы иметь хоть какой-то шанс пропихнуть все в ванильное ядро - вам это не грозит :) Изменено 17 августа, 2012 пользователем sasamy Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alexashka 0 17 августа, 2012 Опубликовано 17 августа, 2012 · Жалоба 2) да - формировать на одном таймере CONVST + CS используя оба канала A и B, на втором SPI CLK - при этом и АЦП и SPI хост-процессора работают как slave. Канал на котором CS сконфигурировать как триггер для сброса счетчика второго таймера - чтобы не парится со смещением фаз которая может возникнуть при неодновременном включении таймеров - так у вас гарантированно все будет работать синхронно. Когда CS в неактивном состоянии оба слейва будут игнорировать клоки. А что, красиво! Эх гдеж Вы были раньше :rolleyes: Я б наверно, так и сделал с самого начала, но терь уж оставлю как есть, а способ может в будущем пригодится. Тут есть один момент изза которого работа в прерывании предпочтительна для меня - с ДМА нет возможности обрабатывать текущие данные, а мне то как раз надо. ЗЫ. Я бы сделал чуть подругому, Канал на котором CS я бы использовал для старта второго таймера, а в нем бы настроил считалочку от 0 до 127, чтобы вырабатывалось ровно 128 импульсов. В конце счета таймер сам сбрасывается в 0 и останавливается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sasamy 0 17 августа, 2012 Опубликовано 17 августа, 2012 (изменено) · Жалоба Тут есть один момент изза которого работа в прерывании предпочтительна для меня - с ДМА нет возможности обрабатывать текущие данные, а мне то как раз надо. Делаете буферы у PDC по 16 байт и получаете ровно то что вы делали без DMA но уже с DMA и не надо натирать мозоли - данные при входе в обработчик уже готовые лежат в памяти. ЗЫ. Я бы сделал чуть подругому, Канал на котором CS я бы использовал для старта второго таймера, а в нем бы настроил считалочку от 0 до 127, чтобы вырабатывалось ровно 128 импульсов. В конце счета таймер сам сбрасывается в 0 и останавливается. честно говоря не могу сообразить - как это сделать. Изменено 17 августа, 2012 пользователем sasamy Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alexashka 0 17 августа, 2012 Опубликовано 17 августа, 2012 · Жалоба Делаете буферы у PDC по 16 байт и получаете ровно то что вы делали без DMA но уже с DMA и не надо натирать мозоли - данные при входе в обработчик уже готовые лежат в памяти. честно говоря не могу сообразить - как это сделать. Просто у меня сейчас сделано чтение по параллельному интерфейсу, как его зарядить на ДМА я так и не придумал. По второму. Да, без дополнительной обвязки снаружи похоже не сделать...Т.е идея была стробировать тактовый сигнал таймера пока тот считает от 0 до 127. Хм, да, чтото я замечтался :) Тут даже нет выхода на ножку тактового сигнала. Выходит Ваш вариант единственно реализуемый. Т.е второй таймер генерит постоянно, а первый вырабатывает чип селект такой длительности, чтобы в его активный период уложилось ровно 128 импульсов второго таймера. Я правильно понял идею? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TigerSHARC 0 17 августа, 2012 Опубликовано 17 августа, 2012 · Жалоба sasamy предложил красивое решение, но если взять пример с прерыванием от ацп, то я запускаю прием данных по spi pdc в функции прерывания и принимаю ровно 16 байт. В случае если писать все на таймерах то непонятно где вызывать прием данных. Или как-то по-хитрому надо настроить DMA при инициализации драйвера? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sasamy 0 17 августа, 2012 Опубликовано 17 августа, 2012 (изменено) · Жалоба Т.е второй таймер генерит постоянно, а первый вырабатывает чип селект такой длительности, чтобы в его активный период уложилось ровно 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 - просмотрел где стрелка на диаграмме заканчивается Изменено 17 августа, 2012 пользователем sasamy Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TigerSHARC 0 18 августа, 2012 Опубликовано 18 августа, 2012 · Жалоба Получается PDC настраивается один раз во время инициализации и тут же запускается прием. Как только заполняется буфер(мне нужен 1Мб например) в прерывании от spi обнуляем указатели и забираем данные. BUSY не используем. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sasamy 0 19 августа, 2012 Опубликовано 19 августа, 2012 (изменено) · Жалоба 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. Изменено 19 августа, 2012 пользователем sasamy Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться