본문 바로가기

Firmware/stm32

STM32 SPI Slave 동작 시 데이터 송수신 이상 현상

SPI Slave 동작 중 데이터를 receive 받을 때 받는 텀이 매우 빠르면 데이터가 밀리거나 동작이 안되는 현상이 있다.

 

개발 스펙은 다음과 같다.

 

Develop Toolchain

Toolchain / IDE: STM32CubeIDE

Firmware Package Name and Version: STM32Cube FW_L1 V1.10.0

 

SPI Settings

Mode: FULL-Duplex Slave

Basic Parameters:

Frame Format

Motorola

Data Size

8 Bits

First Bit

MSB First

 

Clock Parameters:

Frequency

1MHz

Clock Polarity (CPOL)

Low

Clock Phase (CPHA)

2 Edge *

CRC Calculation

Disabled

NSS Signal Type

Input Hardware

 

문제 현상

명령어를 송신 후 다음 명령어를 수신하면 데이터를 정상적으로   받지 못해 에러가 뜨는 현상 발생

 

문제 원인

Callback 함수에서 RX DMA Enable 할 때 잘못된 타이밍에 호출되어 문제 발생하였다.

SPI는 데이터를 송수신 할 때 Shift register를 사용하여 데이터를 송수신 한다.


Rx Complete interrupt
호출할 때는 상관없다. 하지만 Tx Complete interrupt를 호출할 때는 Master가 데이터를

받았다고 호출하는 것이 아닌 Tx Buffer에 쓰는 순간 Complete interrupt 함수를 호출한다. 호출 한 함수에서 Rx interrupt enable 하는 순간 Shift register에 써진 값을 읽어와 Receive 타이밍이 깨지게 된다.

 

 

문제가 발생한 TX 타이밍

Tx Complete Callback 함수 호출 시점이 마지막 데이터를 보내기 전에 호출되어  RX DMA Enable 한다. 때문에 마지막 ▣ DataShift register에 있을 때 RX DMAEnable 되어 ▣ DataRx buffer push 하게 된다.

 

문제 해결된 TX 타이밍

 

Tx Complet Callback 함수 호출 시점을 마지막 데이터를 보내고 난 다음에 호출되면 문제가 해결된다.


수정 전: SPI_Send_enable_DMA(data, size);
수정 후: SPI_Send_enable_DMA(data, size + SPI_INIT_CLOCK); //SPI_INIT_CLOCK = 1