본문 바로가기
DSP, MCU/TMS320F2838x (C28x)

TMS320F28388D ] SCI (UART) 통신하기 - 송신

by eteo 2022. 9. 7.

 

SCI : Serial Commnucation Interface

직렬 통신 인터페이스로 UART보다 광범위한 개념으로 쓰이지만 그중에 주로 UART 용도로 쓴다.

 

 

새 프로젝트를 만드는 것보다 .syscfg 가 있는 예제파일을 불러와 시작하는 것이 좋다.

 

 

 

프로젝트를 복붙해 sci_test 라는 프로젝트를 하나 만들고 .syscfg 파일을 더블클릭해 sysconfig tool 로 들어간다.

 

 

 

형관펜으로 표시한 버튼을 누르면 데이터시트 11페이지에도 있는 핀 다이어그램을 볼 수 있다.

 

 

F2838x는 176-pin QFP 와 337-pin BGA 패키지가 있는데 내가 사용하는 모델은 337-pin BGA이다.

 

그리고 그 옆의 Show Generated Files 를 누르고 

 

File name 을 클릭하면 sysconfig 툴로 인해 수정된 코드를 즉시 볼 수 있다. 변경사항은 주로 board.c / board.h 파일을 보면 된다.

참고로 화면 왼쪽에 보이는 Reserve Peripherals 는 주변장치를 제어하는 데 내가 직접 작성한 코드를 쓰려고 하는데 Hardware Resource만 Reserve 하고 싶을 때 사용하면 된다. 지금은 안쓴다.

 

 

 

 

 

 

예제 import하며 설정된 GPIO핀은 지금은 안쓸거니까 삭제해주고 main.c 코드상에서도 관련 코드를 삭제한다.

 

 

 

 

 

 

SCI의 "+" 버튼을 누르고 아래와 같이 설정한다.

 

 

 

 FIFO는 통신속도를 아주 빠르게 설정한 경우나 CPU의 연산부하가 높을 때 송수신을 놓치지 않고 하기 위해 버퍼용도로 쓰인다.

 

수신만 Interrupt Enable 설정한다.

 

 

그리고 Recevie FIFO Interrupt Level 은 1/16 full 로 선택해 RX FIFO에 1 level(1 word)이 쌓였을 때 인터럽트가 걸리도록 설정한다. (만약 interrupt empty 로 설정되어있다면 ISR이 무한호출 될 것이다)

 

 

참고로 Transmit FIFO interrupt level 같은 경우 예를 들어 2레벨로 설정되어 있다면 FIFO에 쌓인 데이터(TXFFST)가 2 word보다 작거나 같은 동안은 계속 인터럽트가 걸릴 것이다.

 

 

PinMux는 데이터시트 19페이지 부터 나와있는 Pin Attributes 를 보고 선택하면 된다.

 

지금 선택한건 337 bga 패키지의 핀넘버인데 보기 쉽게도록 sysconfig 툴에 핀네임도 같이 뜨게 하는 방법이 있다.

상단 오른쪽의 점 세개를 눌러 Preferences & Actions 를 체크하고,

Device Pin Lable 의 Device pin name을 체크하면 GPIOx 번호도 핀 Mux 세팅에 같이 뜬다.

 

 

참고로 그 아래 Switch Target 버튼을 누르면 새로운 EVM(Evaluation Board)으로 Pin Mux와 peripheral 설정을 옮겨가고 충돌 발생시 어떤 충돌이 발생하는지 확인할 수 있는 버튼이다.

 

 

 

 

 

 

다시 돌아가서 SCI 설정에 Register Interrupt Handler 를 체크해주면 핸들러 함수도 등록할 수 있는데 이거는 여기서 안하고 코드상으로 하도록 하겠다.

 

 

걍 누르면 어떤게 생기나 확인만 해본거다. 다시 Register Interrupt Handler는 체크 해제한 뒤 tx 테스트 먼저 해보자

 

//
// Included Files
//
#include "driverlib.h"
#include "device.h"
#include "board.h"
#include <stdio.h>

//
// Main
//
void main(void)
{

    uint16_t loopCounter = 0;
    unsigned char *msg="Hello, world! \0";

    //
    // Initializes system control, device clock, and peripherals
    //
    Device_init();

    //
    // Initializes PIE and clear PIE registers. Disables CPU interrupts.
    // and clear all CPU interrupt flags.
    //
    Interrupt_initModule();

    //
    // Initialize the PIE vector table with pointers to the shell interrupt
    // Service Routines (ISR).
    //
    Interrupt_initVectorTable();

    //
    // Board Initialization
    //
    Board_init();

    //
    // Enables CPU interrupts
    //
    Interrupt_enableMaster();



    //
    // Loop.
    //
    for(;;)
    {

        SCI_writeCharArray(SCIA_BASE, (uint16_t*)msg, 15);

        char temp[10] = {0,};
        sprintf(temp, "%d\r\n", loopCounter);
        SCI_writeCharArray(SCIA_BASE, (uint16_t*)temp, sizeof(temp));
        DEVICE_DELAY_US(500000);
        
        loopCounter++;


    }
}


//
// End of File
//

 

 

 

 

 

 

내가 쓴 것은 Dock 보드에 Serial-to-USB Converter 회로가 내장되어 있어서 5핀 USB만 꼽고 점퍼로 연결해 바로 통신 했는데 만약 그런 회로가 내장되어 있지 않다면 아래와 같은 모듈을 쓰면 된다.

 

 

USB to TTL(RS232)

 

 

 

GND, RX, TX 3개의 핀만 연결하면 되고 RX, TX는 교차로 연결해야 한다. 그리고 칩에 해당하는 드라이버를 PC에 설치하고 Baudrate를 맞추면 터미널을 통해 통신할 수 있다.

 

 

 

참고로 SCI 모듈은 LSPCLK로부터 클락을 공급받는데

 

 

 

Device_init() 함수안을 살펴보면 SYSCLK 200MHz를 4로 분주해서 LSPCLK는 50MHz가 된다.

    //
    // Make sure the LSPCLK divider is set to the default (divide by 4)
    //
    SysCtl_setLowSpeedClock(SYSCTL_LSPCLK_PRESCALE_4);

 

 

그리고 SCIHBAUD, SCILBAUD 레지스터에 의해 Baudrate가 정해지게 된다. 이 부분을 sysconfig 툴로 설정하니 매우 편리하다.