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 한다. 때문에 마지막 ▣ Data가 Shift register에 있을 때 RX DMA가 Enable 되어 ▣ Data가 Rx 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
'Firmware > stm32' 카테고리의 다른 글
STM32 FREERTOS Mail Queue 구현 (0) | 2021.02.11 |
---|---|
STM32 SPI ErrorCallback 처리 (0) | 2020.10.14 |
STM32 SPI Slave로 Interrupt DMA Transmit/Receive 구현하기 (1) | 2020.07.24 |
STM32 Bootloader 메뉴 FLASH_If_WriteProtectionConfig 문제 (0) | 2020.07.06 |
STM32 IAP (Ymodem 프로토콜) Bootloader - 2 (0) | 2020.07.02 |