Приемная часть SPI в STM32F0 не работает

Я использовал MCU STM32F042K6T6. Я настроил SPI в двунаправленном режиме, чтобы читать датчик MLX90316. Теперь функция чтения заблокирована в ожидании сигнала RXNE. Если я правильно понял, как только я переведу SPI в режим rx, автоматически создается SCLK и запускается процедура приема. Но RXNE никогда не устанавливается и ничего в RxFIFO. Похоже, что принимающая часть SPI вообще не работает. Даже если я переведу MCU в полнодуплексный режим, когда я инициализирую передачу данных, записывая SPI1-> DR, данные передаются успешно, но проблема все еще остается.

Тот же код протестирован на STM32F405RGT6, и он работает правильно (если мне не нужны данные, потому что GPIO не настроен). Я понятия не имею об этой странной проблеме ...

Заранее спасибо.:)

Начальная функция

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
/* SPI configuration -------------------------------------------------------*/
SPI_I2S_DeInit(SPI1);
SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx; // Initially Tx
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; // Clock steady high
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; // Data write on rising (second) edge
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI1, &SPI_InitStructure);
SPI_RxFIFOThresholdConfig(SPI1, SPI_RxFIFOThreshold_QF);
SPI_Cmd(SPI1, ENABLE);

Функция трансмиссии:

void spi_send_8bit(uint8_t Data){
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET); //wait buffer empty
SPI_SendData8(SPI1, Data);
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET); //wait finish sending}

uint8_t spi_recv_8bit(void){
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET) ; // wait data receive
return SPI_ReceiveData8(SPI1);}



static void Read(void){

MLX90316_1_Set(); //Pull down the CS line
SPI_BiDirectionalLineConfig(SPI1, SPI_Direction_Tx);
spi_send_8bit(0xAA);
spi_send_8bit(0xFF);


while (SPI_GetReceptionFIFOStatus(SPI1) != SPI_ReceptionFIFOStatus_Empty)
    SPI_ReceiveData8(SPI1);

SPI_Cmd(SPI1, DISABLE);
SPI_BiDirectionalLineConfig(SPI1, SPI_Direction_Rx);
SPI_Cmd(SPI1, ENABLE);

Data[0] = spi_recv_8bit();
Data[1] = spi_recv_8bit();
Data[2] = spi_recv_8bit();
Data[3] = spi_recv_8bit();
SPI_BiDirectionalLineConfig(SPI1, SPI_Direction_Tx);
spi_send_8bit(0xFF);
spi_send_8bit(0xFF);
spi_send_8bit(0xFF);
spi_send_8bit(0xFF);
MLX90316_1_Cl();}

person liu_tianyi    schedule 17.01.2015    source источник


Ответы (4)


У меня была такая же проблема, я решил ее, установив бит FRXTH в регистре SPI1-> CR2.

person Yarik.Yar    schedule 16.04.2017

Эта функция не будет работать:

uint8_t spi_recv_8bit(void){ while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET) ; // wait datareceive return SPI_ReceiveData8(SPI1);}

Вы должны записать фиктивное значение в регистр DR для запуска CLK импульсов в режиме ведущего SPI. Для этого вы можете использовать свою функцию spi_send_8bit().

person Turbo J    schedule 18.01.2015
comment
Фактически, я пробовал это и обнаружил, что если я записываю 4 байта данных в Tx FIFO и записываю регистр SR, я обнаружил, что, когда количество Tx FIFO уменьшается, что означает, что устройство отправляет данные правильно, количество Rx FIFO никогда не увеличивается, и поэтому бит RXNE никогда не устанавливается. Я пробовал тот же код в двух разных STM32F0, чтобы исключить возможность повреждения чипа. Думаю, может я что-то упустил ... - person liu_tianyi; 06.02.2015

Хотя сейчас это может быть "старый" пост, я нашел его, поэтому он может быть полезен другим, у меня также есть проблема с RXNE как на STM32F030, так и на 042.

Я обнаружил, что один шаговый процесс (IAR IDE) зависает от процессора в цикле опроса RXNE:

while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);

Я пытался:

while (SPI_GetReceptionFIFOStatus(SYS_SPI) == SPI_ReceptionFIFOStatus_Empty);

Тот же результат, получатель не сообщает нам, что он завершен.

Я поставил точку останова в строке, следующей за ними, что по логике не было бы достигнуто - это так !!! Возможно, это периферийное устройство SPI или проблема отладки. Описание RXNE оставляет желать лучшего, оно почти читается, поскольку это "FIFO ALMOST FULL"

person RichardJ    schedule 05.10.2015
comment
Итак, наконец, я узнал, что случилось. Это связано с RCC. В STM32F0 доступны два RC-генератора, один на 8 МГц, а другой на 48 МГц. Если я выберу RC-генератор 8 МГц и использую ФАПЧ для тактовой частоты 48 МГц, возникает эта проблема. Но если я использую осциллятор 48 МГц непосредственно в качестве тактовых импульсов, SPI будет работать нормально. - person liu_tianyi; 18.10.2015

У меня такая же проблема, часы никогда не отправляются, даже после инструкции SPI2->CR1 &= ~SPI_CR1_BIDIOE;

Мое решение: перед приведенной выше инструкцией поставить:

SPI2->CR1 |= SPI_CR1_RXONLY;
SPI2->CR1 &= ~SPI_CR1_RXONLY;

Это выводит часы и устанавливает бит SPI_FLAG_RXNE. Я уже использую внутренние часы на 48 МГц.

person ronald benvenutti    schedule 27.04.2017