티스토리 뷰
마이크로 컨트롤러와 주변 장치 (peripheral devices) 간의 연결 및 통신을 위해 널리 사용되는 통신 프로토콜인 CAN (Controller Area Network), SPI (Serial Peripheral Interface) 와 I2C (Inter-Integrated Circuit) 에 대해 알아보자.
- CAN (Controller Area Network)
: CAN 은 자동차, 산업 및 의료용 애플리케이션에 여러 장치를 연겨랗기 위해 자주 사용되는 강력한 저속 통신 프로토콜이다. 특히 열악한 환경에서의 신뢰성으로 잘 알려져 있다.- Features
- Multi-Master Capability
: bus가 여유가 있을 때 네트워크의 모든 디바이스가 메시지를 보낼 수 있다. - Broadcast Communication
: 모든 장치가 모든 메시지를 수신하지만 관련 없는 메시지는 필터링 할 수 있다. - Error Detection
: CAN 에는 CRC (Cyclic Redundancy Check), bit stuffing 와 error handling 과 같은 오류 검사를 위한 여러 메커니즘이 포함되어 있다. - Two-Wire System
: CAN 은 데이터를 전송하는 데 단 두 개의 와이어 (CAN High와 CAN Low) 만 필요하다. 차동 신호 (differential signaling) 로 인해 노이즈에 강하다. - Prioritization
: CAN 메시지는 identifiers, control fields, data, CRC 와 acknowledgement bits 로 구성된다.
- Multi-Master Capability
- 예제
: 이 코드는 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; }
- Features
- SPI (Serial Peripheral Interface)
: SPI 는 마이크로컨트롤러와 센서, 디스플레이, SD 카드와 같은 주변 장치 간의 단거리 통신에 자주 사용되는 고속 전이중 (full-duplex) 프로토콜이다. SPI 는 간단하고 공식 프로토콜 표준이 없기 때문에 유연하지만 특정 하드웨어 연결이 필요하다.- Features
- Full-Duplex Communication
: SPI는 데이터를 동시에 송수신할 수 있다. - Master-Slave Architecture
: SPI는 하나의 마스터와 하나 이상의 슬레이브로 구성된다. - Four-Wire Interface
: SPI 는 4개의 라인, 즉 MOSI (Master Out Slave In), MISO (Master In Slave Out), SCLK (Serial Clock) 과 SS (Slave Select) 를 사용한다. - High Speed
: SPI 는 I2C 보다 훨씬 빠르지만 더 많은 배선이 필요하다.
- Full-Duplex Communication
- Protocol
: 데이터는 MOSI 의 마스터에서 MISO 의 슬레이브로 클럭 아웃된다. 슬레이브는 마스터에 동시에 응답한다. - 예제
: 이 코드는 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; }
- Features
- I2C (Inter-Integrated Circuit)
: I2C는 단거리 통신에 사용되는 동기식, 멀티 마스터, 멀티 슬레이브, 반이중(half-duplex) 프로토콜이다. 임베디드 시스템에서 센서, EEPROM 및 기타 주변 장치와의 저속 통신을 위해 널리 사용된다.- Features
- Two-Wire System
: I2C는 SDA (Serial Data) 와 SCL (Serial Clock) 두 개의 라인만 사용한다. - Addressing
: 버스에 있는 각 장치에는 고유한 주소가 있으며, 마스터는 이 주소를 사용해 각 장치와 통신한다. - Speed
: 일반적인 I2C 속도는 100kbps 에서 400kbps이며, 일부 시스템은 high-speed 모드에서 최대 3.4Mbps를 지원한다. - Mutli-Master and Multi-Slave
: 여러 마스터와 슬레이브가 동일한 버스에 공존할 수 있다.
- Two-Wire System
- Protocol
: 데이터는 패킷으로 전송되며, 마스터는 시작 조건, 슬레이브 주소, 읽기/쓰기 비트 및 데이터를 전송한다. - 예제
: 이 코드는 초기화, 시작, 장치에 쓰기, 데이터 읽기 등 기본적인 통신을 보여준다. 실제 구현에서는 저수준의 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; }
- Features
반응형
'기술(Tech, IT) > 임베디드 (Embedded)' 카테고리의 다른 글
[Embedded] Polling (0) | 2024.11.11 |
---|---|
[Embedded] I2C (Inter-Integrated Circuit) - 1 (0) | 2024.11.10 |
[Embedded] SPI (Serial Peripheral Interface) - 1 (3) | 2024.11.08 |
[Embedded] Nvidia Jetson (엔베디아 젯슨) (1) | 2024.10.28 |
[Embedded] Qt - 2 (1) | 2024.10.27 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 리트코드
- 이코노미스트
- Hash Map
- C++
- DICTIONARY
- 파이썬
- I2C
- ml
- leetcode
- 오블완
- min heap
- defaultdict
- java
- 안드로이드
- 티스토리챌린지
- Computer Graphics
- vertex shader
- The Economist
- 이코노미스트 에스프레소
- socket programming
- The Economist Espresso
- 딕셔너리
- Python
- 소켓 프로그래밍
- Android
- join
- 투 포인터
- tf-idf
- machine learning
- 머신 러닝
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함
반응형