Уважаемые коллеги, здравствуйте!
Возникла следующая проблема: приёмопередатчик 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'ы ему выставляли данные (но это не точно, глубоко не вчитывался, мне это не нужно сейчас). Сейчас буду искать косяк с битовыми полями.