임베디드시스템 Lecture #13 : 시리얼통신
강의목차 1. 데이터통신개요 2. UART 통신 3. SPI 통신 4. 가속도센서 5. I2C 통신 6. 기압센서 2
1. 데이터통신 (1) 데이터통신개요 3 MCU 와외부장치간에디지털데이터를전송 병렬통신 (Parallel Comm.) / 직렬통신 (Serial Comm.) 한번에전송하는데이터비트수에따라구분 병렬통신 데이터비트수만큼의데이터전송선과제어신호선이필요 전송속도가빠르다 각각의장치를연결하기위해많은수의연결선필요 다수의입출력핀이필요 MCU 의입출력핀의활용성이저하 직렬통신 하나의데이터전송및적은수의제어신호선만필요 전송속도가떨어진다 적은수의신호전송선만필요 MCU 입출력핀의활용성이높다 일반적으로 MCU 는직렬통신을지원
1. 데이터통신 (2) 직렬통신개요 장치간에비트단위로데이터를전송하는통신 비동기 (Asynchronous) & 동기 (Synchronous) 통신방식존재직렬통신프로토콜 I2C(Inter-Integrated Circuit) SPI(Serial Peripheral Interface) UART(Universal Asynchronous Receive-Transmit) 4
1. 데이터통신 (3) 직렬통신개요 : 비동기및동기전송비교 Asynchronous No Clock 정해진속도에맞추어전송신호를 HIGH/LOW 로설정하여데이터를표현 발신과수신을위해별도의선을사용 단지두개의장치간에통신하고자하고상호전송속도를같게설정되어있을때에유용 Synchronous With Clock clock 변화에맞추어전송신호를 HIGH/LOW 로설정하여데이터를표현 Clock 신호와전송방향별로별도의선을사용 일반적으로빠른전송속도가필요할때에유용 5
1. 데이터통신 (4) 직렬통신개요 : 비동기및동기전송비교 6 참고 : https://hjeon.tistory.com/12
2. UART 통신 (1) UART(Universal Asynchronous Receiver Transmitter) 대표적인비동기시리얼통신규약 정해진통신속도 (baud rate) 에맞추어데이터를비트단위로직렬전송 기본적으로 Tx(Transmitter)/Rx(Receiver) 2 개의통신라인을사용 필요에따라 handshake 라인 (DTS/DTR) 을사용하기도함 별도의동기화메커니즘을사용하지않으므로통신하기전에송수신측에서동일한통신파라미터를설정하여야함. 통신속도 (Baud Rate) 9600~115200 bsp Start bit 0, 1, 2 Data bit 7, 8 Stop bit 0, 1 Parity bit none, odd, even 7
2. UART 통신 (2) RS-232 표준 (1) 비동기직렬통신에필요한전기적인신호특성 ( 전압, 타이밍등 ) 과기계적특성 ( 커넥터모양, 핀배치 ) 등모든사양을규정 미국 Electronic Industries Association (EIA) 에서정한표준 주로 PC 및통신장비의콘솔통신을위해사용하는직렬포트용 DB-9 커넥터의모양및핀배치표준규정 송신신호 (TxD) 와수신신호 (RxD) 이외에도다른용도의여러신호들도정의함 데이터흐름제어 (flow control) 나반송파검출 (carrier detection) 등의다른기능은사용하지않고순수하게통신만하겠다면 TxD 와 RxD 두신호로충분 8
2. UART 통신 (3) RS-232 표준 (2) UART 통신장치를직렬통신을위해 PC 의직렬포트 (RS-232 포트 ) 에바로연결할수는없다. RS-232 표준에서규정하고있는전압레벨은 TTL 호환 (TTL compatible) 이아니기때문 RS-232 표준은논리 1 에해당하는전압의범위를 -3 V ~ -15 V 로, 논리 0 에해당하는전압의범위를 +3 V ~ +15 V 로규정한다. RS-232 Transceiver RS-232 표준을따르기위해서는 0 V ~ 3 V ( 또는 3.3 V 또는 5 V) 범위의 TTL 신호를 RS-232 레벨신호로변환하고또그반대방향으로도전압을변환해주는전용회로 ( 또는 IC) 가필요 Maxim 사의 MAX232 가대표적인예 9
2. UART 통신 (4) USB(Universal Serial Bus) 통신 PC 환경에서직렬포터, 병렬포트등기존의다양한연결연결방식을대체하기위해개발 현재 PC 에서는다양한외부장치와의연결을위해 USB 통신포터를지원 UART 통신장치를 PC 의 USB 포터에연결하여통신하기위해서는 UART-to-USB Converter 가필요 UART 프로토콜과 USB 프로토콜사이의변환 전압레벨변환 10
3. SPI 통신 (1) 동기식직렬통신 클럭펄스에동기화하여비트데이터전송 동기식직렬통신링크구성 마스터 (Master) 노드 / 슬레이브 (Slave) 노드구분 시프트레지스터 (Shift Register) 클럭전송선 & 데이터전송선 (TX/RX) 연결 11
3. SPI 통신 (2) 동기식직렬통신프로토콜 SPI(Serial Peripheral Interface) 통신 I2C(Inter-Integrated Circuit) 통신 12
3. SPI 통신 (3) SPI(Serial Peripheral Interface) National Semiconductors 와 Motorola 에서개발 하나의장치내부와같이주로짧은거리의직렬통신에적용 주요특징 : 송신 / 수신전송선 (MISO/MOSI) 구분 Full-duplex( 전이중 ) 통신지원 CS(Chip Select) 제어선을이용하여통신할슬레이브장치식별 슬레이브장치가많으면그만큼의 CS 제어선필요 단일마스터장치지원, 10~20M bps 전송속도지원 13
3. SPI 통신 (4) SPI(Serial Peripheral Interface) MBED API SPI SPI Master API Public Member Functions SPI (PinName mosi, PinName miso, PinName sclk, PinName ssel=nc) void void virtual int virtual int format (int bits, int mode=0) frequency (int hz=1000000) write (int value) write (const char *tx_buffer, int tx_length, char *rx_buffer, int rx_length) 14
3. SPI 통신 (5) SPI(Serial Peripheral Interface) MBED API SPI SPI Master API format(int bits, int mode) 의 mode 매개변수 polarity 가 low 이면 SCK 가 low 일때, 그리고 polarity 가 high 이면 SCK 가 high 일때, 의미있는신호가출력된다 Phase 가 low 이면 SCK 의첫번째 edge 에서신호를수신하고, Phase 가 high 이면 SCK 의두번째 edge 에서신호를수신한다는의미 15
3. SPI 통신 (6) SPI(Serial Peripheral Interface) MBED API 16 SPI 예제 #include "mbed.h" SPI spi(pb_15, PB_14, PB_13); // mosi, miso, sclk DigitalOut cs(pb_1); // csel Active Low int main() { // Chip must be deselected cs = 1; // Setup the spi for 8 bit data, high steady state clock, // second edge capture, with a 1MHz clock rate spi.format(8,3); spi.frequency(1000000); // Select the device by seting chip select low cs = 0; // Send 0x8f, the command to read the WHOAMI register spi.write(0x8f);
3. SPI 통신 (7) SPI(Serial Peripheral Interface) MBED API SPI 예제 // Send a dummy byte to receive the contents of the WHOAMI register int whoami = spi.write(0x00); printf("whoami register = 0x%X\n", whoami); } // Deselect the device cs = 1; 17
3. SPI 통신 (8) SPI(Serial Peripheral Interface) MBED API SPISlave SPI Slave API Public Member Functions SPISlave (PinName mosi, PinName miso, PinName sclk, PinName ssel) void void int int void format (int bits, int mode=0) frequency (int hz=1000000) receive (void) read (void) reply (int value) 18
3. SPI 통신 (9) SPI(Serial Peripheral Interface) MBED API SPISlave 예제 #include "mbed.h" SPISlave device(p5, p6, p7, p8); // mosi, miso, sclk, ssel int main() { device.reply(0x00); // Prime SPI with first reply while(1) { if(device.receive()) { int v = device.read(); // Read byte from master v = (v + 1) % 0x100; // Add one to it, modulo 256 device.reply(v); // Make this the next reply } } } 19
4. 가속도센서 (Accelerometer) (1) 지능형측정장치 (Intelligent Instrumentation) 지능형센서 IC 칩에대한집적도가높아짐에따라센서, 제어장치, ADC 그리고데이터인터페이스와같은기능들을단일칩내에집적화 Analog Device ADXL345 가속도센서 MEMS(Micro Electro Mechanical System) 기술을활용하여제작한지능형센서 칩안에가속도측정기구가매우작은크기로구현 가속도계내부의각축을구성하는판에캐패시터가장착 캐패시터판을움직여서가속도혹은힘에비례하는출력전압을발생 아날로그전압변화를디지털로변환하고 SPI 시리얼링크를통해신호를외부로전송 20
4. 가속도센서 (Accelerometer) (2) Analog Device ADXL345 가속도센서 21
4. 가속도센서 (Accelerometer) (3) Analog Device ADXL345 가속도센서 ADXL345 시그널이름 VCC GND SCL MOSI(Master Out Slave n) MISO CS +3.3V GND PB_13 PB_15 PB_14 PB_12 핀 22
4. 가속도센서 (Accelerometer) (5) Analog Device ADXL345 가속도센서 레지스터사양 23
4. 가속도센서 (Accelerometer) (6) 가속도센서실습 실습개요 가속도센서의 3 축가속도측정값을터미널화면에출력한다. 프로젝트생성 프로젝트이름 : accel_sensor Nucleo_mbed_template 폴더를복사 폴더이름 26_accel_sensor, 프로젝트설정파일이름 accel_sensor 24
4. 가속도센서 (Accelerometer) (7) 가속도센서실습 구현 프로그램소스 main.cpp #include "mbed.h" Serial pc(usbtx, USBRX); // set up USB interface to host terminal SPI acc(pb_15, PB_14, PB_13); DigitalOut cs(pb_12); char buffer[6]; //raw data array type char int16_t data[3]; // 16-bit twos-complement integer data float x, y, z; // floating point data, to be displayed onscreen 25 int main() { cs=1; // initially ADXL345 is not activated acc.format(8, 3); // 8 bit data, Mode 3 acc.frequency(2000000); // 2MHz clock rate cs=0; // select the device acc.write(0x31); // data format register acc.write(0x01); cs=1; // end of transmission
4. 가속도센서 (Accelerometer) (8) 가속도센서실습 구현 프로그램소스 cs=0; acc.write(0x2d); acc.write(0x08); cs=1; // start a new transmission // power ctrl register // measure mode // end of transmission 26 } while (1) { // infinite loop wait(0.2); cs=0; // start a transmission acc.write(0x80 0x40 0x32); // RW bit high, MB bit high, plus address for (int i = 0;i<=5;i++) { buffer[i]=acc.write(0x00); // read back 6 data bytes } cs=1; //end of transmission data[0] = buffer[1]<<8 buffer[0]; // combine MSB and LSB data[1] = buffer[3]<<8 buffer[2]; data[2] = buffer[5]<<8 buffer[4]; // convert to float, actual g value x=0.0078*data[0]; y=0.0078*data[1]; z=0.0078*data[2]; pc.printf("x = %+1.2fg\t y = %+1.2fg\t z = %+1.2fg\n\r", x, y, z); }
4. 가속도센서 (Accelerometer) (9) 가속도센서실습 테스트 프로그램을빌드한후에다운로드한다. 터미널프로그램화면에서 3축가속도값이출력되는지확인한다. 실습장비를좌우로흔들면서값의변화를확인한다. 27
5. I2C 통신 (1) I2C(inter-Integrated Circuit) 통신 SPI 통신의단점 SPI 는간단하고, 편리하며, 저렴하지만복잡하거나높은신뢰성이요구되는시스템에는적절치않다. CS 신호선사용 슬레이브장치가많아지면 CS 선호선증가 에러체크기능을지원하지않음 Philips 사가 SPI 통신의단점을극복하기위해개발 짧은거리, 즉단일장치내에서의연결과데이터전송의신뢰성보장을목표 주요특징 : 2 개의연결선 (SDL- 데이터전송선, SCL- 클럭전송선 ) 만사용 Half-duplex( 반이중 ) 통신지원 7-bit 주소로슬레이브장치식별 128 개의슬레이브장치연결가능 다중마스터지원 28
5. I2C 통신 (2) I2C(inter-Integrated Circuit) 통신 I2C 데이터링크구성 29 신호선의풀업저항연결 노드들은 SDL 또는 SCL 선을 Low 로만들수있지만 High 로만들필요가없다.
5. I2C 통신 (3) I2C(inter-Integrated Circuit) 통신 I2C 데이터전송프로토콜 I2C 버스상의노드들은마스터혹은슬레이브로동작할수있다. 마스터는클럭을생성하며, 전송을개시하고종료한다. 슬레이브는주소로식별한다. 특정시점에는단하나의마스터만존재해야하지만하나이상의마스터를가질수있다. 하나이상의마이크로컨트롤러가이버스에연결되어각기다른시점에마스터역할을요청할수있다. 하나이상의마스터가버스를제어하려고하면정의된조정과정 (arbitration process) 이수행된다 30
5. I2C 통신 (4) I2C(inter-Integrated Circuit) 통신 I2C 데이터전송프로토콜 데이터전송은마스터가전송시작을알리는신호 (start condition) 을보냄으로써이루어진다. 시작조건은 SCL 이 high 일때, SDA 가 high 에서 low 로이동하는것으로정의 이어서주소와제어정보를포함하는하나혹은두개의바이트가뒤따라오고, 메시지데이터를바이트단위로전송한다. 데이터전송은마스터가종료조건 (stop condition) 를보냄으로써종료 종료조건은 SCL 이 high 인동안 SDA 가 low 에서 high 로이동 31
5. I2C 통신 (5) I2C(inter-Integrated Circuit) 통신 I2C 데이터전송프로토콜 각데이터비트에대해클럭펄스하나가만들어지며, 클럭이 low 일때데이터비트값이변경 시작조건다음에오는바이트는 7 개의주소비트와한개의입출력방향비트도구성된다 전송되는모든데이터는한바이트안에있어야하고하나의메시지에서전송되는바이트수에는제한이없다 각각의바이트다음에는수신측에서한비트의 ACK(acknowledgement) 신호가뒤따라와야한다. 32
5. I2C 통신 (6) I2C(inter-Integrated Circuit) 통신 MBED API I2C I2C Master API Public Member Functions I2C (PinName sda, PinName scl) void int int int int void void frequency (int hz) read (int address, char *data, int length, bool repeated=false) read (int ack) write (int address, const char *data, int length, bool repeated=false) write (int data) start (void) stop (void) 33
5. I2C 통신 (7) I2C(inter-Integrated Circuit) 통신 MBED API I2C 예제 #include "mbed.h" // Read temperature from LM75BD I2C i2c(i2c_sda, I2C_SCL ); const int addr7bit = 0x48; // 7 bit I2C address const int addr8bit = 0x48 << 1; // 8bit I2C address, 0x90 int main() { char cmd[2]; while (1) { cmd[0] = 0x01; cmd[1] = 0x00; i2c.write(addr8bit, cmd, 2); wait(0.5); 34
5. I2C 통신 (8) I2C(inter-Integrated Circuit) 통신 MBED API I2C 예제 cmd[0] = 0x00; i2c.write(addr8bit, cmd, 1); i2c.read( addr8bit, cmd, 2); } } float tmp = (float((cmd[0]<<8) cmd[1]) / 256.0); printf("temp = %.2f\n", tmp); 35
5. I2C 통신 (9) I2C(inter-Integrated Circuit) 통신 MBED API I2CSlave I2C Slave API Public Member Functions I2CSlave (PinName sda, PinName scl) void int int int int int void void frequency (int hz) receive (void) read (char *data, int length) read (void) write (const char *data, int length) write (int data) address (int address) stop (void) 36
5. I2C 통신 (10) I2C(inter-Integrated Circuit) 통신 MBED API I2CSlave 예제 #include <mbed.h> I2CSlave slave(p9, p10); int main() { char buf[10]; char msg[] = "Slave!"; slave.address(0xa0); while (1) { int i = slave.receive(); switch (i) { case I2CSlave::ReadAddressed: slave.write(msg, strlen(msg) + 1); // Includes null char break; 37
5. I2C 통신 (11) I2C(inter-Integrated Circuit) 통신 MBED API I2CSlave 예제 } } case I2CSlave::WriteGeneral: slave.read(buf, 10); printf("read G: %s\n", buf); break; case I2CSlave::WriteAddressed: slave.read(buf, 10); printf("read A: %s\n", buf); break; } for(int i = 0; i < 10; i++) buf[i] = 0; // Clear buffer 38
6. 기압센서 (1) 기압센서 (Barometric Pressure Sensor) BMP180 Bosch 사에서제작된센서로대기압과온도를측정하는저렴한가격의센서 고도가변하면대기압이변하기때문에고도계로서도사용가능 300 에서 1100hPa 범위의압력을정확하게측정할수있는저전력디지털기압계로서높은정밀도와안정성을갖추기위해압전저항기술 (Piezo-resistive technology) 을사용 압전저항센서 (piezo-resistive sensor), ADC(analog to digital converter), EEPROM 제어로직과 I2C 버스인터페이스로구성 측정된데이터를 EEPROM 에저장 동적측정을위한샘플링비율을표준모드 (standard mode) 에서초당 128 개까지증가가능 39
6. 기압센서 (2) 기압센서 (Barometric Pressure Sensor) BMP180 센서구조 40
6. 기압센서 (3) 기압센서 (Barometric Pressure Sensor) BMP180 센서동작순서 41
6. 기압센서 (4) 기압센서 (Barometric Pressure Sensor) BMP180 고도측정방식 센서측정값 UP pressure data(16 to 19bits) UT temperature data(16 bits) 측정압력 (Pa) 와해수면기준압력 1013.25hPa 을이용하여다음공식으로고도계산 42
6. 기압센서 (5) 기압센서 (Barometric Pressure Sensor) BMP180 센서구조및회로도 주요사양 : 속성 값 전압 3 ~ 5.5 V (Typical 5V) 전류 기압 I2C 통신속도 1.1 ~ 20 ua 300 ~ 1100 hpa 최대 3.4MHz 43
6. 기압센서 (6) 기압센서실습 실습개요 기압센서를활용하여온도, 기압그리고고도를측정하여터미널화면에출력한다. 프로젝트생성 프로젝트이름 : barometric_sensor Nucleo_mbed_template 폴더를복사 폴더이름 27_barometric_sensor, 프로젝트설정파일이름 barometric_sensor BMP180 기압센서장치드라이버 https://os.mbed.com/users/kgills/code/bmp180/ BMP180.h, BMP180.cpp 다운로드 src 그룹에추가 44
6. 기압센서 (7) 기압센서실습 구현 프로그램소스 main.cpp #include <stdio.h> #include "mbed.h" #include "BMP180.h" I2C i2c(i2c_sda, I2C_SCL); BMP180 bmp180(&i2c); Serial pc(usbtx, USBRX); 45 int main(void) { pc.baud(115200); while(1) { if (bmp180.init()!= 0) { pc.printf("error communicating with BMP180\n"); } else { pc.printf("initialized BMP180\n"); break; } wait(1); }
6. 기압센서 (8) 기압센서실습 46 구현 프로그램소스 while(1) { bmp180.starttemperature(); wait_ms(5); // Wait for conversion to complete float temp; if(bmp180.gettemperature(&temp)!= 0) { pc.printf("error getting temperature\n"); continue; } bmp180.startpressure(bmp180::ultra_low_power); wait_ms(10); // Wait for conversion to complete int pressure; if(bmp180.getpressure(&pressure)!= 0) { pc.printf("error getting pressure\n"); continue; } pc.printf("pressure = %d Pa, Temperature = %.1f C\n", pressure, temp);
6. 기압센서 (9) 기압센서실습 구현 프로그램소스 } } // Calculate altitude in meters float altitude; altitude = 44330.0f*( 1.0f - pow((pressure/102710.0f), (1.0f/5.255f))); pc.printf("altitude is %.1f m\n\r", altitude); wait(1); 47
6. 기압센서 (10) 기압센서실습 테스트 프로그램을빌드한후에다운로드한다. 터미널프로그램화면에서온도, 기압그리고고도값이출력되는지확인한다. 48