Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

SPI на STM32G473VET6 постоянно отправляет пакеты

Вс апр 14, 2024 19:47:48

Уважаемые коллеги, здравствуйте!

Возникла следующая проблема: приёмопередатчик SPI начинает постоянно слать данные (вижу на осциллографе сигналы SPI4_SCK и SPI4_NSS, при этом SPI4_MOSI и SPI4_MISO в низком уровне. Т.е. интерфейс "самовольно" шлёт 16-битные нулевые пакеты, хотя в регистр SPI4_DR я ничего не пишу. Лично на мой взгляд это неправильно. По моему мнению, там должно что-то появляться, если я положил в регистр SPI4_DR данные. Но, возможно, я зашёл в какой-то "автоматический" режим, в котором контроллер постоянно "дирижирует" линией. Прошу помощи.

Собственно, код:
Код:
int main ()
{
   InitFLASH();
   InitRCC();
   InitGPIOE();
   InitSPI4();
   while(1) {
   }
}


Код:
#include "STM32G4xxSPII2S.h"

void InitSPI4 () {
   // Скорость обмена по SPI равна тактовой частоте, деленной на 128, т.е. около 1 Mbps
   SPI4_CR1.BR = SPI_CR1_BR_FPCLK_DIV_128;
   // Режим работы приёмопередатчика MASTER
   SPI4_CR1.MSTR = SPI_CR1_MSTR_MASTER;
   // Полярность тактового сигнала от нуля к единице
   SPI4_CR1.CPOL = SPI_CR1_CPOL_RISING;
   // Данные выставляются по переднему фронту тактового сигнала
   SPI4_CR1.CPHA = SPI_CR1_CPHA_RISING;
   // Размер пакета 16 бит
   SPI4_CR2.DS = SPI_CR2_DS_16_BIT;
   // Включить SPI4
   SPI4_CR1.SPE = SPI_CR1_SPE_ENABLED;
}


Ну, инициализация FLASH, порта B и сигналов тактовой частоты, думаю, здесь излишня, т.к. сам SPI "работает", хоть и не так, как мне нужно...
Если вызов функции InitSPI4() в функции main() закомментировать, то передачи данных нет, на выводах правильные уровни.

Всем спасибо за внимание.

Добавлено after 1 hour 21 minute 32 seconds:
Всем спасибо за моральную поддержку! Вопрос отвалился сам собой. Когда обращаюсь к регистрам как к 16-битным числам, и записываю в них целые значения, контроллер работает правильно.

Судя по всему, контроллер SPI был настроен в режим MASTER RXONLY, в этом режиме он, вроде бы, постоянно дирижирует линией, чтобы SLAVE'ы ему выставляли данные (но это не точно, глубоко не вчитывался, мне это не нужно сейчас). Сейчас буду искать косяк с битовыми полями.

Re: SPI на STM32G473VET6 постоянно отправляет пакеты

Пн апр 15, 2024 08:09:23

Судя по всему, контроллер SPI был настроен в режим MASTER RXONLY, в этом режиме он, вроде бы, постоянно дирижирует линией, чтобы SLAVE'ы ему выставляли данные (но это не точно, глубоко не вчитывался, мне это не нужно сейчас).

Что скорее всего даже описано в букваре на него...

Re: SPI на STM32G473VET6 постоянно отправляет пакеты

Вт апр 16, 2024 09:19:41

глубоко не вчитывался, мне это не нужно сейчас
Обычно это является основной причиной повторного наступления на грабли. На ровном месте. Снова и снова... :facepalm:
PS: Впрочем - каждый сам кузнец своего счастья граблей.
Ответить