태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

SCI?

SCI Serial Communications Interface의 약자로, 우리말로 하면 간단히 직렬통신이란 얘기다. 일반적으로는 UART(Universal Asynchronous Receiver/Transmitter) 범용 비동기 통신기로 알려져 있다. 여러 가지 직렬 통신 방법으로 사용할 수 있으며, RS-232C를 지원하므로 PC와의 인터페이스에 많이 사용된다. 노이즈에 강하며, 장거리 통신이 가능하다. TMS320C/F281x DSP 150MHz로 구동할 때, 지원 가능한 최고 속도는 9.375Mbps이다. 간단히 [그림 1]과 같은 구조이다.

   

 

[그림 1] SCI CPU의 인터페이스

 

또한 28x 는 송신부와 수신부에 각각 16레벨의 FIFO 레지스터를 가지고 있다. FIFO가 버퍼 역할을 해주기에, CPU가 통신에 대한 작업 부담을 상당부분 덜 수 있다.

 

 

 

RS-232C의 데이터 구조

RS-232C (Recommended Standard 232 Revision C)는 컴퓨터들과 관련 장치들 간에 비교적 느린 속도의 직렬 데이터 통신을 위한 물리적 연결과 프로토콜에 관해 기술하고 있는 오래된 규약이다. (현재의 버전이 "C"이다.) 직렬통신 방식의 대표적인 방식 중 하나이다. 281x SCI는 이 RS-232C를 지원하고 대부분의 특징이 유사하다. 그럼 먼저 RS-232C의 데이터 구조에 대해서 살펴보도록 하자.

 

과거 모뎀을 이용한 PC통신을 사용해본 경험이 있다면 한 번쯤 모뎀 사양을 설정해 본적이 있을 것이다. 대표적으로 윈도우즈의 기본 통신 응용프로그램인 "하이퍼터미널" 의 경우를 보면 다음 [그림 2] 과 같다.

  

[그림 2] 하이퍼 터미널 포트 설정

 

설정 창을 보면 속도, 데이터 비트, 패리티, 정지 비트 등의 설정 항목이 있다. 이게 과연 무엇을 의미 하는 것 일까? 만약 ' Y ' 라는 문자를 ASCII 코드로 송신한다고 생각해 보자. ' Y '를 이진수의 ASCII 코드로 표현 하면 01011001b 이 된다. 이 데이터를 위의 [그림 2]의 설정대로 RS-232C 규약에 따라서 직렬 전송한다면 아래와 같은 파형이 된다.

  

   

[그림 3] 01011001b의 전송 시 파형

 

[그림 3]의 파형을 잘 관찰해 보자. 데이터를 전송하지 않을 때 송신단자는 High를 유지한다. 이 때 데이터의 전송이 시작되면 한 비트의 구간 동안 Low(스타트 비트)를 유지 한 후 최하위 비트부터 최상위 비트까지 차례로 전송한 후 마지막에 다시 한 비트의 구간 동안 High(스톱 비트)를 유지한다.

 

[그림 2]의 설정에 따라서 전송 속도는 9600 비트/ (=bps) 이므로 한 비트 구간의 시간은 약 104.2us (=1/9600) 이다. 데이터 비트가 8 이므로 LSB부터 MSB까지의 비트가 8개 임을 볼 수 있다. 패리티는 없음으로 설정되어 있어서 [그림 2]의 파형에는 나타나 있지 않다.

 

만약 패리티가 홀수로 설정 되어 있다면, MSB STOP 비트 사이에 한 비트 구간 동안 High가 유지 될 것이다. 반대로 짝수로 설정 되었다면, MSB STOP 비트 사이에 한 비트 구간 동안 Low가 유지 될 것이다. 즉 패리티는 전송되는 데이터의 비트 중 '1'을 개수를 헤아려서 짝수 또는 홀수가 되도록 1 비트를 사용해서 교정한다. 이 패리티 비트는 데이터 전송중의 오류를 검출하기 위한 것이다. 만약 데이터 전송 중 한 비트에 오류가 생겨 원래 비트와 달라진 다면 데이터의 1의 비트 개수가 설정된 패리티와 달라진다. 만약 홀수 패리티를 성정했을 경우 01011001b 101011001b 이 된다. 이때 LSB의 한 비트에 에러가 생겨서 101011000b가 전송 됐다면 패리티 설정을 홀수 인데 전송된 비트의 1의 개수는 짝수가 된다. 이와 같은 에러를 패리티 에러라고 한다. 이렇게 패리티 비트는 한 비트 에러를 검출 할 수 있어서 통신의 신뢰성을 높여준다. 하지만 일반적인 상황에서는 에러가 발생할 확률이 낮으므로 패리티 비트는 사용하지 않는다.

 

정지비트는 1 로 설정되어 있으므로 stop 비트가 1비트 구간 동안안 high로 유지된다. [그림 2]에서는 'Y' 한개의 데이터만 전송하기에 별로 stop 비트가 1비트 인지 2비트 인지 구분이 안 되지만 연속적인 데이터의 전송에 있어서 stop 비트는 한 데이터의 전송이 끝났음을 알리는 중요한 역할을 한다.

 

 

 

SCI Programmable 데이터 구조

SCI도 위에서 설명한 RS-232C와 거의 비슷한 구조를 가지고 있다. 다음 [그림 4] SCI의 데이터 구조이다.

 

  

[그림 4] 일반적인 SCI 데이타 프레임 구조

 

그림을 보면 SCI의 경우 idle-line 모드와 address-bit 모드 두 가지의 데이터 구조가 있음을 알 수 있다. 이중 idle-line 모드는 위에서 설명한 RS-232C와 거의 동일하다고 보면 된다. 실제로 RS-232C를 사용하는 PC의 시리얼 포트와의 통신은 SCI idle-line 모드를 사용해야 가능하다.

 

Address-bit 모드의 경우는 대부분 비슷하지만 한 가지 다른 점이 있다. 바로 Address bit의 존재이다. Address-bit의 존재로 인해서 SCI는 멀티드롭(multi-drop: 하나의 장치에 여러 장치 연결)이 가능해 진다. RS-232C의 경우는 이것이 불가능하다. idle-line 모드에 경우도 멀티드롭이 가능하긴 하지만 address-bit 모드에 비하여 불리한 면이 있다.

 

그래서 일반적으로 idle-line 모드는 비 멀티프로세서(둘 이하의 기기들 간의 통신) 통신에 사용되고 Address-bit 모드는 멀티프로세서(둘 이상의 기기들 간의 통신) 통신 에 사용된다. 주의할 것은 앞에서도 말했듯이 idle-line 모드에서 멀티프로세서 통신이 안 되는 것이 아니라는 것이다. 다만 address-bit모드에 비해 약간 불편할 뿐이다. 이점 주의하기 바란다.

 

 

 

RS-232C 통신을 위한 SCI 유닛 사용법

SCI를 사용하는 방법은 다양하다. 데이터를 송수신하는데 폴링 방식을 사용할지, 인터럽트 방식을 사용할지, 또한 멀티 프로세서 모드를 사용할지, FIFO를 사용할 지 등 상황에 따라 다양한 방법으로 사용이 가능하다. 여기서는 DSP PC가 통신하기 위한 SCI를 이용한 RS-232C 통신 방법에 대해서 다룬다.

 

DSP SCI PC의 시리얼 포트간의 통신을 위해서는 몇 가지 준비 사항이 필요하다. 우선 PC에 시리얼 포트가 있어야 하겠다. PC에 장착되는 시리얼 포트는 25, 9핀 두 종류가 있다. RS-232C의 표준은 25핀이지만, 25핀 중에서 사용하지 않는 핀이 많기 때문에 대부분의 PC 9핀 커넥터가 설치 되어 있을 것이다. 간단히 아래 [그림 5]와 같은 모양 이다. 여기서 SCI를 사용해 데이터를 주고 받기 위해 사용하는 핀은 3 TxD(=TD), 2 RxD(=RD), 5 GND(=Ground) 세 핀뿐이다.

  

 

[그림 5] PC 9핀 시리얼 컨넥터

 

최근 노트북 등에 PC에는 이러한 시리얼 커넥터가 설치 되지 않는 경우가 많기 때문에 만약 시리얼 커넥터가 설치되어 있지 않은 PC [그림 6]과 같은 "Serial to USB 케이블"을 사용하면 된다. 단 주의할 것은 케이블이 RS-232C를 지원하는지의 여부이다. 잘 확인하도록 하자.

  

 

[그림 6] Serial to USB 케이블

 

다음은 PC에서 사용할 통신 프로그램을 실행할 차례이다. 윈도우즈 기본 프로그램인 하이퍼터미널을 사용해보자. 아마도 경로는 아마도 "보조프로그램통신하이퍼터미널" 일 것이다. 프로그램을 실행하고 아래 그림들과 같이 설정하도록 하자.

 

 

 

 연결이름 설정이다. 필자는 SCI_Test라고 이름 붙였는데 아무거나 상관 없다.

  

  

연결대상 설정창의 "연결에 사용할 모뎀" 선택지에서 자신이 사용하는 시리얼 포트를 선택한다. 필자의 경우 COM1 포트를 사용하고 있다.

  

 

 

다음은 포트 설정이다. 통신 속도, 데이터 크기, 패리티 비트 사용 유무 등의 설정을 한다. 간단히 "기본값 복원" 버튼을 누르면 그림과 같이 설정 될 것이다. 여기까지 설정이 끝나면 하이퍼터이널이 자동으로 시리얼 포트와 연결을 시도하고, 다음과 같은 창이 뜬다.

 

 

 

이대로 바로 사용해도 되지만 설정을 확실히 하기 위해 "파일속성" 메뉴를 클릭해서 다음과 같은 설정창을 띄우자.

  

 

 "입력 인코딩" "ASCll 설정" 버튼을 클릭해 다음과 같이 설정한다.

  

 

 

여기까지 PC쪽의 준비가 모두 끝났다. 이제 DSP 쪽의 준비가 필요하다. PC RS-232 High 일 때, +3V ~ +15V 사이의 전압을 가지며, Low 일 때는 -3V ~ -15V의 전압을 가진다. 일반적으로 +12V/-12V 를 사용하는데 이는 PC 제조업체마다 조금씩 차이가 있다. 반면에 281x DSP에서 사용하는 SCI High/Low 전압은 +3.3V/0V 이다. 따라서 이러한 신호 레벨을 바꾸어 주는 트랜시버가 필요하게 된다. 이때 흔히 MAXIM사의 MAX3232칩이 사용되지만 SCI 방식으로 고속 데이터 통신을 하기 위해서는 고속 트랜시버가 요구 된다. MAX3232 트랜시버는 250Kbps에 그치기에 고속 통신에 부적합하다. TI사의 SN75C3232와 같은 트랜시버는 1Mbps 까지 지원한다.

 

만약 싱크웍스에서 제공하는 28x EVM 보드를 가지고 있다면 기본적으로 SN75C3232 트랜시버와 시리얼 커넥터가 장착 되어있어 별다른 작업 없이 바로 PC의 시리얼 포트와 시리얼 케이블을 통해서 연결이 가능하다.

   

 

[그림 7] 싱크웍스 제공 28x EVM 보드

 

만일 28x EVM 보드를 사용한다면 시리얼 포트와 SC의 점퍼 연결을 해주어야 한다. 필자는 28x EVM을 사용하고 SCIA female 포트를 사용하므로 아래와 같이 점퍼를 연결했다.

  

 

[그림 8] 28x EVM SCIA female 점퍼 설정

 

준비가 끝났으면 프로그램이 필요하다. SPRC097을 베이스로 기본적인 메인함수는 다음과 [코드 1]과 같다. SPRC097을 베이스로 한 기본소스 코드 구성을 하지 못한다면 "SCI_for_RS232C.pjt" 예제 프로젝트 파일을 열어서 사용하도록 한다. 하지만 필자는 웬만하면 독자가 직접 기본소스 코드를 구성하고 추가되는 코드를 코딩하는 것을 추천한다.

  

설치경로 : C:\tidcs\c28\dsp281x\v100\SyncWorks_EVM 

 

 

#include "DSP281x_Device.h"   

#include "DSP281x_Examples.h"

void scia_Tx(char);

char scia_Rx(void);

 

// Global variables

char temp;

 

void main(void)

{

  DINT;

  InitSysCtrl();           // 시스템 클럭 : 150MHz, Low 스피드 클럭 : 75MHz

  InitScia_for_ RS232C();  // RS-232C통신을 위한 SCI-A 초기화

  EINT;  

 

  while(1)

  {

    temp = scia_Rx();

    scia_Tx(temp);

  }

}

[코드 1] 기본 초기화 코드 - (SCI_for_RS232C.c)

 

[코드 1] 281x DSP의 전체적인 초기화 코드이다. InitSysCtrl()로 시스템 초기화를 하고, InitScia_for_ RS232C() SCIa 유닛을 초기화 하고 있다. 알고리즘은 SCI로 수신 받은 데이터를 다시 SCI로 송신하는 지극히 단순한 프로그램이다.

 

char scia_Rx(void)

{  

  char data;

  // SCIRXBUF에 데이터가 수신 될 때까지 계속 기다림

  while(!(SciaRegs.SCIRXST.bit.RXRDY));

  // SCIRXBUF에 수신된 데이터를 메모리에 복사

  data = SciaRegs.SCIRXBUF.bit.RXDT;   

  return data;

}

void scia_Tx(char data)

{

  // SCITXBUF에 데이터가 비워질 때 까지 기다림

  while(!(SciaRegs.SCICTL2.bit.TXRDY));

  // SCITXBUF에 송신할 데이터를 씀

  SciaRegs.SCITXBUF = data & 0x00FF;

}


[코드 2] SCIA 송수신 함수 - (SCI_for_RS232C.c)

 

[코드 2] 에 함수들은 SCI로 데이터를 송신, 수신하는 함수들이다. RXRDY, TXRDY 플래그를 이용해서 송수신 모두 폴링 방식으로 구현된 코드이다.

 

 

void InitScia_for_RS232C(void)

{

  /* 핀 설정 */

  EALLOW;

  GpioMuxRegs.GPFMUX.bit.SCIRXDA_GPIOF5 = 1;

  GpioMuxRegs.GPFMUX.bit.SCITXDA_GPIOF4 = 1;                  

  EDIS;

  /* SCI 설정 */

  SciaRegs.SCICCR.all =0x0007;

    // 1 stop bit,  No loopback

    // No parity,8 char bits,

    // async mode, idle-line protocol

 

  SciaRegs.SCICTL1.all =0x0003; 

     // enable RX, internal SCICLK,

     // Disable RX ERR, SLEEP, TXWAKE, TX

  SciaRegs.SCIHBAUD = 0x1;   

  SciaRegs.SCILBAUD = 0xE7;

     // 통신속도 : BRR = 1E7 이면, 9600bps

 

  SciaRegs.SCICTL1.bit.SWRESET = 1; // Relinquish SCI from Reset

}

[코드 3] SCIA 초기화 함수 함수 - (DSP281x_Sci.c)

 

RS-232C 통신을 위한 SCI 초기화 함수다. 이 함수를 사용하기 위해서 "DSP281x_GlobalPrototypes.h" 파일에 꼭 extern으로 선언 해주도록 하자. 이부분은 아주 중요하므로 구분동작으로 알아 보자.

 

1. 통신핀 설정

GPIO핀을 SCI핀으로 사용하기위한 설정이 가장 먼저 들어가 있다. 28x GPIOF 4,5핀을 SCI 통신을 위한 송수신 핀으로 설정한다.

 

2. SCI 통신 포맷 설정

다음으로 SCI 통신 포맷을 결정한다. 설정은 앞서 PC의 하이퍼 터미널에서의 설정에 맞춰, 1 스톱 비트, 패리티 비트 사용안함, 8bit 단위 데이터, idle-line 모드로 설정한다.

 

3. SCI 제어 설정

SCI의 송수신 사용설정들을 제어한다. SCI 송수신 기능을 모두 활성화하는 설정이다.

 

4. 통신속도(Boud rate) 설정

SCI의 통신 속도는 SCIHBAUD SCILBAUD 레지스터의 값으로 결정된다. 각각 8bit 레지스터인데, SCIHBAUD를 상위 SCILBAUD를 하위로 16bit로 연결해서 사용한다. [코드 3] 처럼 SCIHBAUD = 0x1, SCILBAUD = 0xE7 이면 0x01E7 = 487 로 사용한다. 계산 방법은 다음과 같다.

 

SCI 통신 속도(Boud rate) =  LSPCLK/(SCIHBAUD & SCILBAUD 설정값 + 1) x 8 


, 이때 만일 SCIHBAUD & SCILBAUD 설정값이 "0" 이라면 다음과 같이 계산된다.

 

SCI 통신 속도(Boud rate) =  LSPCLK/4 

 

, [코드 3]에서 Buad rate설정은 약 9606 이된다. PC쪽에서 사용하는 Buad rate 9600인데 약간의 차이가 생긴다. 0.06%의 오차율인데 일반적으로 0.1% 내외의 오차는 큰 문제가 되지는 않는다. 하지만 28x의 시리얼 부트로더 사용시에는 PC DSP간의 Buad rate가 정확하게 맞아 떨어져야 한다. 그렇지 않으면, 많은 양의 데이터를 전송할 때 오차가 누적되어 결국 오류가 발생한다.

 

이제 프로그램을 빌드해서 메모리에 로드하면 DSP PC간의 RS-232C 통신을 위한 준비가 모두 끝난다. 28x EVM PC를 시리얼 케이블로 연결하고 앞서 준비한 하이퍼터미널을 띄우자. 아직 프로그램을 실행 시키지 말고 하이퍼터미널의 에디트 창에 아무 키나 입력 해보자. 아마도 아무 변화가 없을 것이다. 이제 프로그램을 실행시키고 다시 하이퍼터미널의 에디트 창에 아무 키나 입력 해보자. 아마도 이번에는 하이퍼터미널의 에디트 창에 입력한 키에 해당하는 문자가 출력되어 나올 것이다. 이것은 [그림 ] 과 같이 하이퍼터미널에서 입력된 문자를 PC가 시리얼 포트를 통해서 DSP SCI로 송신하고, 문자를 수신 받는 SCI가 수신 받은 문자를 다시 PC의 시리얼 포트에 송신하고, 시리얼 포트에 수신된 문자를 하이퍼터미널이 출력하기 때문에 나타나는 결과이다.

   

 

[그림 ] PC DSP간의 RS-232통신

 

여기까지 폴링 방식으로 SCI를 사용하는 기본적이면서 많이 사용되는 RC-232C 통신 방법에 대해서 간단하게 살펴봤다. 이외에도 SCI를 사용하는 방법은 다양하다. RS-232C와는 다르게 멀티드롭도 가능하고, 16레벨의 FIFO를 사용하여 고속 SCI 통신 사용시 CPU 자원낭비 또한 많이 줄일 수 있다. 또한 28x SCI는 하드웨어 적으로 Auto-baud detect logic을 갖고 있기에 약간의 송수신간의 Buad rate 맞지 않아도 자동으로 Buad rate을 찾아서 맞추는 것이 가능하다. 또한 활용하기 따라서 RS-232 뿐만 아니라 RS-423,422,485 등의 비동기 통신 또한 사용할 수 있다.

DSP에 대해 좀 더 알고 싶으세요? 싱크웍스 무료실습강좌를 신청하세요. ----------> 무료실습강좌 신청하기
본 내용이 유익하셨다면 싱크웍스 블로그 2.0을 구독하세요. -------------------------> 싱크웍스 RSS
 

Posted by syncworks

댓글을 달아 주세요

  1. 박용만

    EVM 보드 시리얼 설정 점퍼가 잘못 된거 같습니다.세로가 아니가 가로 아닌가요~?

    • 김상현

      점퍼 설정은 상위그림과 동일합니다.
      원하는 채널을 아래 커넥터와 연결하기 위해서입니다^^
      2009.09.11 18:31 신고 댓글주소 수정/삭제

  2. 김인경

    SC450 키트로 dsp 테스트 중 이글을 보고 통신 테스트를 하고 있는데요, pc랑 1:1 롤 SCI 통신은 테스트도 해보고, 이해가 되는데요.
    address mode의 경우 address bit가 있어서 1:n 통신이 가능하다고 되어 있는데 그럼 address bit의 크기는 임의로 설정이 가능한 건가요?
    만약에 1:8 통신을 한다면 address bit를 3비트로 설정해야되는건가요? address mode에 대한 설명을 좀더 해 주셨으면 합니다. 예제 소스가 있다면 같이 설명좀 부탁 드립니다.

    • Favicon of http://www.mcublog.co.kr BlogIcon 말다리

      address 비트는1bit입니다. 사용자는 address 비트의 사용 여부만 설정할 수 있을 뿐 비트 크기를 설정할 수는 없습니다. 그리고, address 비트는 직접 주소정보를 표시하는 것이 아닙니다. address 비트는 Address-bit 모드에서, 단지 SCI 데이터가 주소정보를 담고 있는지 데이터정보를 담고 있는지 구별하기 위한 비트 입니다.

      자세한 내용은 "Serial Communications Interface (SCI) Reference Guide"의 1.2.2 부터의 내용을 참고해보세요.
      2010.02.17 09:59 신고 댓글주소 수정/삭제

  3. 비밀댓글입니다
    2016.01.27 12:24 댓글주소 수정/삭제 답변

  4. 초보

    안녕하세요 위 예제를 해보았는데요.
    입력을 어떤 값을 주던지 p 라는 문자만 출력됩니다. ;혹시 이같은 현상을 어떻게 해결하면 좋을까요?

    • Favicon of http://www.mcublog.co.kr BlogIcon 남상일

      입력과 관계없이 임의의 다른 값이 출력된다면, Buad-rate 설정이나 Wiring이 잘못되었을 것이라 추측해볼 수 있는데, 이처럼 무엇을 입력하든 'P' 만 나오는 현상은 재현이 어렵네요. 어디에 오류가 있을지 추측하기 어렵습니다.
      2017.10.26 14:21 신고 댓글주소 수정/삭제

티스토리 툴바