 안녕하세요. 이 동영상 강의는 SM32 큐브 MX를 사용하여 SM32 MCO 페르페를들의 간단한 예제를 구현해 봄으로써 동작을 쉽게 이해할 수 있도록 하기 위해 제작되었습니다. 그리고 SM32 큐브 MX2과 SM32 레퍼런스 보드를 사용하여 SPI 인터페이스의 데타를 주고받는 동작을 구현해 보는 시간을 갖도록 하겠습니다. 우선 SPI 통신을 구현해 보기 전에 이 강의에서 필요한 사전 준비 상황에 대해 알아보겠습니다. 이번 동영상 시습에는 기본적으로 SM32 큐브 MX2가 라이브러리 SM32-1053 뉴클레어 보드 그리고 암에서 제공하는 케일 컴파일러를 사용합니다. 첫 번째로 SM32 큐브 MX2를 설치해야 합니다. 이 툴은 SM32 MCO 초기한 C 코드를 생성할 수 있는 툴로 설치 파일과 창고 자료는 ST 홈페이지에서 다운로드 할 수 있으며 유튜브에서 아래의 링크 또는 이름으로 검색하면 한국어로 쉽게 설명된 SM32 큐브 MX2 사용 방법 동영상을 볼 수 있습니다. 두 번째로 이번 동영상 강의에서는 SM32-1053 뉴클레어 보드를 사용합니다. SM32 뉴클레어 보드는 ST 홈페이지에서 저렴한 가격에 구입할 수 있으며 유조메뉴 역시 다운로드하여 볼 수 있습니다. 창고로 반드시 SM32-1053 뉴클레어 보드를 사용할 필요는 없습니다. 이 동영상을 창고하여 다른 STM32 MCO 기반의 보드에서도 쉽게 응용하여 사용하실 수 있습니다. 세 번째로 이 동영상 강의에는 K컴파일러를 사용할 예정입니다. K컴파일러를 사용하는 이유는 COTX-M0 기반의 STM32 MCO 즉 STM32-F0, STM32-L0 MCO는 라이센서로 무료로 제공하고 있어 시간 또는 용련 제한 없이 무료로 컴파일러를 사용할 수 있습니다. 그럼 실습에 앞서 간략하게 SPI 통신에 대해 알아보도록 하겠습니다. SPI를 모토롤에서 개발된 FHD 플래스 통신 즉 데이터 송신과 수신을 동시 존송이 가능한 동기통신 규육입니다. 그리고 마스터 슬레이브 방식으로 동작하며 하나의 마스터와 하나 이상의 멀티슬레이브가 연결되는 구조로 가지고 마스터에서 출력되는 클락에 의해 동기화되는 징률통신 방식입니다. SPI의 구성은 그림에서 볼 수 있듯이 클러, MOSI, MISO, 칩셀렛핀으로 구성된 4개의 신호 4와이어로 구성되어 있으며 경우에 따라 3와이어, 2와이어로도 사용 가능합니다. STM32-L0 MCO의 SPI 특징으로는 설정에 따라 마스터 또는 슬레이브 모드로 동작하며 FHD 플래스, HHD 플래스, 심플래스로 구성하여 동작 가능합니다. 그리고 8B 또는 16B로 전성 프레임 포맷을 설정할 수 있으며 SPI Shift Racer가 MSB를 먼저 Shift할지 LSB를 먼저 Shift할지를 결정할 수 있습니다. 또한 SPI 클락 폴라로티와 페이저를 Ctrl Racer에 설정할 수 있습니다. SPI 클락 폴라로티와 페이저를 좀 더 설명해 보도록 하겠습니다. 클락 폴라로티와 페이저, 즉 SPI가 아이들 상태일 때 클락의 글성을 하이로 알지 로로 알지를 나타내는 클락 폴라로티와 SPI에서 전성된 첫 번째 데이터를 SPI 클락의 아이들 상태에서부터 첫 번째 일지에서 캡쳐할지 두 번째 일지에서 캡쳐할지를 결정하는 클락 페이저를 설정할 수 있습니다. 이 폴라로티와 페이저로 신호를 서로 송신하는 프로토커를 조절할 수 있으며 조합에 따라 4가지 방식의 데이터 캡쳐 클락 일지를 선택할 수 있습니다. 페이저가 1일 때 폴라로티가 1인 경우 0인 경우 페이저가 0일 때 폴라로티가 1인 경우 0인 경우입니다. 간략하게 페이저가 1인 경우에 대해서 설명하자면 SPI가 이내불된 후 클락은 아이들 상태가 되는데 폴라로티가 1이면 클락 하이 상태가 아이들이 되고 페이저가 1이기 때문에 아이들 상태에서부터 첫 번째 볼링했지 두 번째 라이징 엣지에서 데이터를 캡쳐하게 되고 폴라로티가 0이면 클락 로우 상태가 아이들이 되고 동일하게 페이저가 1이기 때문에 아이들 상태에서부터 첫 번째 라이징 엣지 두 번째 볼링 엣지에서 데이터를 캡쳐하게 됩니다. 이외 SM3210의 특징들에 대한 자세한 상은 ST 홈페이지에서 SM3210의 레퍼런스 메뉴를 검색하여 확인하시기 바랍니다. 그럼 지금부터 SM32 큐브 MX를 사용하여 SPI 루프 백을 구인해 보도록 하겠습니다. 먼저 설치한 SM32 큐브 MX2를 실행하여 U 프로젝트를 클릭하여 프로젝트를 생성합니다. U 프로젝트 창에서 보드 셀렉터 탭을 클릭하며 ST에서 제공하는 보드 리스트가 나오는데 이 중에서 이번 실습에서 사용할 SM321053 루콜레이어를 선택하여 프로젝트를 생성합니다. SPI 루프 백을 구인하기위하여 좌척 핀아웃 리스트에서 SPI-1과 SPI-2를 설정해야 합니다. 우선 SPI-1은 송신과 수신이 가능한 마스토로 사용하기위해 풀 두플렉스 마스토로 설정하고 SPI-2는 송신과 수신이 가능한 슬레이브로 사용하기위해 풀 두플렉스 슬레이브로 설정합니다. SPI-1과 툴을 설정하려면 핀아웃 위에서 SPI 클락, MOSI, MOSO-V이 할당된 것을 확인할 수 있습니다. 이 SPI 루프 백 예전은 1대1 통신임으로 칩셀렉트 P는 사용하지 않도록 하겠습니다. 다음은 클락 컴피그레이션 탭에서 MCO의 클락을 설정합니다. 유클레어보드는 기본적으로 외부 오실레이터를 포함하지 않으므로 이번 강에서는 간단하게 HSI 내부클락 16MHz를 사용하도록 하겠습니다. 참고로 SPI-1 패르페럴은 APB-2를 SPI-2 패르페럴은 APB-1을 통해 클락이 인가됩니다. 다음은 컴피그레이션 탭에서 SPI-1 초기화 파라메터 값들을 설정합니다. 먼저 마스터인 SPI-1을 클릭하면 이전에 응급한 프레임 포맷, 데이터사이즈, 폴라라틱, 페이즈 등 SPI-1을 초기화하는 설정창이 활성화되고 여기에서 구현하고 오지 않은 어플리키션의 사용 용도 및 환경에 따라 설정할 수 있습니다. 참고로 클락 파라메터의 브레이트는 SPI-1 패르페럴이 인가되는 APB-2 클락에서 SPI-1 패르페럴 레브의 프리스클로 설정에 따라 결정되는 값입니다. 이번 SPI-6Pack 예전은 기본 설정과 동일하게 설정합니다. 각 파란 내용 역시 레퍼런스 메뉴에서 확인해 주시기 바랍니다. 다만 SPI 통신은 폴링 방식, 인트럽터 방식, DMA를 사용하는 방식으로 구현할 수 있는데 이번 예전은 DMA를 사용하여 구현해 보도록 하겠습니다. DMA를 사용하기 위해 DMA 탭에서 SPI-TX-RX에 대한 DMA를 추가해 주며 적절한 DMA 채넘이 기본 업세스의 디렉션이 설정되고 DMA의 우선 순위를 선택할 수 있으며 아래는 SPI-TX-RX에 대한 DMA 루키스트 설정을 지정해 줄 수 있습니다. 이번 실습은 기본 설정과 동일하게 사용합니다. 다음에는 SLAVE SPI-2를 설정합니다. SPI-2를 클릭하여 파라메터를 설정하게 되는데 데이터 사이즈, 프라스티빗, 클라퍼라 러틱 페이지 모드, 마스터와 동기하를 위해 동일하게 설정하고 SPI-1과 같이 DMA를 추가해 줍니다. 여기까지 SPI-MASTER와 SLAVE의 초기화 설정이 완료되었습니다. 설정이 완료되었으면 코드를 생성합니다. 상단 메뉴바의 프로젝트에서 GENERATE 코드를 선택하여 프로젝트 이름과 코드 생성 경로를 지정하고 설치되어 있는 Tool Chain을 지정합니다. 사전에 K를 설치하였으므로 MDK, ANP5, KTool Chain을 선택합니다. 오픈 프로젝트를 선택하여 생성된 코드를 확인합니다. 생성된 코드에서 SPI-1 초기화 함수로 가보면 STM32 CUBE MX에서 설정된 초기화 값들을 확인할 수 있습니다. SPI-2 역시 초기화 값들이 생성되는 것으로 확인할 수 있습니다. 공격적으로 코드를 작성하기 전에 먼저 하드웨어를 다음과 같이 구성합니다. STM32 CUBE MX에서 PIN을 구성하는 것을 참고하여 보드상에서 하드웨어를 구성해줍니다. 뉴클레오 보드상에서 SPI-MASTER와 슬레이브 간의 CLOCK, MOSI, MYSO를 연결해줍니다. 그런 다음 PC와 인결합니다. 지금부터 MASTER와 슬레이브 간의 통신을 위해 코드를 작성해 보겠습니다. 먼저 MASTER와 슬레이브의 TX 버퍼를 생성해 주고 전송할 데이터를 작성합니다. 그리고 TX의 버퍼의 사이즈를 계산하여 정의해 줍니다. 다음 MASTER와 슬레이브의 TX 버퍼를 정의된 TX 버퍼 사이즈만큼 생성해 줍니다. 그런 다음 메인문으로 가서 데이터를 주고받기 전에 뉴클레오 보드에 버튼을 누르면 데이터 전송을 시작할 수 있도록 버튼 이벤트를 폴링으로 체크하는 루프를 추가해 줍니다. 버튼을 누르면 MASTER에서 전송한 데이터를 DMA를 통해 슬레이브의 TX 버퍼에 받을 수 있도록 HAL-SPI-RECEIVE-DMA 함수로 사용하여 슬레이브-SPI-2-RECEIVE를 활성화 합니다. 그리고 MASTER-SPI-1은 DMA를 통해 MASTER-TX 버퍼에 있는 데이터를 HAL-SPI-TRANSMIT-DMA 함수로 사용하여 전송합니다. MASTER에서 슬레이브로 데이터 전송이 완료된 것으로 확인하기 위해 SPI 상태를 체크합니다. 다음은 슬레이브에서 MASTER로 데이터를 전송하기 위한 코드를 작성합니다. 슬레이브는 슬레이브의 TX 버퍼에 있는 데이터를 MASTER-RS 버퍼에 전송하기 위해 HAL-SPI-TRANSMIT-DMA 함수를 사용하여 데이터를 전송합니다. 다음 슬레이브가 DMA를 통해 전송한 데이터를 받을 수 있도록 MASTER는 HAL-SPI-RECEIVE-DMA 함수로 사용하여 리시브를 활성화 합니다. 이중과 같이 슬레이브에서 MASTER로 데이터 전송이 완료된 것으로 확인하기 위해 SPI 상태를 체크해줍니다. 마지막으로 MASTER에서 슬레이브로 슬레이브에서 MASTER로 데이터 전송이 완료된 것으로 확인하기 위해 두클레어 보드에는 LED를 사용하여 검증해줍니다. 여기까지 코드 작성이 완료되었습니다. 작성된 코드를 빌드합니다. 빌드가 완료되었으면 코드를 보드에 프로그램합니다. 프로그램이 완료되며 디버깅을 통해 SPI가 정상적으로 통신해야 하는지를 확인해 보도록 하겠습니다. 디버깅 모드로 활성화하여 통신이 완료된 지점에 브레이크 포인트를 지정하고 코드를 실행합니다. 코드 상에 구현한 대로 뉴클레어 보드 상의 프론셋 버튼을 누르면 SPI 통신을 시작합니다. 우측에는 MASTER와 슬레이브 RS 버퍼에 MOSI MISO를 통해 데이터가 정성적으로 전송된 것으로 확인할 수 있습니다. 지금까지 SM32MCU의 SPI 통신을 간단하게 구현해 보았습니다. 시청해 주셔서 감사합니다.