2019.09.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);

 
Posted by 초보 HW 엔지니어 로망와니

댓글을 달아 주세요

2019.09.08 22:11

NXP社의 MK22FXXX 시리즈의 IAR에서 Read/Write Protection 방법

 

/* startup_MKxxxxxx.s 에서 Protection 과 관련된 설정 변경 필요부분 */

__FlashConfig
       DCD 0xFFFFFFFF
       DCD 0xFFFFFFFF
       DCD 0xFFFFFFFF
       DCD 0xFFFFFFFE <= FSEC의 설정이 필요합니다.(올려 놓은 부분은 기본 설정 부분)
__FlashConfig_End

 

 

 

 

MK22F 시리즈에서 Read/Write Protection 값은 0x400 ~ 0x40f까지의 설정에 의해서 결정되게 되는데

Backdoor Key(0x400 ~ 0x407)와 FSEC(0x40C), FOPT(0x40D), FEPROT(0x40E), FDPROT(0x40F), FPROT0-3(0x408 ~ 0x40B) 키 값을 가르키고 실제 가장 중요한 설정인 FSEC은 0x40C의 값에 의해서 결정되게 됩니다.

 

FSEC(하단 PDF URL 참조)

7, 6 => KEYEN 

5, 4 => MEEN

3, 2 => FSLACC

1, 0 => SEC(10을 제외한 모든 설정이 SECURE 설정)

 

--enable_config_wirte 하는 이유는 유저가 실수로 0x400 ~ 0x40f까지 실수로 설정한 후 라이팅하여 더이상 사용하지 못하는 경우를 없애기 위해 만들어 놓은 듯 싶습니다.(하단 URL 참조)

 

icf 파일에서 Flash Config 관련 부분

 

define symbol FlashConfig_start__      = 0x00000400;
define symbol FlashConfig_end__        = 0x0000040f;

 

define region FlashConfig_region = mem:[from FlashConfig_start__ to FlashConfig_end__];

 

place in FlashConfig_region                 { section FlashConfig };

 

 

https://community.nxp.com/thread/311660

 

Using IAR EWARM to program flash configuration ... | NXP Community

There are non-volatile registers in the Kinetis family flash that store the default protection and security settings of the MCU.  These include the registers FSEC, FOPT, FEPROT, and FDPROT at addresses 0x40C - 0x40F.  IAR, like many toolchains, has added p

community.nxp.com

 

https://www.nxp.com/docs/en/application-note/AN4507.pdf

불러오는 중입니다...

 

Posted by 초보 HW 엔지니어 로망와니

댓글을 달아 주세요