Как написать драйвер SPI для платы разработки Zynq 7000 ARM?

Я собираюсь написать драйвер SPI для платы разработки ARM. Он не используется с Linux.

Вчера я прочитал драйвер QSPI, предоставленный Xilinx, и успешно его попробовал. Тем не менее, я бы очень хотел написать свой собственный драйвер SPI.

Вот мои вопросы:

  1. В чем разница между QSPI и SPI при использовании?
  2. Если я напишу драйвер на основе QSPI, он будет работать?
  3. Если я пишу драйвер с нуля, какова основная процедура (ЧТЕНИЕ/ЗАПИСЬ/ИНИЦИАЛИЗАЦИЯ)?
  4. И, наконец, почему SPI должен отправлять и получать одновременно?

Спасибо всем.


person Ezio    schedule 19.05.2013    source источник
comment
В этом нужно многое разобраться и прояснить. Тем не менее, ядра QSPI в процессоре, как правило, могут использовать SPI при переводе в такой режим, поэтому сначала проверьте документацию и исходный код и убедитесь, что уже имеющийся у вас драйвер нельзя использовать для простого SPI.   -  person Chris Stratton    schedule 19.05.2013
comment
SPI по своей сути является обменом битами, но никто не говорит, что считываемые при записи должны быть важны в каждом случае — это зависит от периферии. Для многих считанные во время команды бессмысленны, и тогда не важно, что вы тактируете, пока читаются ответные данные. Тем не менее, также возможно создать периферийное устройство, которое оптимизирует использование шины, давая вам старые ответы или ответы по умолчанию/состояние в то же время, когда вы вводите новые команды.   -  person Chris Stratton    schedule 19.05.2013


Ответы (1)


Думаю, будет проще начать с вашего последнего вопроса.

Why must SPI send and receive at the same time?

Простой ответ заключается в том, что это часть протокола. Когда данные передаются по линии MOSI от ведущего устройства к ведомому, данные в буфере ведомого устройства перемещаются к ведущему устройству по линии MISO. Это позволяет аппаратному обеспечению использовать один регистр в каждом устройстве как для отправляемых, так и для принимаемых данных. Вот хорошая схема процесса:

http://en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bus

Не самый простой ответ заключается в том, что SPI не является четко определенным стандартом. Существуют различные типы реализации в зависимости от используемых вами устройств. Существует даже вариант, в котором линии MOSI и MISO объединены и используются двунаправленно (3-wire SPI). Тем не менее, большинство реализаций, с которыми я имел дело, отправляют и получают по двум разным линиям, и это, как правило, стандартная методология.

What is the difference between QSPI and SPI on usage?

QSPI или Quad SPI на самом деле не придерживаются стандартной методологии и ломают концепцию отправки и получения одновременно. Он использует четыре двунаправленных линии ввода-вывода для отправки и получения данных и часто используется для приложений памяти (поскольку он быстрее, чем SPI). С QSPI вы не отправляете и не получаете одновременно.

If I write a driver based on QSPI, will it work?

Безусловно! Вам просто нужно ознакомиться с оборудованием, которое вы используете. Опять же, SPI очень отличается от Quad SPI, и вы часто можете найти аппаратные реализации, которые очень упрощают использование QSPI. Например, ваш Zynq 7000 имеет контроллер QSPI, который имеет множество функций для упрощения процесса кодирования. Он также будет работать в «устаревшем режиме», который действует как обычный контроллер SPI. Кроме того, Zynq 7000 имеет два других стандартных контроллера SPI, которые не настроены для QSPI. Я настоятельно рекомендую вам прочитать техническую документацию здесь:

http://www.xilinx.com/support/documentation/user_guides/ug585-Zynq-7000-TRM.pdf

If I write a driver from scratch, what is the basic procedure?

Это очень зависит от оборудования. Я сделал краткий обзор вашего оборудования, но подробное описание шагов заняло бы слишком много времени. Однако в техническом руководстве для вашего устройства содержатся отличные пошаговые инструкции по настройке и использованию как контроллеров QSPI, так и контроллеров SPI. Вот пример из раздела SPI:

17.3.1 Последовательность запуска

Пример: последовательность запуска

  1. Сброс контроллера: Подтвердите и отмените сбросы Ref и CPU_1x, см. раздел 17.4.1 Сбросы.
  2. Запрограммируйте часы: Запрограммируйте SPI_Ref_Clk, см. раздел 17.4.2 Часы.
  3. Маршрутизация сигналов Tx/Rx: См. раздел 17.5 Интерфейсы ввода-вывода.
  4. Конфигурация контроллера: См. раздел 17.3.2 Конфигурация контроллера.
  5. Конфигурация прерывания: Настройте ISR для обработки условий прерывания. Простейший ISR считывает данные из RxFIFO и записывает содержимое в TxFIFO. Контроллер прерываний PS описан в Главе 7, Прерывания. Механизм прерывания для контроллера SPI описан в разделе 17.3.5 Процедура обслуживания прерываний.
  6. Начать передачу данных:

    Выбор работы в ведущем режиме: ручной/автоматический запуск и SS, см. раздел 17.3.3 «Передача данных в ведущем режиме».

    Работа в ведомом режиме, см. раздел 17.3.4 Передача данных в ведомом режиме.

Надеюсь, это поможет!

person embedded_guy    schedule 21.05.2013