티스토리 뷰

아두이노의 통신 방법 (UART, SPI, I2C)



<UART> : universal asynchronous receiver/transmitter. 통신을 위한 하드웨어 회로

비동기식(clock X) 데이터 전송 방식 -> 속도, 전기 신호의 수준, 논리의 전합을 UART외부 회로(RS-232, RS-422,RS-485)로 변경이 가능해서 사용범위가 넓다.

주요기능 : 송신할 병렬 데이터를 직렬로 변경하고 수신된 직렬 데이터를 병렬로 변결한다.

TTL level의 신호를 사용한다. (중앙 처리장치의 전압을 기준으로 데이터를 송.수신 한다.)

그러면 5V의 낮은 전압을 이용하는 거라서 장거리에 이용하면 잡음과 간섭에 의한 오류가 많이 발생한다. 그래서 이를 보완하기위해 높은 전압을 사용하도록 RS-232를 도입한거임. 그러면 25V까지 가능해짐

UARTRS-232는 신호 레벨이 서로 달라서 직접 연결해서 사용할 수는 없음.

-> TX,RX의 신호선, GND 연결해야 한다.

전이중방식 및 1:1통신만 가능 (full duplex)

시작 bit : 0, bit : 1

TTLpositive logic, RS-232negative logic을 사용한다.

RS-2321:1 연결만을 지원하고 속도도 느림. 이를 보완해서 RS-4221:n을 지원하고 속도는 10Mbps인데, 또 이게 발전해서 RS-485가 나오고 m:n연결(최대32)을 지원하며 속도는 10Mbps이다.

UART, RS-232의 연결을 위해서는 레벨 변환기가 필요.

data의 전송 속도 : 보율(baud rate) -> 비동기식이라 송/수신자가 보율을 알고있어야 한다.

아두이노 우노 : PD0(RX),PD1(TX)이 하드웨어 UART통신에 사용된다.

RX,TX : 스케치 업로드, 컴퓨터와의 시리얼 통신, UART이용하는 주변 장치와의 통신, 범용 입출력 핀

아두이노의 4개의 연결선 : RX,TX,GND,VCC

텍스트 LCD : 2개의 제어선 + 연결선 = 6개의 연결선 (4*20개의 문자 표현이 가능하다.)

serial class : UART serial 통신을 담당한다. = 하드웨어 시리얼

 

스케치 업로드

컴퓨터와 시리얼 통신

주변장치와 시리얼 통신

연결 대상

컴퓨터

컴퓨터

주변장치

연결 대상의 통신법

USB

USB

UART 시리얼

변환기의 사용

USB-UART 변환기

USB-UART 변환기

 

serial class 사용

x

o

 

비고

부트로더 사용

 

 

별도의 헤더파일이 필요 없고, 특히 우노는 시리얼 포트 하나니까 별도의 객체 선언의 필요도 없다.

UART 통신을 위해선 주변장치와 통신 속도를 일치 시키고, begin함수에서 옵션을 설정한다.

void begin(unsigned long baud) / void begin(unsigned long baud, byte config)

-> 속도, 데이터 bit의 수(8), 정지 bit의 수(1), 패리티 bit(사용x)의 종류를 설정한다.

데이터 송신 : print(문자열 변환 출력이 가능하다.), write(이진 데이터를 직접 출력한다.)

size_t print(value, format)

value : 출력값, format : 출력형식, return : 시리얼 포트로 출력된 byte의 수

size_t write(uint8_t ch)

ch : 출력할 byte 단위의 데이터, return : 출력한 byte의 수

데이터 수신 :

int available (void)

return : 시리얼 통신 수신 버퍼에 저장된 data의 바이트 수

int peek (void)

return : 시리얼 통신 수신 버퍼의 첫번째 바이트 데이터 또는 -1. 수신버퍼를 삭제하지 않음.

int read (void)

return : 시리얼 통신 수신 버퍼의 첫번째 바이트 데이터 또는 -1. 수신버퍼를 삭제한다.

software serial : 아두이노가 하나의 UART만 가지니까 여러개의 장치와 serial 통신을 할 수 있도록 소프트웨어를 통해 에뮬레이션 한다.

우노의 모든 data 입출력 핀을 software serial을 통해 UART 통신에 사용이 가능하다.

-> 최대 10개의 UART

소프트웨어 시리얼도 한 번에 하나의 UART통신이 가능하다.

 

<SPI> serial peripheral interface

고속의 주변장치를 연결하기 위한 시리얼 통신 방식 중 하나.

마스터 장치 하나에 슬레이브 장치 여러 개가 연결되는 1:n 통신이 가능하다. 특정 순간에선 1:1 통신

마스터 장치는 연결을 시작하고 통신을 제어하는 책임을 지는 장치로, 연결이 성립된 이후에는 2개의 데이터 선을 통해 전이중 방식으로 데이터를 동시에 주고 받을 수 있다.

동기식 통신 방식이다. 그래서 별도의 클록 신호를 전송하므로 데이터 선이 더 필요하다.

또한, 1:n 연결에서 특정 슬레이브 장치를 선택하기 위해 데이터 선을 사용하므로 총 4개의 연결선을 가진다.


SPI 마스터

MOSI

---------------------------------------→ 

MOSI

SPI 슬레이브

MISO

←---------------------------------------

MISO

SCLK

--------------------------------------------→

SCLK

SS

--------------------------------------------→

SS

MOSI : MASTER OUT SLAVE IN

MISO : MASTER IN SLAVE OUT

SCLK : Serial CLK, 마스터 공급

SS : SLAVE를 선택한다.

SCLK가 시간의 정보를 주므로, 데이터 속도가 빠른 곳에 적용하고 비동기식은 데이터 속도가 느린 곳에 적용한다.

선택되지 않은 슬레이브 장치의 SShigh인 반면, 선택된 슬레이브 장치의 SSlow이다. -> 특정 순간에는 1:1 통신만이 가능

=> 하나의 슬레이브만 선택되었을 때.

SPI의 데이터 전송 방식은 다른 시리얼 통신 방법과 달리, 항상 송신과 수신이 동시에 일어남.

UART도 물론 동시에 일어날 수 있지만 항상 그런게 아니고, 송신과 수신은 별개로 동작함.

슬레이브 장치는 클록을 생성하지 않는다.

SPI통신에서 마스터와 슬레이브 장치의 데이터 버퍼는 원형 큐를 이루고 있다고 생각하면 이해하기 쉬움.

하나의 클럭이 발생하면 마스터 장치의 1bit 데이터가 슬레이브 장치로 전달되고 동시에 슬레이브 장치의 1비트 데이터가 마스터 장치로 전달되어 데이터를 교환한다.

데이터 교환할 때 유의할 점은 클록의 역할이다.

클록은 데이터가 전달되는 시점을 알려 주어 전달된 데이터가 안정적인 상태를 유지할 때 수신 장치가 데이터를 샘플링하도록 지시하기 위해 사용된다.

그러나, 클록의 어느 부분에서 데이터 전송이 완료되었는가에 따라 수신 장치가 데이터 읽는 시점이 바뀌고 이를 위해 클록 극성과 클록 위상이 사용된다.

 

CPOL클록 극성) : SPI버스가 유휴 상태일 때의 클록 값을 결정.

CPOL = 0이면 비활성 상태일 때 SCKLOW

CPOL = 1이면 비활성 상태일 때 SCKHIGH

CPHA (클록 위상) : 데이터의 샘플링 시점

CPHA = 0이면 데이터는 SCK가 비활성 상태에서 활성 상태로 바뀌는 에지에서 샘플링

CPHA = 1이면 데이터는 SCK가 활성 상태에서 비활성 상태로 바뀌는 에지에서 샘플링

수신 장치는 데이터가 안정화 된 이후, 즉 데이터 비트의 중앙에서 데이터를 샘플링한다.

UART는 비동기식으로 데이터가 전송되서 데이터를 확인하기 위해 여러 번의 샘플링을 통해 실제 전송된 데이터를 파악하지만, SPI는 동기화를 위한 클록이 별도로 존재하므로 한 번의 샘플링만으로도 충분하다. (한 비트에 한 번의 샘플링을 수행한다.)

데이터가 샘플링되는 동안 SSLOW상태를 유지하고 있어야 한다.

SPI를 위한 아두이노 핀 구성

MOSI : 11

MISO : 12

SS : 10 (변경 가능)

SCK : 13

SPI 라이브러리 : 기본 라이브러리 중의 하나로 마스터 모드만 지원한다. 라이브러리에서 정의하고 있는 클래스는 SPIclass이고, 전역 객체인 SPI를 통해 SPI 통신이 이루어진다.

SPI 통신은 하나의 경로를 통해서만 데이터를 송수신하므로 데이터 송수신을 위한 객체는 하나만 생성할 수 있다.

설정함수

void begin(void)

SPI 통신을 초기화한다. 통신속도를 결정해줄 필요가 없다

void end(void)

SPI 통신을 종료한다.

void setBitOrder(uint8_t bitOrder)

bitOrder : LSBFIRST, MSBFIRST -> MSB or LSB가 우선

void setClockDivider(uint8_t rate)

rate : 2,4,6,8,16,32,64,128

=SPI_CLOCK_DIV2~SPI_CLOCK_DIV128 (SCK,SCLK의 속도를 정한다.)

디폴트 값은 SPI_ClOCK_DIV4, 시스템 클록의 1/4 속도로 데이터 전송. 아두이노 우노는 16MHz니까 4MHzSPI의 기본 주파수이다.

void setDataMode(uint8_t mode)

mode : 전송 모드

마스터와 슬레이브가 동일한 모드를 사용.

주변 장치가 사용하는 모드를 파악하여 아두이노 우노 보드를 설정

전송함수

byte transfer(byte data)

data : 송신할 데이터

return : 수신된 데이터

SPI 버스를 통해 한 바이트의 데이터를 보내고 한 바이트의 데이터를 받아서 반환한다.

송신과 수신은 항상 동시에 일어나므로 송신과 수신을 위해 동일한 함수를 사용한다. 

 

<I2C> inter integrated circuit. 필립스에서 만든 규격. IIC, I2C, I2C, TWI

마스터 장치와 여러개의 슬레이브. 동기식.

SPI는 고속이지만, 여러개 연결하면 SS의 연결이 너무 증가된다.

I2CSS연결이 필요 없다. -> 각 장치의 고유 주소를 이용한다. -> 소프트웨어적 주소로 선택 -> 인터넷의 IP

SPI는 하드웨어 주소라고 볼 수 있다.

I2C는 반이중 방식이라 데이터 송수신 선 1(SDA) 클락을 위한 선 1(SCL) 2개의 선이 필요하다.


 

UART

SPI

I2C

동기/비동기

비동기

동기

동기

전이중/반이중

전이중

전이중

반이중

연결선

개수

슬레이브

1개 연결

데이터

2

2

1

클록

0

1

1

제어

0

1

0

합계

2

4

2

슬레이브 n개 연결

2n

3+n

2

연결 방식

1:1

1:n

1:n

슬레이브 선택

-

하드웨어 (SS 라인)

소프트웨어(주소 지정)


SDA, SCL의 두 라인을 공유한다.!! 그래서 아무리 많이 연결해도 2개의 선이 필요한 것이다.

pull-up 저항을 통해 device와 연결한다.

두 선 모두 default 값은 high이다. 위상과 극성에 따른 전송 모드가 있는 것이 아니고, SCLHIGH일 때만 샘플링이 가능하다.

SCLhigh여야 SDA가 안정된 상태이다. 결국, SCLLOW일 때만 SDA의 전이가 가능하다.

SCLHIGH인데 SDA에 전이가 나타나는 경우

1. SDAHIGH->LOW : 시작

2. SDALOW->HIGH :

=> UARTStart bit0이고 stop bit1이다.

소프트웨어적 주소는 7비트인데, 읽기/쓰기를 나타내는 1개의 bit까지해서 총 1BITE.

읽기 : 슬레이브 -> 마스터. (HIGH)

쓰기 : 마스터 -> 슬레이브. (LOW)

, 바이트 단위로 데이터를 전송함. 하지만 시작!!끝은 항상 마스터가 지정한다.

그리고! 데이터를 수신했으면, 수신했음을 알려야 한다.

-> 9번째 비트의 필요성. LOW는 성공(ACK), HIGH는 에러(NACK).

즉 바이트 단위가 전송된 후 한 비트를 또 전달한다.(이 비트는 받는 사람이 전달!)

에러면, ACK를 보낼 수 없는데 SDA는 데이터 전송 후 HIGH상태(default)이므로 NACK별도로 보내지 않아도 효과 동일

S,P(시작과 종료의 1bit)는 항상 마스터가 보낸다.

여러 바이트를 보낼 때 R/W는 한 번만 해주고, ACK는 매번 보내준다.

슬레이브가 data를 읽는 것도 시작은 다 master.!!!! (S, 주소, R or W는 항상 마스터가 한다.)

SDAanalog4선과, SCKanalog5선과 연결되어 있다.-> 이를 사용하기 위해서 풀업 저항을 이용한다.

wire library : I2C에 사용하는 송신, 수신 함수들

설정함수

void begin(void) / void begin(uint8_t address)

wire library를 초기화하고, I2C의 주소를 나타낸다. (주소가 있으면 슬레이브 없으면 마스터)

uint8_t requestForm(uint8_t address, uint8_t quantity)

uint8_t requestForm(uint8_t address, uint8_t quantity, uint8_t sendStop)

슬레이브 주소, 요청하는 byte , 요청 완료 후 정지 메세지의 전송 여부. (T/F이고 기본은 T)

sendStopF, 마스터와 슬레이브의 연결이 유지되고 다른 마스터가 데이터를 요구할 수 없다.

마스터가 특정 슬레이브에게 지정한 양의 데이터를 요청한다.

return : slave로부터 온 byte의 수.

전송함수

void beginTransmission(uint8_t address)

슬레이브 주소로 데이터를 전송한다. write함수에 의해 data가 버퍼()에 기록된 후 endTransmission함수가 호출될 때 진짜로 전송을 한다.

unit8_t endTransmission(void) / uint8_t endTransmission(uint8_t sendStop)

메세지의 전송 상태를 return한다. (큐에 기록 된 데이터를 전송)

0 : 전송 성공

1 : data(전송)가 버퍼의 용량을 초과

2 : 주소 전송 후 NACK를 수신

3 : data 전송 후 NACK 수신

4 : 기타 TWI 오류

size_t write(uint8_t data) / size_t write(const uint8_t *data, size_t quantity)

data는 전송할 단일 바이트 또는 바이트 배열에 대한 포인터

quantity : 전송할 바이트의 수, return은 전송된 byte

전송할 데이터를 큐에 기록한다.

전송은 beginTransmission으로 시작하고, write에서 큐에 data를 기록하며, endTransmission함수로 실제로 전송한다.

int available(void)

유효한 바이트의 수를 리턴한다. (read로 읽을 수 잇는 유효한 바이트의 수를 반환)

마스터에서 requestForm을 통해 슬레이브에게 요청을 한 이후, 데이터를 검사하거나 슬레이브의 onReceive함수에서 사용.

int read(void)

수신 버퍼의 한 바이트를 읽어서 반환한다.

마스터 장치에서 requestForm 함수를 통해 슬레이브 장치가 전송한 데이터 한 바이트를 읽어서 반환

마스터 장치가 전송한 데이터를 슬레이브가 읽기 위해서 사용할 수도 있다.

void onReceive(void (*) (int))

슬레이브가 마스터 장치로부터 데이터를 수신했을 때, 호출되는 핸들러 함수를 등록.

핸들러 함수는 반환값이 없고, 수신한 데이터의 바이트 수를 나타내는 int 형식의 매개변수를 가짐.

void onRequest(void (*) (void))

슬레이브 장치가 마스터 장치로부터 데이터를 요청받았을 때 호출되는 핸드러 함수를 등록한다.

핸들러 함수는 반환값도 없고 매개변수도 가지지 않는다.

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/02   »
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
글 보관함