초보의 아웅다웅 설계하기/STM32

SPI Slave에서 입력 데이터 처리

로망와니 2019. 9. 30. 15:25

사용 MCU : STM32L432



SPI Slave Mode에서 입력된 데이터를 파싱하고 처리하는 데도 연달아 데이터가 계속 들어오다보니 어느순간 SPI가 죽어버렸습니다. (SPI Flash의 쓰기 같은 경우 데이터를 넣고 나서 완료되었는 지 Status 값을 확인하기 위해 SPI에 데이터를 계속 넣는데 그런 경우를 가정하였습니다. - 사용중에 MCU의 Reset를 하도록 회로설계가 되면되지만 그렇지 못한 경우도 가정해야하니까요.)

어디선가 충돌이 나고 있는데... 들어온 데이터의 암복호화 연산처리중에 죽는건지(Stack도 충분한데) 사실 파악은 하지 못하였으나 일단 다 연산하기 전에 셋다 disable 해주고 나서 처리 후 enable 해주니까 괜찮네요... 안 괜찮네요. 

원인 파악을 확실히 못했으니 나중에 또 문제가 발생할 여지가 있네요.
답답.. 일단 다른 게 더 급하니 패스하고 나중에 다시 봐야겠습니다.

원인을 알았습니다.

보내는 부분에서 데이터가 다 보내질 때까지 while로 레지스터가 비워졌는지 체크하는데 Master에서 데이터를 밀어주지 않으니 못 보내고 뻗네요.(ST의 hal 예제로 Master을 구현하고 Slave는 전송이랑 수신의 데이터 길이가 다르게 설계)

입출력 길이를 맞춰주도록 설계를 바꾸고(ST 예제만 가지고 구현하는 사람들을 위해서...) 출력할 때 Timeout넣어주고 했습니다.

 

=> 다른 문제가 하나 더 있었네요. 보드를 두개 연결해서 사용했는데 전원을 Slave를 먼저 켜는 경우 데이터가 밀려서 그랬네요. Master 먼저 켜주고 Slave를 켜주니 괜찮았습니다.



/* Disable RXE   Interrupt             */ 
LL_SPI_DisableIT_RXNE(SPI1); 
/* Disble Error Interrupt             */ 
LL_SPI_DisableIT_ERR(SPI1);



Get_Data();  => SPI 데이터 처리

/* Enable TXE   Interrupt             */ 
LL_SPI_EnableIT_TXE(SPI1); 

Put_Data();  => SPI데이터 출력


/* Enable RXE   Interrupt             */ 
LL_SPI_EnableIT_RXNE(SPI1); 
/* Disable TXE   Interrupt             */ 
LL_SPI_DisableIT_TXE(SPI1); 
/* Enable Error Interrupt             */ 
LL_SPI_EnableIT_ERR(SPI1);