Ник:
Пароль:

Контакты

E-mail: info@starterkit.ru
тел.: +7 922 680-21-73
тел.: +7 922 680-21-74
Телеграм: t.me/starterkit_ru

Способы оплаты

User Info


Добро пожаловать,
Guest

Регистрация или входРегистрация или вход
Потеряли пароль?Потеряли пароль?

Ник:
Пароль:

ПользователейПользователей:2
Поисковых ботовПоисковых ботов:3
ГостейГостей:1

ОбновитьПодробнееВсегоВсего:6
Форум » starterkit.ru » Embedded Linux
SPI + Linux
dimego
Добавлено 05.02.2011 01:07
0
Сообщение: 1
dimego
0

Пункты: 175
Регистрация: 08.11.2010
Привет.

Имеется задача:
реализовать генератор сигнала на плате SK-AT91SAM9XEE, к которой подключается внешний модуль с ЦАП.

Пробовал fwrite(), write(), ioctl() в /dev/spidev1.0 в цикле - везде результат неудовлетворительный.

Проблема заключается в том, что отправка значений по SPI неравномерна, т.е. "пачками" (смотрел по осциллографу)

как-то так: ||||||||||||_||||||||||||_||||||||||||

вопрос 1: прошу направить в нужную сторону, возможно в linux имеются какие-то механизмы о которых я не знаю, которые позволят передавать данные по SPI непрерывно.

2: в идеале - хотелось бы иметь данную плату в качестве slave'а SPI. Но это опционально.

Спасибо.
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 05.02.2011 04:52 Редактировалось 05.02.2011 05:00 Сообщение: 2
sasamy
4.71

Пункты: 83558
Регистрация: 14.08.2009
Цитата

вопрос 1: прошу направить в нужную сторону, возможно в linux имеются какие-то механизмы о которых я не знаю, которые позволят передавать данные по SPI непрерывно.

2: в идеале - хотелось бы иметь данную плату в качестве slave'а SPI. Но это опционально.


Можно, только скорей всего нужно выкидывать атмеловский драйвер spi вместе с spidev и переписывать под себя. Смысл такой - переписать интерфейс в юзерспейс через UIO. У pdc есть два указателя и два счетчика - соотвественно текущий буфер и следующий. Как только передача текущего буфера закончена срабатывает прерывание - его и надо прокидвать в юзерспейс, при этом если счетчик следующего буфера не равен нулю pdc автоматически загружает указатель и счетчик текущего буфера значениями следующего буфера, обнуляет укзатель и счетчик следующего буфера и продолжает передачу. Так вот как только передался текущий буфер - в юзерспейс ловим этот момент и закидываем новые данные в следующий буфер, при этом нужно успеть пока второй буфер не передался и так циклически. В драйвере UIO в ядре выделяете два физически непрерывных буфера в соответствии со своей задачей. Вот и все :) Хоть у этих камней и нет полноценного dma со связаным списком буферов (scatter/gather list) есть вот такой удобный механизм с указателем на следующий буфер.
Спуститься к концу Подняться к началу
Персональная информация
dimego
Добавлено 05.02.2011 15:49 Сообщение: 3
dimego
0

Пункты: 175
Регистрация: 08.11.2010
2Sasamy: Спасибо! Мысль понятна, правда сложновата в реализации для меня, оставлю как запасной вариант.

Пока попробую это сделать через ALSA, готовый драйвер AT73C213 имеется, он мало чем отличается от моего ЦАП.
Спуститься к концу Подняться к началу
Персональная информация
Форум » starterkit.ru » Embedded Linux