본문 바로가기

생활노트

20120917 STM32f4 spi 통신

20120917 STM32f4 spi 통신


계속적으로 SPI 통신을 시도하고 있다. 


일단 내가 짠 코드로는 동작을 하지 않네 ㅠㅠ


Discovery FW 예제에는 SPI 가 없어서 STM32F4 DSP_stdperiph_Lib 의 예제를 참조하여 짜고 있었다. 


거기에 TwoBoards 예제를 이용하고 있었는데 신호가 가는건 잘 가는데 받질 못하는 것이 문제!


그래서 수정에 수정을 거듭하였으나 RXEN 인터럽트 플레그를 읽지 못한다는게 또다른 문제!


결국 몇몇은 해결하였으나 아직 원할한 통신이 되고 있지 않다.


문제1. UART 와 SPI를 사용하는데 선언 순서를 바꾸면 SPI 가 동작하지 않는다.


문제2. RXEN 인터럽트 플레그를 읽을수가 없다. 
     (데이터 읽기를 하면  while((SPI1->SR & SPI_I2S_FLAG_RXNE) == RESET); 이부분에서 무한루프에 빠진다)


문제3. 데이터가 읽어지지 않는다.




문제1 해결 : 클럭을 먼저 인에이블해준다.

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

를 초기화 함수 제일 위에 위치시킨다. 


코드를 복사해다가 그것을 기준으로 수정을 하다보니 클럭을 넣어주는 부분이 밑으로 내려갔다. 즉 모든 설정을 하고 포트에 클럭을 넣어준셈

다시 순서를 바꿔서 테스트를 해보진 않았지만 어떠한 기능을 사용할것이라면 클럭을 넣어주고 초기화를 시키자!


stm32f4xx_spi.h 을 보면 How to use this driver 에서도 친절하게 설명되어 있다. 



이런 기초적인 실수를 ㅠㅠ  (이러면서 배우는거지 뭐~)



문제2 해결 : MISO 포트설정이 되어있지 않았다.

내가 사용하고 있는 예제는 각각 마스터에서 데이터를 날려주면 슬레이브에서 받아서 LED를 동작시키는 예제이다.

그러다보니 MOSI 만 사용한다고 MOSI 만 선언해놓고 MISO는 AF모드 초기화가 되어있지 않았다. 

따라서 RXEN 플레그도 동작을 하지 않았던 것이고 신호를 아무리 보내도 데이터를 읽을 수 었었던 것이다. 




문제3 미해결 :

문제2를 해결하게 되면서 RXEN을 이용하에 레지스터의 데이터를 읽어올수 있게 되었다. 

그러나 Who am i reg 를 읽어오기 때문에 항상 같은값을 유지해야하는 출력값이 변한다던가, 항상 255로 읽어들인다던가 하는 예상하지 못한 동작을 한다.

심지어 데이터는 날라오는데(이상하게도 계속적으로 변한다. 하지만 어쨌든 데이터가 들어오는 모습을 확인할 수 있었다.) 그럼에도 불구하고 레지스터를 읽을때는 항상 255갑을 출력하는 문제점이 발생했다.


문제를 해결하기 위해 기존의 spi2를 사용하던것을 http://nexp.tistory.com/1545 에 있는 방식을 이용하여 테스트해보았다.

데이타가 들어오는것이 보이나(들어오는 데이터가 2~3개의 패턴으로 변한다 <-원래는 변하면 안되는데 원하는 값은 안나오고)  역시 255 값으로만 읽어진다. 



다음실험.

실험1. 1개의 보드에서 2개의 SPI를 이용하여 송 수신을 테스트해본다.

실험2. 예제에 나와있는것과 같이 인터럽트를 이용하여 실험해본다. 

실험3. 3축 가속도가 아닌 다른 센서를 이용하여 테스트해본다.

         (discovery 보드 내의 가속도 센서 혹은 myGyro300spi 등을 고려중이다.)