• 전체강좌

    [WAD-MX6W] Windows 10 IoT Core에서 SPI 테스트하기

    twitter facebook

    안녕하세요? 러찌입니다.


    이번 시간에는 Windows 10 IoT Core OS가 실행된
    WAD-MX6W 보드에서 SPI를 테스트해 보았습니다.


    SPI는 Serial Peripheral Interface의 약어이고,
    UART, I2C와 마찬가지로 가장 많이 사용하는

    시리얼 통신 방식중 하나입니다.


    SPI는 SCLK, MOSI, MISO, CS의 4개 핀으로 구성되어 있고,
    Master 디바이스와 Slave 디바이스로 구분되며,
    SCLK 핀을 이용해 데이터를 동기화 합니다.


    그리고 Master 디바이스는 CS(Chip Select)를 이용해
    제어하고자 하는 Slave 디바이스를 선택할 수 있습니다.


    Master로 설정된 디바이스는
    MOSI(Master Output Slave Input) 핀을 통해 데이터를 Write하고,
    MISO(Master Input Slave Output) 핀을 통해 데이터를 Read합니다.
    Slave로 설정된 디바이스는

    Master의 동작과 반대로 데이터를 Write / Read하게 됩니다.


    i.MX6 Quad CPU는 총 5개의 SPI를 지원합니다.


    WAD-MX6W 보드는 CPU가 지원하는 SPI를 이용해서
    SPI-NOR Flash, DMB 등과 같은 주변 디바이스들과
    통신할 수 있도록 설계되었습니다.


    그리고 사용자가 원하는 주변 장치와 쉽게 통신할 수 있도록,
    별도로 SPI를 위한 Extension Interface를 제공합니다.


    WAD-MX6W 보드는 Windows 10 IoT Core OS를 지원합니다.
    그리고 Windows 10 IoT Core용 WAD-MX6W BSP는

    SPI 디바이스 드라이버를 제공합니다.


    SPI 드라이버가 잘 동작되는지 확인하기 위해

    아래 캡쳐된 사진과 같이 WAD-MX6W 보드의

    Extension Interface를 통해, RFID 모듈을 연결하고

    SPI 통신을 테스트 해보았습니다.




    테스트한 RFID 모듈은 RC522 입니다.
    RFID 태그를 이 모듈에 접촉시키면

    태그의 ID를 읽을 수 있습니다.


    RC522 모듈 동작은 아래 영상을 보시면 아시겠지만, 잘 동작됩니다.


    어플리케이션 소스는 RFIDDemo 라는

    프로젝트를 이용하여 테스트하였습니다.


    소스 코드에 대한 동작 설명은 다음과 같습니다.
    ----------------------------------------------------------------------------------------------

    namespace RFIDDemo
    {
        public sealed partial class MainPage : Page
        {
            private Mfrc522 mfrc;
            ThreadPoolTimer _clockTimer = null;

            public MainPage()
            {
                this.InitializeComponent();
               
                // 이 함수에서 RC522 모듈을 초기화 합니다.
                InitRC522Async();
               
                // 1초마다 _clockTimer_Tick 함수가 호출되도록 ThreadPoolTimer 클래스를 이용하여 만듭니다.
                _clockTimer = ThreadPoolTimer.CreatePeriodicTimer(_clockTimer_Tick, TimeSpan.FromMilliseconds(1000));
            }


            private async void InitRC522Async()
            {
                // RC522 Class 인스턴스를 만듭니다.
                mfrc = new Mfrc522();
               
                // RC522 모듈을 Reset하고, 사용할 SPI 인덱스, 속도, Chip Select, Mode등의 초기화 작업을 합니다.
                await mfrc.InitIO();
            }

            private void ReadRFID()
            {
                while (true)
                {
                    // RFID 태그가 인식되면
                    if (mfrc.IsTagPresent())
                    {
                        // RFID 태그의 ID를 읽어옵니다.
                        var uid = mfrc.ReadUid();
                       
                        // 여기에 uid를 이용해서 특정 동작을 수행하면 됩니다.


                        // RFID 태그의 동작을 중지합니다.
                        mfrc.HaltTag();
                    }
                    else
                    {
                        // RFID 태그가 존재하지 않으면, 아래와 같이 없다는 메세지를 UI에 보여줍니다.
                        var task = Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => {
                            ledEllipse.Fill = grayBrush;
                            RFIDStatus.Text = "Waiting RFID Access.";
                        });
                    }
                    break;
                }
            }

            private void _clockTimer_Tick(ThreadPoolTimer timer)
            {
                // 1초마다 ReadRFID 함수를 호출합니다.
                ReadRFID();
            }

        }
    }

    ----------------------------------------------------------------------------------------------

    여기까지가 샘플 소스의 내용입니다.


    여기서는 간단히 SPI 동작에 대한 설명만 드렸습니다.
    RC522 클래스에 대한 내용까지 확인하면 조금 복잡할 수 있겠지만,
    하나씩 분석해 보시면 이해하시는데 어렵지 않을 것입니다.


    지금까지 Windows 10 IoT Core OS가 실행되는

    WAD-MX6W 보드에서 SPI 동작에 대해 알아 보았습니다.


    그럼 이번 글은 여기서 마치도록 하겠습니다.


    아래는 관련 영상입니다.

    꼭 한번씩 봐주시면 감사하겠습니다.



    * 아래는 저희가 운영하는 페이스북이며, 한번씩 방문해 주시면 감사하겠습니다.
       https://www.facebook.com/wearedev1


    * 유튜브 채널 구독 부탁 드립니다. 아래 주소에 가시면 쉽게 하실 수 있습니다.
       https://www.youtube.com/channel/UCZuDcO4s6m8lt916Nj5SjcA