2017-02-10 29 views
1

Я пытаюсь перенести некоторые из моих AVR-кодов, чтобы управлять простым ЖК-дисплеем SPI для ARM в качестве учебного упражнения (я очень новичок в ARM в целом). Для этого мне просто нужно использовать SPI в главном режиме.STM32F1 - Использование основного SPI на голом металле

Я посмотрел в datasheet для своего устройства (STM32F103C8) и обнаружил, что требуемые штыри SPI1, SCK и MOSI отображаются как альтернативные функции PA5 и PA7 соответственно, а также другие периферийные устройства (стр. 29). Я понимаю, что для того, чтобы использовать функцию SPI на этих контактах, мне нужно убедиться, что что-либо еще, сопоставленное с одним и тем же выводом, отключено. Однако, смотря на значения по умолчанию для регистра периферийных часов, похоже, что другие функции уже отключены.

Я рассмотрел раздел SPI в разделе reference manual, включая раздел 25.3.3 - Конфигурирование SPI в режиме мастера. Сначала я включил мастер-часы SPI1 в APB2ENR и выполнил шаги в этом разделе, чтобы настроить SPI1 на мои нужды. Я также изменил настройки для PA5/7, чтобы установить их режим на «Alternate Function Output push-pull» (9.1.4). Наконец, я включил SPI1, установив CR1_SPE.

Из моего чтения я подумал, что, загрузив значение в регистр данных SPI1 после настройки SPI, как указано выше, данные будут сдвинуты. Однако после записи данных флаг TXE в регистре состояния SPI никогда не устанавливается, указывая, что данные, которые я написал в нем, просто сидят там.

На этом этапе я предполагаю, что есть что-то еще, что я не смог правильно настроить. Например, я не уверен на 100% о том, что делать с контактами PA5/7. Я пытался понять, что могу, из таблиц, но я никуда не денусь. Есть ли что-то еще, что нужно сделать, прежде чем он сработает?

+0

Я не думаю, что неправильно сконфигурированные контакты остановили бы SPI, пытающийся передать данные. Это никуда не денется, но периферия все равно. Я бы предположил, что периферийное устройство настроено неправильно. Вы включили часы для SPI? Включили ли вы SPI? –

+0

опубликуйте свой код, в противном случае все, что мы можем сделать, это догадаться ... –

ответ

4

Я почти уверен, что вы не установили SSM и SSI битов в регистр SPIx->CR1. SPI в этих чипах довольно просто, для опрашиваемых переводов вам необходимо установить SSM, SSI, SPE, MSTR, правильный формат (LSBFIRST, CPOL, CPHA) и собственно бод (BR) в SPIx->CR1 и вы хорошо идти.

+0

Вы правы, я не касался настроек SSM/SSI, так как я думал, что они не повлияют на мастер-режим. Я обновляю свой пост с помощью кода, спасибо – Triforcer

+0

@Triforcer - эти бит влияют на мастер-режим, когда вы не используете штырь CS. Предполагается, что STM32 поддерживает режим с несколькими ведущими, поэтому они НЕ ПЕРЕДАЮТ что-либо, когда CS находится в режиме мастер-режима. SSM и SSI служат как «программный подчиненный выбор», и применяется то же правило - когда они «0», вы не увидите никакой передачи. –

+0

Установка бит SSI/SSM решила мою проблему, спасибо. Микроконтроллеры, которые я использовал в прошлом, не имели положений для мультимастера, поэтому концепция была чужда мне. Я не знаю, почему ваш ответ был опущен. Кажется неконструктивным для людей делать это без объяснения причин. – Triforcer