오늘은  stm32f107를 사용하면서 겪었던 이야기를 하나 하려고 합니다.


 이 칩에는 이더넷 맥이 내장되어 있습니다.

 다행히 생짜로 드라이버를 짜지 않아도 st 에서 제공하는 라이브러리를 적절히 이용하시면

 이더넷을 사용하실 수 있습니다. 


 저는 mii 인터페이스를 이용하여 구성된 이더넷을 사용하려고 하였습니다.

 그런데 보통 드라이버를 짜다보면 초기화시에 소프트웨어 리셋을 걸어

 모든 레지스터가 초기화 되도록 일반적으로 많이 합니다.


 그런 코드가 아래와 같이 구성되어 있습니다. 


 portBASE_TYPE xEthInitialise(void)

{

   prvSetupEthGPIO();

   RCC_MCOConfig(RCC_MCO_HSE);

   RCC_AHBPeriphClockCmd(....);

   .... 


  /* Reset the peripheral. */

 ETH_SoftwareReset();

 while (ETH_GetSoftwareResetStatus() == SET) {

       vTaskDelay(configTICK_RATE_HZ / portTICK_PERIOD_MS);

 }


 ......

}


 마지막 부분에 보시면 소프트웨어 리셋을 걸고 상태 비트가 클리어 되기를 기다리는 코드입니다.

 사용자가 소프트웨어 리셋을 걸면 칩이 할 일은

 모든 레지스터를 초기값으로 로딩하고 입출력 포트를 체크하여 정상 상태인지를 파악하는 일입니다.


 여기서 잠깐...

 첫번째 모든 레지스터를 초기화 하는 것은 당연하지요?

 

 두번째 입출력 포트의 체크는 사실 상당히 애매합니다.

 무엇을 체크하는지 잘 모르기 때문입니다.

 어쨋든 저는 리셋상태가 풀리지 않아 데이타 쉬트와 많이 놀았는데요.

 결국 알게 된 것은 mii 인터페이스를 구성할때 stm32f107 의 경우 

 데이타의 tx, rx clock 이 입력으로 고정된다는 것입니다.

 문제는 phy 칩의 해당 핀들도 입력이라는 것이죠.


 다행히 stm32f107 에는 MCO Output 을 필요 클럭에 맞게 내보낼수 있도록 되어 있습니다.

 해당 pin 을 사용하여 클럭 공급을 할수 있다는 것이죠.


 하드웨어 핀들을 연결하니 리셋상태가 바로 풀립니다.

 이더넷 리셋의 경우 입력 포트의 클럭이 정상적으로 들어오는지 확인을 하는 기능이 있더군요.

 물론 데이타쉬트에서 해당 내용을 보지는 못했습니다만.... 경험적으로 알게 되었습니다.


 이 칩을 이용하시다가 혹은 하드웨어를 구성하시다가 문제가 생기면 너무 헤메지 마시고

 이글을 찾으시는 행운이 있기를 바랍니다.