실행 화면





clc

clear

delete(instrfindall)


% 시리얼 통신 포트 및 통신 방식 설정

s2 = serial('COM33', 'BaudRate', 115200, 'DataBits', 8, 'StopBits', 1, 'Parity', 'non');

fopen(s2);

time = 0;


% 그래프 x축 최대 크기

x_limit = 1000;


for a = 1:x_limit

   time = time+1;


   % 시리얼 통신으로 전송받은 string 데이터 저장

   accel = (fscanf(s2));

   

   % string형으로 받아온 데이터를 tokenizer(공백이나 쉼표 등)로 분리하여 data행렬에 저장 

   [data, tf] = str2num(accel);


   xlim([0,x_limit]);

   if a>2

       plot(time, data(1), 'r.');

       hold on;

       plot(time, data(2), 'g.');

       hold on;

       plot(time, data(3), 'b.');

       hold on;

       

       drawnow;

    fprintf('%d: \t%d\t%d\t%d\r\n', a, data(1), data(2), data(3));

   end

end

a = 0;

clf;


fclose(s2);

delete(instrfindall)

I2C통신은 아주 흔하게 사용하는 통신 방법중에 하나로서, 주로 하나 이상의 센서들을 제어하거나 값을 받아올 때 사용합니다.


센서용으로 I2C통신이 흔하게 이용되는 이유는 한 간편한 방식으로 통신라인에 최대 7-bit 주소를 이용할 수 있기 때문인데,


이는 곧 이론상으로 한 통신라인 상에서 127개의 센서를 제어할 수 있다는 뜻입니다.


해당 통신을 구현하기 위해서는 특정한 회로 및 시퀀스 스펙을 맞춰주어야 합니다.



1. 하드웨어상 특징


- 통신 라인에서 제어 주체별로 각각 Master, Slave로 나눌 수 있으며 주로 MCU가 Master가 되고 센서가 Slave가 됩니다.

  Master는 통신 라인의 Clock 주파수를 생성하고 Slave의 주소를 호출하여 동작을 제어하는 역할을 합니다.

  Slave는 Master에 의해 호출되어 Master가 원하는 값을 반환합니다.


- 주로 +3.3V 전압을 이용하며, 그 이상의 전압도 가능합니다. 다만, 각 칩이나 센서별로 스펙상 특정한 전압을 사용하기 때문에

  해당 전압에 맞추어 사용하여야 합니다.


- 통신 라인은 SDA(데이터), SCL(클락) 두 선으로 구성되어 있고 각각의 선에 풀업 저항이 필요합니다. (+3.3V의 경우 주로 4.7K)

 


2. 동작 시퀀스 특징


일반적인 경우 흐름 제어 옵션을 OFF로 하기 때문에 Baud Rate만 신경을 쓰면 되지만

 

흐름 제어 기능을 사용할 경우에는 평상시처럼 Rx, Tx만으로는 통신이 되지 않는다.

 

 

1. Software Handshaking

 

직렬 통신을 통해 버퍼 사이즈 초과 등으로 인하여 더 이상 데이터를 입력 받지 못할 경우에

입력 측에서 XOFF문자를 보내주면 출력 측에서 데이터 전송을 중단한다.

 

반대로, 추가적인 데이터를 받을 수 있는 경우에 입력 측에서 XON문자를 보내주면

출력 측에서 중단했던 데이터 전송을 재개한다.

 

XON - 아스키코드 문자 DC1, 0x11, Ctrl+Q

XOFF - 아스키코드 문자 DC3, 0x13, Ctrl+S

 

2. Hardware Handshaking

 

마찬가지로 데이터를 입력 받지 못하는 상황이 발생하면 RTS, CTS Pin 출력 상태로 알려준다.

 

RTS(Request To Send) : 수신 측에서 데이터 수신이 가능한 상태이면 Low, 불가능한 상태이면 High를 출력함

CTS(Clear To Send) : 송신 측에서 CTS핀 상태가 Low일 때 데이터를 송신

 

 

하드웨어 흐름 제어를 On 으로 사용하여야 할 때,

 

MCU로 직접 RTS, CTS핀을 제어하여 통신할 수도 있으며 간단하게 이용하려는 경우에는

 

같은 장치끼리 RTS-CTS를 Short시키거나 CTS를 Low로 Pull Down 해 주면

 

흐름 제어를 이용하지 않는 상태처럼 직렬 통신을 이용 가능하다.

 

+ Recent posts