티스토리 뷰

마이크로 컨트롤러와 주변 장치 (peripheral devices) 간의 연결 및 통신을 위해 널리 사용되는 통신 프로토콜인 CAN (Controller Area Network), SPI (Serial Peripheral Interface) 와 I2C (Inter-Integrated Circuit) 에 대해 알아보자.

  1. CAN (Controller Area Network)
    : CAN 은 자동차, 산업 및 의료용 애플리케이션에 여러 장치를 연겨랗기 위해 자주 사용되는 강력한 저속 통신 프로토콜이다. 특히 열악한 환경에서의 신뢰성으로 잘 알려져 있다.
    1. Features
      1. Multi-Master Capability
        : bus가 여유가 있을 때 네트워크의 모든 디바이스가 메시지를 보낼 수 있다.
      2. Broadcast Communication
        : 모든 장치가 모든 메시지를 수신하지만 관련 없는 메시지는 필터링 할 수 있다.
      3. Error Detection
        : CAN  에는 CRC (Cyclic Redundancy Check), bit stuffing 와 error handling 과 같은 오류 검사를 위한 여러 메커니즘이 포함되어 있다.
      4. Two-Wire System
        : CAN 은 데이터를 전송하는 데 단 두 개의 와이어 (CAN High와 CAN Low) 만 필요하다. 차동 신호 (differential signaling) 로 인해 노이즈에 강하다.
      5. Prioritization
        : CAN 메시지는 identifiers, control fields, data, CRC 와 acknowledgement bits 로 구성된다.
    2. 예제
      : 이 코드는 CAN frame을 생성하고 샘플 데이터로 채운 다음 하드웨어별 전송을 추상화하는 send_can_messsage 함수를 사용해 전송한다.
      #include <stdio.h>
      #include <stdint.h>
      
      #define CAN_ID 0x123 // CAN ID for this device
      #define CAN_DATA_LEN 8
      
      typedef struct {
          uint32_t id;             // CAN ID
          uint8_t data[CAN_DATA_LEN]; // Data payload
          uint8_t data_len;        // Length of the data
      } CAN_Frame;
      
      void send_can_message(CAN_Frame *frame) {
          // Hardware-specific function to send CAN message
          // Assume 'CAN_Send' is a function provided by your CAN library
          if (CAN_Send(frame->id, frame->data, frame->data_len)) {
              printf("Message sent successfully\n");
          } else {
              printf("Error sending message\n");
          }
      }
      
      int main() {
          CAN_Frame frame;
          frame.id = CAN_ID;
          frame.data_len = 8;
          
          // Fill the data
          for (uint8_t i = 0; i < frame.data_len; i++) {
              frame.data[i] = i;
          }
          
          send_can_message(&frame);
          return 0;
      }
  2.  SPI (Serial Peripheral Interface)
    : SPI 는 마이크로컨트롤러와 센서, 디스플레이, SD 카드와 같은 주변 장치 간의 단거리 통신에 자주 사용되는 고속 전이중 (full-duplex) 프로토콜이다. SPI 는 간단하고 공식 프로토콜 표준이 없기 때문에 유연하지만 특정 하드웨어 연결이 필요하다.
    1. Features
      1. Full-Duplex Communication
        : SPI는 데이터를 동시에 송수신할 수 있다.
      2. Master-Slave Architecture
        : SPI는 하나의 마스터와 하나 이상의 슬레이브로 구성된다.
      3. Four-Wire Interface
        : SPI 는 4개의 라인, 즉 MOSI (Master Out Slave In), MISO (Master In Slave Out), SCLK (Serial Clock) 과 SS (Slave Select) 를 사용한다.
      4. High Speed
        : SPI 는 I2C 보다 훨씬 빠르지만 더 많은 배선이 필요하다.
    2. Protocol
      : 데이터는 MOSI 의 마스터에서 MISO 의 슬레이브로 클럭 아웃된다. 슬레이브는 마스터에 동시에 응답한다.
    3. 예제
      : 이 코드는 SPI를 초기화하고 데이터 송수신을 시연한다. 실제 하드웨어에서 SPI 초기화, 전송 및 수신은 특정 라이브러리 또는 레지스터 구성에 따라 달라진다.
      #include <stdint.h>
      #include <stdio.h>
      
      #define SPI_MOSI_PIN 0
      #define SPI_MISO_PIN 1
      #define SPI_CLK_PIN 2
      #define SPI_SS_PIN 3
      
      void SPI_init() {
          // Set up SPI interface (dummy implementation)
          printf("SPI initialized.\n");
      }
      
      void SPI_send(uint8_t data) {
          // Code to send a byte over SPI (hardware-specific implementation)
          printf("Sent data: 0x%02X\n", data);
      }
      
      uint8_t SPI_receive() {
          // Code to receive a byte over SPI (dummy data for example)
          uint8_t received_data = 0xAB; // Example data
          printf("Received data: 0x%02X\n", received_data);
          return received_data;
      }
      
      int main() {
          SPI_init();
          
          uint8_t data_to_send = 0x55; // Example data to send
          SPI_send(data_to_send);
      
          uint8_t received_data = SPI_receive();
          printf("Received byte: 0x%02X\n", received_data);
          
          return 0;
      }
  3. I2C (Inter-Integrated Circuit) 
    : I2C는 단거리 통신에 사용되는 동기식, 멀티 마스터, 멀티 슬레이브, 반이중(half-duplex) 프로토콜이다. 임베디드 시스템에서 센서, EEPROM 및 기타 주변 장치와의 저속 통신을 위해 널리 사용된다.
    1. Features
      1. Two-Wire System
        : I2C는 SDA (Serial Data) 와 SCL (Serial Clock) 두 개의 라인만 사용한다.
      2. Addressing
        : 버스에 있는 각 장치에는 고유한 주소가 있으며, 마스터는 이 주소를 사용해 각 장치와 통신한다.
      3. Speed
        : 일반적인 I2C 속도는 100kbps 에서 400kbps이며, 일부 시스템은 high-speed 모드에서 최대 3.4Mbps를 지원한다.
      4. Mutli-Master and Multi-Slave
        : 여러 마스터와 슬레이브가 동일한 버스에 공존할 수 있다.
    2. Protocol
      : 데이터는 패킷으로 전송되며, 마스터는 시작 조건, 슬레이브 주소, 읽기/쓰기 비트 및 데이터를 전송한다.
    3. 예제
      : 이 코드는 초기화, 시작, 장치에 쓰기, 데이터 읽기 등 기본적인 통신을 보여준다. 실제 구현에서는 저수준의 I2C 레지스터를 조작하거나 특정 라이브러리 함수를 사용해야 한다.
      #include <stdio.h>
      #include <stdint.h>
      
      #define I2C_SCL_PIN 5
      #define I2C_SDA_PIN 6
      #define DEVICE_ADDR 0x3C // Address of the I2C device
      
      void I2C_init() {
          // Initialize I2C (hardware-specific implementation)
          printf("I2C initialized.\n");
      }
      
      void I2C_start() {
          // Send start condition (hardware-specific implementation)
          printf("I2C start condition sent.\n");
      }
      
      void I2C_stop() {
          // Send stop condition (hardware-specific implementation)
          printf("I2C stop condition sent.\n");
      }
      
      void I2C_write(uint8_t data) {
          // Write byte to I2C (hardware-specific implementation)
          printf("I2C write data: 0x%02X\n", data);
      }
      
      uint8_t I2C_read_ack() {
          // Read byte from I2C and acknowledge (dummy data for example)
          uint8_t received_data = 0x7E;
          printf("I2C read data with ACK: 0x%02X\n", received_data);
          return received_data;
      }
      
      int main() {
          I2C_init();
          
          I2C_start();
          I2C_write(DEVICE_ADDR << 1); // Write mode
          I2C_write(0x01);             // Write data
          
          I2C_start();
          I2C_write((DEVICE_ADDR << 1) | 1); // Read mode
          uint8_t data = I2C_read_ack();
          
          I2C_stop();
          
          return 0;
      }


반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함
반응형