Написал по подобию gpio структуру для работы с spi:
Инициализирую так же через mmap:
Все хорошо инициализируется, если замкнуть мисо на моси, данные передаются. Но тактирование не происходит (SPCK молчит) и не изменяется нога выбора контроллера и, как следствие, все виснет.
Настройки SPI_MR:
0 бит - режим мастера
1 бит - выбор периферии пробовал фиксированный и "варьирующийся"
2 бит - установлено в 0
PCS - 1111 перед включение SPI, 1110 - после включения SPI
Настройки npcs0(ноги выбора):
Clock polarity = 0
Clock phase = 0
CSAAT = 0
BITS = 0000 (8 bit)
Ну и настройки скорости.
Функция записи:
Виснет на проверке spi_regs->SPI_SR & 0x1 << 1) == 0
Вопрос не совсем в том, почему не работает, тонкостей много. Вопрос кто работал с SPI таким способом? Через драйвер для задачи не подходит.
P.S. Может забыл что то еще указать, тонкостей здесь много.
Вроде как разрешено.
Для этого нужно в одном из регистров PMC(power manager controller) установить нужный бит в 1 (например для SPI0 это 14). Хотя может я неправильно что то понял.
да, для SPI0 это ID14
имхо, по уму, надо:
настроить ноги интерфейса на альтернативные функции
подать тактовую на модуль (PMC_PCER)
настроить регистры SPI0
разрешить работу модуля
проверим готовность узла
кладем данные в регистр - должны передаться..
Я вот чего только не пойму: чем вас spidev то не устроил?
Ну или что мешает собственный драйвер написать?
Можно поподробнее рассказать что за задача такая специфическая?
причины могут быть разные, как-то:
- переход в дальнейшем к своему приложению (без линукса и Со)
- пощупать железо напрямую в целях саморазвития или тренировки перед чем то более глобальным
- что-то под свое специфичное железо (у него на ките еще ФПГА есть..)..
в свое время, Саша (sasamy) писал, что реализация SPI у Atmel хреновая - я ему почему то верю..
Все эти шаги проделываются. В функции записи после проверки ложим в регистр после этого в бесконечном цикле не проходит проверку на окончание передачи, соответственно все виснет (Transmit Data Register Empty не устанавливается в 0).
P.S. Eсли устанавливать режим в LLB - замыкаем miso и mosi, то все что я передаю, успешно принимается.
остается немного вариантов:
- неполностью отключили SPI0 из линукса - может ядро мешает работе
- где-то промахнулись с пинами или режимами этих пинов
- горелый пин - проверятся диагностической писулькой "поднять|опустить пин" и просмотром уровня осциллом
- "забыли" выбрать пин слейва (схожий эффект был на Атмеге - пока пином не дернешь, интерфейс не поднимется)
1e - в /dev не вижу устройств spi;
2е - сверил пины и режимы с даташитом, все правильно;
3е - через pio пины дергаются, получается не горелые;
4е - вот с выбором слейва у меня кажется проблема:
При инициализации я в регистр MR записываю PCS - 1111, непосредственно перед вызовом функции записи я устанавливаю PCS - 1110. Что происходит на осцилле в этот момент:
когда PCS==1111 - все ноги показывают ноль;
когда PCS==1110 - все ноги показывают ноль :о
Пробовал устанавливать ногу с помощью gpio, устанавливается, но spck все равно молчит.
селекция PCS зависит от бита PCSDEC
наверно проще показать, что вы пишете в регистры (вроде не военная тайна) и для контроля вывести дамп содержимого блока регистров SPI0..
тогда можно более отчетливо разобраться в ситуации
уверен, что дело в какой-то ерунде..