 안녕하세요. 이광이는 i2c 통신에 대한 이론설명과 sdm32 cube mx와 sdm32 일자로 뉴클리어 보드를 이용한 실습을 통해 i2c를 쉽게 이해할 수 있도록 하기 위해 제작되었습니다. 본광이 앞서 사전 준비 상황에 대해 알아보도록 하겠습니다. 우선 sdm32mchu의 초기와 식코드를 생성할 수 있는 sdm32 cube mx를 설치해야 합니다. sdm32 cube mx는 st홈페이지에서 다운로드할 수 있으며 사용 방법은 st홈페이지에서 유저 미니오를 참가하거나 유튜브에서 cube mx 게이링 스타티드, cube mx 펌웨어 패키지를 검색하여 참고하시면 됩니다. 두번째로 이광이 실습은 sn321503 뉴클리어 보드를 사용합니다. 해당 보드는 st홈페이지에서 저리만 가격에 구입하실 수 있습니다. 마지막으로 k컴파일러를 설치합니다. k컴파일러는 Cortex-M0, M0 플러스 기반의 stmchu 즉 sdm32f0, L0을 대해 시간 또는 용량 제한 없는 무료 라인세스를 제공하고 있으며 보시는 경로에서 다운로드 할 수 있습니다. 앞서 설명들이 이 3가지 상의들과 함께 i2c 실습을 진행하게 됩니다. 이번 장에서는 본격적으로 i2c에 대한 이론부터 학습해 보도록 하겠습니다. 참고로 이광이의 프리젠테이션은 i2c 스페셉페케이션 리비전 6.0 버전과 sm321053 레퍼런스 메뉴를 바탕으로 만들어졌습니다. i2c는 1982년대 초 필립스 반도체 현재 nxp에서 개발된 징역버스입니다. 클럽과 데이터 두 라인으로 연결된 마스터와 슬레이브로 구성되어 있고 연결된 각각의 디바이스들은 7비트 또는 10비트의 고율 주소를 가지고 있어 같은 버스상의 여러 장치들의 독립적인 접근이 가능합니다. 또한 2개 이상의 마스터가 동시에 데이터를 전송할 경우 데이터 충돌이 발생하는 것을 방지하기 위해 충돌을 검출하고 중지하는 멀티마스터 방식을 가집니다. i2c의 통신속도는 스탠다드 모드는 100kbps 패스트 모드는 400kbps 패스트 모드 플러스는 1MBps 그리고 하이스피드 모드는 3.4MBps를 지원합니다. 참고로 sm32mcu는 디바이스에 따라 최대 패스트 모드 플러스까지 지원합니다. i2c와 관련된 용어들을 잠시 살펴보자면 데이터를 버스에 실어 보내는 디바이스를 트랜스미터 버스로부터 데이터를 받는 디바이스를 리시버라 칭합니다. 그리고 앞서 언급한 전송 초기와 클럭 신호 생성 그리고 전송을 종료시키는 역할을 하는 마스터와 7비트 또는 10비트의 고율 주소를 가지고 있어 마스터로부터 보내진 주소에 의해 인식되는 슬레이브로 구성되고 하나 이상의 마스터가 메시지 충돌 없이 동시에 버스 제어를 시도하는 것을 멀티마스터라 하며 멀티마스터로 보장하기 위한 절차를 아비스테레이션 즉 중재라 합니다. 그리고 두 개 또는 그 이상의 디바이스의 클럭 신호를 동기하기 위한 절차를 싱크롬 나이제이션 즉 동교하라 합니다. 다음은 i2c의 카드웨어 구성이 되어 알아보도록 하겠습니다. i2c는 데이터라인 sda와 클럭라인 scl로 구성되어 있으며 두 라인은 모두 프로으로 연결되어야 합니다. 프럽장의 값은 버스캐빅스턴스, VDD, 버스스피드 값을 가지고 계산할 수 있으며 버스캐빅스턴스에 따라 프럽장의 최대 값이 제한되는데 이것은 스펙이 명시된 버스의 라이즈 타임 때문입니다. 프럽장에 대한 자세한 상황은 i2c 스페셉 피케이션의 프럽 리스토 사이징 섹션에서 확인할 수 있습니다. 그리고 경우에 따라 하이 볼테지 스파크 오버 슈트에 대한 보호를 위해 시리즈 정을 연결하여 사용하기도 합니다. 아래는 i2c 구성에 대한 예를 볼 수 있습니다. 이번 장에서부터 i2c 프로토컬에 대해 알아보도록 하겠습니다. 앞서 설명드린 바와 같이 i2c의 데이터와 클럭라인은 프럽장을 통해 전원에 연결되어 있으므로 버스에 어떤 신호가 없는 상태에서는 두 라인 모두 하이 상태를 유지합니다. 그리고 데이터라인과 클럭라인이 로인지 하이 인지를 결정하는 로징 레벨은 응결된 VDD에 따라 달라지게 되는데 VDD의 70% 이상의 레벨에서는 하이 VDD의 30% 이하의 레벨에서는 로로 인식하게 됩니다. 데이터가 유효성을 가지기 위해서는 데이터라인 상의 데이터는 클럭이 하이 상태일 동안은 안전적인 상태를 유지해야 하고 데이터라인이 하이 또는 로 상태로 뱅류되는 것은 오직 클럭라인 상의 클럭 신호가 로일때만 가능합니다. i2c의 모든 데이터 정성은 스타트 시그널에서 시작해서 스탑 시그널에서 종료됩니다. 스타트 컨디션은 클럭라인이 하이 상태일 때 최초 데이터라인이 하이에서 로로 뱅류되는 시점을 말하며 스타트 컨디션은 클럭라인이 하이 상태일 때 마지막 데이터라인이 로에서 하이로 뱅류되는 시점을 말합니다. 이 스타트와 스타트 컨디션은 항상 마스터 위에 생성되며 스타트 컨디션 이후 버스는 BG상태가 되고 스타트 컨디션 후에 버스는 일정시간 뒤 프리 상태로 가죽됩니다. 그러나 스타트 컨디션 대신 리피티드 스타트 신호가 생성되면 버스는 여전히 BG상태를 유지하게 됩니다. i2c의 모든 데이터는 한 바이트 즉 8비트로 구성되어 있습니다. 그리고 한 번 전송시 전송 가능한 바이트 수는 제한이 없습니다. 각 바이트에는 1비트의 에큐널러지 비트가 뒤따라 오게 되며 각각의 데이터는 MSB가 먼저 전송됩니다. 그리고 데이터 전송 중 슬레이브가 다른 기능을 수행하기 위해 완전한 데이터를 수신 또는 송신할 수 없는 경우 대기상태의 마스터를 강제로 클럭라인을 로 상태로 유지할 수 있으며 그런 다음 슬레이브가 클럭라인을 해제하고 데이터 전송이 준비가 되었을 때 데이터 전송을 계속 진행할 수 있습니다. 이것은 클럭 스트레칭이라 합니다. 이 장에서는 앞서 잠시 언급한 i2c 데이터 폼의 중 에크와 또 다른 신호인 라데크에 대해 설명해 드리도록 하겠습니다. 앞서 설명드린 바와 같이 모든 데이터의 바이트 뒤에는 에크 비트가 뒤따라게 됩니다. 이 에크 비트는 수신된 데이터바이트가 성공적으로 수진되고 다른 데이터바이트가 전송될 수 있는지에 대한 신호를 트랜스미터로 전송하는 비트이고 마스터는 에크에 대한 아웃번째 클럽버스를 포함한 모든 클럭을 생성하게 됩니다. 트랜스미터는 에크 클러퍼리스 즉 스타트 컨디션 신호 후 아웃번째 클럭라인을 하의 상태 동안 데이터라인을 해제하여 리시버가 데이터라인을 안정적으로 로 상태가 될 수 있도록 합니다. 참고로 이때 안정적인 로 상태를 만들기 위해 i2c의 셋업타임과 홀드타임이 고려되어야 합니다. 라데크의 경우 라데크가 발생했을 때 마스터는 전송을 중단하기 위해 스타트 컨디션 또는 새로운 전송을 시작하기 위한 리피티스 스타트 컨디션을 생성할 수 있습니다. 라데크가 생각되는 조건으로는 에크를 보낼 디바이스가 없는 경우 리시브가 어떤 실시간 기능을 수행 중이거나 마스터와 통신을 시작할 준비가 되지 않아서 송신 또는 수신할 수 없는 경우 전송중 리시버가 이해할 수 없는 데이터 또는 커맨드를 받는 경우와 더 이상의 데이터바이트를 받을 수 없는 경우 마스터 리시브가 슬레이브 트랜스 밑에 전송의 끝을 교기하기 위한 경우로 볼 수 있습니다. 이 장에서는 데이터 프로토코를 확인해 보도록 하겠습니다. i2C 디바이스 어드레스가 7비트 로 되어 있는 경우 스타트 컨디션 후 7비트 슬레이브 어드레스가 보내지고 8번째 비트는 데이터 전송 방향 즉 리드 또는 라이트를 의미하는 디렉션 비트가 뒤따르게 됩니다. 이 디렉션 비트는 0이면 전송 즉 라이트를 나타내고 1이면 요청 즉 리드를 나타냅니다. 앞서 언급한 바와 같이 데이터 전송은 항상 마스터 의해 생성된 스타트 컨디션에 의해 종료되며 마스터가 여전히 통신하기로 원한다면 스타트 컨디션을 생성하지 않고 리피티드 스타트 컨디션을 생성하고 슬레이브의 주소를 쓰게 됩니다. 다음은 데이터 전송 포맷입니다. 이 포맷은 슬레이브가 7비트의 주소를 갖고 있는 경우이며 마스터가 슬레이브로 데이터를 전송하는 포맷입니다. 보시는 것과 같이 마스터는 스타트 컨디션을 생성 후 슬레이브 주소와 함께 드레이션 비트가 0이 되어 전송하게 되면 슬레이브는 에크로 마스터 에 응답하게 되고 마스터는 바이트 데이터를 전송하고 슬레이브는 바이트마다 에크도는 경우에 따라 나데크를 응답하게 되며 전송이 완료되거나 나데크 발생 시 스타트 컨디션을 생성하여 통신을 종료하게 됩니다. 이 포맷은 마스터가 슬레이브로부터 데이터를 받는 즉 데이터를 읽어드리는 경우에 대한 포맷입니다. 이전과 차이점은 디렉션 비트가 1이 되고 어드레스와 디렉션 비트는 마스터가 슬레이브로 전송함으로 슬레이브가 에크로 응답하지만 바이트 데이터는 슬레이브에서 마스터로 전송되므로 전송된 바이트 데이터에 대해 마스터가 에크도는 나데크로 응답하게 됩니다. 이 포맷은 바이트 데이터 전송 후 마스터가 여전히 전송을 지속시키기 위해 스타트 컨디션이 아닌 랩피티즈 스타트 컨디션을 생성한 경우로 랩피티즈 스타트 컨디션 생성 후 슬레이브 어드레스와 디렉션 비트를 다시 전송하고 데이터를 쓰거나 읽게 됩니다. P강에서는 언급한 바우 같이 sdm31053을 사용하여 실습하기 때문에 간략하게 sdm31053의 i2-C 인트페이스를 설명하자면 우선 i2-C 스페셜플리케이션 리비전 버전 3과 호원합니다. 이는 앞서 설명드린 i2-C 버스 특징들을 모두 포함하고 있습니다. 슬레이브 도는 마스터모드로 동작하며 월티마스터를 지원하고 최대 1MHz의 패스 모드 플러스를 지원하며 설정에 따라 채빌트 도는 10피트의 주소를 가질 수 있고 셋업 및 폴드 타임을 조절하여 설정할 수 있습니다. 그리고 dma와 함께 1바이트 버퍼를 가지고 있으며 아날로그 및 디지털 롤제에 대한 필터를 레이스터를 통해 설정 가능하고 sm버스 pn버스 아키텍처 표준 역시 지원됩니다. 위에 sdm31053 i2-C 특징 및 자세한 상은 sd홈페이지에서 sdm31053 레퍼런스 메뉴가 데이터 시트를 참고해 주시기 바랍니다. 지금부터 i2-C 실습을 해보도록 하겠습니다. 이번 i2-C 실습은 sdm31053 니콜레어 모드에서 i2-C1은 마스토로 i2-C2는 슬레이브로 설정하여 하나의 MCU에서 두 개의 i2-C 블록을 사용하여 i2-C 인터넷 방식으로 데이터를 주고받는 룩북백 형태의 예제를 구현해 보도록 하겠습니다. 예제를 코디하기 앞서 니콜레어 모드상의 하드웨어 구정을 먼저 합니다. i2-C1의 글라 포트 b의 6번핀과 i2-C2의 글라 포트 b의 10번핀은 연기라고 i2-C1의 데이터 포트 b의 7번핀과 i2-C2의 데이터 포트 b의 11번핀을 연결하게 되면 하드웨어 구성은 완료됩니다. 먼저 설치한 sm32 큐브 mx를 진행합니다. sm32 큐브 mx를 진행하면 먼저 웰컴 페이지가 열리는데 좌측하다는 뉴 프로젝트를 클릭합니다. 다음으로 뉴 프로젝트 창이 나타나면 보드 셀렉터 탭에서 sm32l-053 니콜레어 보드를 선택합니다. 핀아웃 뷰의 선택한 보드의 MCU와 MCU의 핀아웃 상태가 그립컬하게 나타납니다. 좌측 ip3에서 i2-C1과 i2-C2를 활성합니다. i2-C1을 활성하면 핀아웃 뷰에서 i2-C1과 2에 매칭되는 핀이 활성화된 것을 볼 수 있습니다. 다음은 클라 컴피고레이션 탭으로 가서 클라 소스를 설정합니다. 뉴 클레어 보드는 외부 오실레이터를 포함하지 않으므로 내부 클라 소스 hi를 사용하여 시스템 클라 16mh를 주로 설정합니다. 클럽 설정이 완료되면 컴피고레이션 탭으로 가서 i2-C пар아메터들을 설정합니다. 먼저 라스트인 i2-C1 컴피고레이션을 클릭하면 i2-C1의 기본 동작을 위한 파라메터를 설정할 수 있는 창이 열립니다. 파라메터 설정 창에서 i2-C1 타이밍 설정을 할 수 있는데 이 타이밍 파라메터들은 i2-C 통신 속도를 설정하고 MCU와 연결된 다양한 디바이스들에 대해 유연한 데이터 존송을 제공하기 위해 데이터 세더타임과 홀드타임을 지정하기 위한 라이징타임, 포맹타임을 조절하고 아날로그 필터와 디지털 필터를 설정할 수 있습니다. 이 파라메터들에 대한 자세한 상은 랩포런스 메뉴얼 또는 어플리케이션 노트를 참고하시기 바라며 이시드스 배서는 마스터의 모든 파라메터 설정들은 기본 설정으로 합니다. 다음은 앞서 언급한 바와 같이 인트랍터 방식으로 통신하기 위해 NVIC 탭으로 가서 i2-C1 인트랍터를 활성합니다. 다음은 i2-C2 컴피고레이션을 클릭하여 슬레이브 피처를 설정합니다. 타이밍 설정은 마스터와 동일하게 기본 설정으로 두고 슬레이브 피쳐에서 슬레이브 주소를 지정합니다. 이번 칠습에서는 7비트의 0x7f를 주소를 지정합니다. 여기서 주의해야 할 점은 7비트 주소 지정시 생성된 코드상의 슬레이브 주소 값은 한 비트 shift 대여 생성됩니다. 그리고 마스터와 동일하게 NVIC 탭에서 인트랍터를 활성합니다. 그리고 코드를 생성해줍니다. 코드 생성 시 캐리 컴팔러를 사용하기 위해 툴체는 MDK 안 버저바이브로 지정하는 생성합니다. 어픈 프로젝트를 클릭하면 캐리 컴팔러가 생성된 코드와 함께 심행됩니다. 조화적 프로젝트들이의 칼, 시스템, 유저 파일들이 생성된 것으로 확인할 수 있습니다. 매일 1.c 파일을 열면 SM32QVMX에서 설정한 시스템 클럽, i2-C, GPI 등의 한수들이 생성된 것으로 확인할 수 있습니다. 지금부터 본격적으로 코드를 작성합니다. 먼저 마스터와 슬레이브의 TS 버퍼를 생성하고 생성한 버퍼를 전송할 데이터를 지정합니다. 그리고 TS 버퍼를 Rx 버퍼를 마스터와 슬레이브 각각 생성해줍니다. 그리고 슬레이브 어드레스를 디파인해줍니다. 앞서 언급한 바와 같이 생성된 슬레이브 어드레스는 한 비트 시푸드 대여 생성됨으로 한 비트 시푸드 된 값으로 지정합니다. 다음은 유콜레보드상의 프론색 버튼을 누르면 통신이 시작할 수 있도록 프론색 버튼과 매친되는 GPI 욕비니 로우 상태가 될 때까지 기다리는 룩부를 생성합니다. Rx, i2-C, 마스터 트랜스 및 IT 암수로 사용하여 마스터가 슬레이브로 데이터를 전송합니다. 이 암수는 마스터의 TS 데이터를 스토에 전송할 데이터가 쓰여질 때마다 흔드럽다가 발생하게 됩니다. 그리고 Rx, i2-C, 슬레이브 리시브 IT 암수로 사용하여 마스트로부터 전송된 데이터를 받습니다. 이 암수는 슬레이브의 Rx, 데이터를 스토에 전송받은 데이터가 쓰여질 때마다 흔드럽다가 발생하게 됩니다. 마스터에서 슬레이브로 데이터 전송이 완료되면 Rx, i2-C, 게스트 에이터 암수로 사용하여 i2-C 상태를 확인합니다. 다음은 Rx, i2-C, 슬레이브 트랜스 및 IT 암수로 사용하여 슬레이브가 마스트로 데이터를 전송합니다. 그리고 마스터는 Rx, i2-C, 마스터 리시브 IT 암수로 사용하여 슬레이브로부터 데이터를 전송받습니다. 이전과 마찬가지로 전송이 완료되면 Rx, i2-C, 게스트 에이터 암수로 사용하여 i2-C의 상태를 확인합니다. 마지막으로 뉴클레어보드 상의 LED를 톡을 하여 전송이 완료된 것을 확인할 수 있도록 합니다. 이제 작성이 완료된 코드를 빌드합니다. 빌드가 완료되면 뉴클레어보드의 코드를 프로그램을 합니다. 프로그램이 완료되면 i2-C가 정상적으로 동작하는지 확인하기 위해 디보기 모드를 활성화합니다. 디보기 모드에서 통신이 완료된 적점 위치의 브레이크 포인트를 설정하고 코드를 실행합니다. 뉴클레어보드 상의 프론셉 버튼을 누르면 통신을 시작하고 통신이 완료되면 우측에 보시는 것과 같이 마스터와 슬레이브의 Rx 버프의 전송된 TX 데이터가 정상적으로 전송된 것을 확인할 수 있습니다. 지금까지 S3E CUBE MS를 활용하여 S3E MCU의 i2-C 인터페이스를 학습하는 시간을 가지고 왔습니다. 시청해주셔서 감사합니다.