이번에 얘기할 내용은 아두이노 공식 쉴드 들의 문제점에 대해서 얘기해 보고자 한다.
일단 위 사진의 두개 제품은 Wifi + microSD 모듈, TFT-LCD + microSD 제품들이다. 이 제품들의 공통점이 있는데 바로 아두이노의 MISO, MOSI, SCK 핀을 이용한 SPI 통신을 한다는 것이다.
사실 이 SPI 통신은 공용 버스로 물려서 Master 와 Slave 간에 통신이 가능한다 아두이노의 경우 라이브러리가 Master만 지원이되며(Slave 동작시킬려면 라이브러리 수정 필요) 다른 쉴드들은 Slave가 되어 서로 통신하게 되어있다.
이런 여러 Slave들과 통신하려면 CS(Chip Select) 또는 SS라는 핀을 LOW(HIGH신호가 동작 안함임) 로 만들어서 동작시켜야 하는데 기존에 라이브러리들은 모두 Slave가 동작할 때만 CS 신호가 동작하여 서로 겹치지 않게 코딩 되어 있다는 것이다.
그런데 문제는 여기서 발생한다. 바로 Wifi + TFT-LCD 는 잘 동작이 되나 microSD를 동작시키면 Wifi와 충돌이 일어나는 것!?
CS를 강제로 HIGH로 만들어 SD 카드를 멈추어도 일단 SD 카드가 init 되면 MISO 핀으로 동작되는 Wifi 모듈이 동작 되지 않는 것이다.
아.. 멘붕.. 이후 구글신께 찾아봤는데 해외에서도 같은 문제로 질문올린 글들이 있었다. 우선 국내 유져의 블로그를 통해 봤는데 정품끼리 연결하면 안된다고 설명되어 있던것.
(
http://coalamovement.tistory.com/entry/%EC%95%84%EB%91%90%EC%9D%B4%EB%85%B8-wifi-shield-%EA%B0%9C%EB%B0%9C-6-%EC%95%84%EB%91%90%EC%9D%B4%EB%85%B8-%EC%95%84%EB%91%90%EC%9D%B4%EB%85%B8-wifi%EC%89%B4%EB%93%9C-%EC%95%84%EB%91%90%EC%9D%B4%EB%85%B8-tft-lcd)
거기다 아두이노 정식 홈페이지에도 SD카드와 wifi 동시 사용시에는 거기에 맞는 라이브러리를 사용하라는데 희한하게 동시에 사용한 예제가 어디에도 없었다(신기...)
그리고 해외 싸이트에서 같은 문제로 질문 올린 애들의 답변에도 다들 SD_CS 핀을 HIGH로 만들면 되야 한다는 것...
여기서 또다시 멘붕... (이놈들 해보고나 하는 소린가?)
일단 여기까지 하루 정도 조사하고 삽질한 바로는
문제1. microSD와 Wifi 모듈을 동시에 동작시키면 안되는데 코드에서 wifi 먼저 초기화 하고 microSD 초기화하면 microSD가 됨. 이후 wifi 동작 안됨
문제2. microSD 먼저 초기화하고 wifi 모듈 초기화하면 wifi 초기화 안됨.
이것을 통해 우선 microSD가 문제라는 것을 알았고 해외블러거들을 통해서 이것이 microSD의 MISO 핀이 문제가 된다는 것을 알았다. 이후 스코프로 SD_CS를 찍어봐도 분명 HIGH 인데 MISO 핀이 Hi-Z 상태가 되지 않기 때문에 Wifi 모듈이 문제가 된다는 것을 예측!!
자.. 문제를 알았으니 반이상 온거다!!
그럼 어떻게 해결할 것이냐? microSD 카드의 spi 타이밍도와 데이타시트를 보기 시작 ...
그러다 문득 내가 가진 microSD 문제인가? 라는 생각에 다른 microSD를 꼽아 보았는데 ㅠ 어무니 ㅠ 되네?
안되던 microSD는 삼성모바일 Ultra XCI 16G.. 되는건 memorette HC 16G 희한하네.. 삼성이 구린건가 ㅎ
이제 잘되겠다 싶어서 TFT를 연결하였으나 TFT의 경우 회로상의 문제로 MISO 핀 때문에 또다시 안됨.
문제도 알고 해결책도 안다. 그러나 하드웨어적인 문제로 TFT, Wifi, SD는 서로 융합할 수 없는 문제 ㅠ
그래서! TFT-LCD 회로를 보니 이를 돌파할 수 있는 방법을 발견!!
정말 천운이다. TFT-LCD의 MISO 핀이 3-State Buffer 가 달려있는 것이 아닌가!!! ㅠㅠ 어무니
이게 무슨 말인고 하니 정리하자면
원래 spi 통신에서 slave로 잡히는 쪽은 cs핀이 HIGH 일 때 MISO 핀이 Hi-Z 상태가 되어야 하는 것이 맞다. 그러나 다른 모듈의 하드웨어 회로, 또는 microSD 장치의 문제로 인해서 cs핀이 HIGH임에도 불구하고 MISO가 이상하게 Hi-Z로 안빠지는 것!
TFT-LCD의 경우 MISO핀을 3-State Buffer로 잡아놨는데 아마 이것은 3.3V를 5V로 Level-shift 할려고 했던것 같다. 운좋게도 저기 1번핀이 /OE 핀인데 Active Low 라서 GND에 물려 있는상태... 이것을 바로 SD_CS에 물리면 서로 딱 맞아 떨어지는 천의 운이!!! (설마 TFT-LCD 설계자가 이것을 염두에 두고!?)
어쨋든 작은 패키지의 IC를 띄고 저 핀을 막은다음 SD_CS 핀으로 점퍼선을 날렸다.
확대해서 보이나 모르겠지만 포스트잇 작게짤라서 1번픽 막고 점퍼선 날림 ㅎㅎ
이후에 해봤는데 이건 MISO 핀을 원천적으로 SD_CS에 맞게 Hi-Z로 바꾸다 보니 어떤 microSD를 사용하건 상관 없다는 것~~
혹시나 나같은 고민을 하던 분에게 도움이 되길 바라고~
이후 SD카드에서 이미지를 여러번 읽다가 오류나면 아래 블로그 참조 하시길!
http://forum.arduino.cc/index.php?topic=168131.0
모두들 화이팅!