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

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Ледокот
Открыл глаза
Сообщения: 71
Зарегистрирован: Пт апр 22, 2011 18:41:48
Контактная информация:

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

Сообщение Ледокот »

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

Возникла следующая проблема: приёмопередатчик 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'ы ему выставляли данные (но это не точно, глубоко не вчитывался, мне это не нужно сейчас). Сейчас буду искать косяк с битовыми полями.
Если я где-то ошибаюсь, прошу от меня этого не скрывать. Заранее очень признателен :)
Реклама
Аватара пользователя
HardWareMan
Мучитель микросхем
Сообщения: 431
Зарегистрирован: Ср сен 02, 2015 07:47:20

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

Сообщение HardWareMan »

[uquote="Ледокот",url="/forum/viewtopic.php?p=4568274#p4568274"]Судя по всему, контроллер SPI был настроен в режим MASTER RXONLY, в этом режиме он, вроде бы, постоянно дирижирует линией, чтобы SLAVE'ы ему выставляли данные (но это не точно, глубоко не вчитывался, мне это не нужно сейчас).[/uquote]
Что скорее всего даже описано в букваре на него...
Репозиторий STM32: https://cloud.mail.ru/public/2i19/Y4w8kKEiZ
Актуальность репозитория: 22 апреля 2026 года
Если чего-то не хватает с сайта st.com - пишите, докачаю.
/!\ Обновлений для STM32PowerMon и STM32PowerMon-UCPD временно не будет.
Реклама
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

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

Сообщение jcxz »

[uquote="Ледокот",url="/forum/viewtopic.php?p=4568274#p4568274"]глубоко не вчитывался, мне это не нужно сейчас[/uquote]Обычно это является основной причиной повторного наступления на грабли. На ровном месте. Снова и снова... :facepalm:
PS: Впрочем - каждый сам кузнец своего счастья граблей.
Ответить

Вернуться в «ARM»