SCI : Serial Communication Interface
비동기 통신 방식(UART : Universal Asynchronous Receive and Transmit)
범용 컴퓨터와 주로 RS-232C 규격으로 데이터를 교환한다. 장거리 통신이 가능하고 281X DSP가 150MHz 구동시 지원 가능한 최고 속도는 9.375Mbps라 한다.
FIFO(First In First Out)가 버퍼 역할을 해주기에 CPU가 통신에 대한 작업 부담을 덜 수 있다.
시리얼 부트로더 사용시 PC와 DSP간 Baud Rate가 정확히 맞아 떨어져야 한다.
고속 트랜시버가 필요한데, MAX3232의 경우 250Kbps에 불과하지만 SN75C3232와 같은 트랜시버는 1Mbps까지 지원한다.
=============================================================================================================
출처 : http://blog.naver.com/zeratool2/80113821155
28335는 3개의 SCI모듈을 지원하고 있고 이 셋 모두 그 형태가 같다.
또한 SCI는 LSPCLK의 클럭값을 가진다.
FIFO에 대해서는 위 그림을 보면 대충 이해가 갈것이라 본다. First In First Out 말 그대로 처음 들어온 송.수신값이 제일 우선 처리된다는 뜻으로 이해된다.
SCI-A의 레지스터이다. B,C또한 같다.
Description을 보면 그 내용 또한 명확히 알 수 있다.
SCICCR : SCI Communication Control Register
7 | Stop Bits | 0이면 1Stop Bits 1이면 2Stop Bits |
6 | EVEN/ODD PARITY | 0 : 홀수 패리티 1 : 짝수 패리티 |
5 | PARITY ENABLE |
0 : 패리티 비트를 사용하지 않는다 1 : 패리티 비트를 사용한다 |
4 | LOOPBACK |
루프백 모드의 사용여부를 결정한다. LoopBack Mode : 28335의 TX핀과 RX핀을 내부적으로 연결하여 TX핀으로 나가는 데이터가 다시 RX핀으로 들어오는 echo mode라고 할 수 있다. 송신 신호를 수신하여 송신값을 확인할 수 있다. |
3 | IDLE/ADDR MODE |
0 : idle-line 모드 프로토콜 사용 1 : address-bit 모드 프로토콜 사용 idle-line 모드는 일반적인 1:1 통신 프로토콜이며 Address-bit모드 프로토콜은 한 비트를 추가한 다중 프로세서 통신 프로토콜이다. RS-232타입과는 호환되지 않고 이를 지원하는 프로세서 사이에서만 사용 가능하다. |
2-0 | SCICHAR2-0 |
세 개의 비트로 0에서 7까지 선택할 수 있으며, 한 통신 패킷에 몇 개의 데이터 비트를 담을 것인지 결정한다. 0일 때 1개 비트, 7일 때 8개 비트를 담겠다는 뜻이다.(N+1) |
SCICTL1 : SCI Control Register1
6 |
RX ERR INT ENA |
통신 에러가 있을 때, SCIRXST의 7번 비트가 1로 set된다. 이 때 인터럽트의 가부를 설정한다. 1일 때 인터럽트 허용. 0일 때 허용하지 않는다 |
5 |
SW RESET |
값이 0일 때, SCI모듈의 플래그 값들을 모두 초기화 한다. 전송 속도 및 기타 다른 설정에는 영향을 미치지 않는다. 0인 동안에는 플래그 값이 초기화 된 채로 변경이 불가능하며 다시 1이 되었을 때 비로소 플래그 값이 SCI모듈의 상태에 따라 변화한다. |
3 |
TXWAKE |
다중 프로세서 관련. |
2 |
SLEEP |
다중 프로세서 관련 |
1 |
TXENA |
송신 사용 여부를 설정한다. SCITXEMU와 SCITXBUF로부터 데이터 출력을 차단(0)할 것인지 내보낼(1) 것인지를 결정한다. |
0 |
RXENA |
수신 사용 여부를 설정한다. SCIRXEMU와 SCIRXBUF로부터 데이터 입력을 차단(0)할 것인지 내보낼(1) 것인지를 결정한다. |
SCIHBAUD, SCILBAUD :
통신속도를 정하기 위한 레지스터로 아래의 공식에 따라 결정 된다.
통신속도 = LSPCLK/[(레지스터값+1)*8]
16비트 레지스터를 사용하므로 값은 0부터 65535까지 설정 할 수 있다.
SCICTL2 : SCI Control Register2
7 |
TXRDY |
값이 1일 때, 송신버퍼(SCITXBUF)가 준비됐음을 나타내는 상태비트이다. 즉, 송신버퍼가 비어있으니 전송할 데이터를 받을 수 있다는 의미이다 |
6 |
TX EMPTY |
값이 1일 때, 송신버퍼와 송신 시프트 레지스터(TXSHF)가 모두 비워져 있는 상태를 나타낸다. |
1 |
RX/BK INT ENA |
값이 1일 때, 수신 인터럽트를 허용한다. |
0 |
TX INT ENA |
값이 1일 때, 송신 인터럽트를 허용한다. |
SCIRXST : SCI Receiver Status Register
7 |
RX ERROR |
수신 상태에서 에러가 있음을 알려주는 플래그. 브레이크 검출, 프레이밍 에러, 오버런 패리티 에러 중 하나 이상이 발생하면 비트가 1로 바뀐다. |
6 |
RXRDY |
수신 완료 플래그, 데이터 한 프레임이 모두 도착 했을 때, 이 플래그가 1로 바뀐다. |
5 |
BRKDT |
브레이크 검출 플래그. 브레이크 상황이 발생하면 이 비트가 1로 바뀐다 |
4 |
FE |
프레이밍 에러 플래그 |
3 | OE | 오버런 에러 플래그 |
2 | PE | 패리터 에러 플래그 |
1 | RXWAKE | 수신 웨이크 업 검출 플래그 |
SCIRXBUF : Reciver Data Buffer
15 |
SCIFFFE |
FIFO모드에서 프레이밍 에러가 발생하면 1로 바뀐다. |
14 |
SCIFFPE |
FIFO모드에서 패리티 에러가 발생하면 1로 바뀐다. |
7-0 |
RXDT |
수신된 데이터가 저장된다. 저장이 완료 되면, SCICTL2의 RX/BK INT 플래그 비트가 1로 바뀌고, 데이터를 읽으면 플래그가 다시 0으로 클리어 된다 |
SCITXBUF : SCI Transmit Data Buffer Register
SCI모듈에서 전송할 데이터를 집어 넣는 레지스터 이다. 이 레지스터에 데이터를 집어 넣으면, TXSHF레지스터를 통해 데이터가 밖으로 전송된다.
SCIRXEMU : SCI Emulation Data Buffer
에뮬레이터에 의해 SCIRXBUF레지스터를 보고자 할 때 사용된다.
SCIFFTX : SCI FIFO Registers[Transmit]
15 |
SCIRST |
값이 0일 때, 수신/송신 FIFO채널을 초기화 한다. FIFO설정은 그대로 남는다. 1을 쓰면 다시 재 기능을 하게 된다. |
14 |
SCIFFENA |
1을 쓰면, FIFO기능을 활성화 한다. |
13 |
TXFIFO Reset |
1일 때, 송신 FIFO 포인터를 초기화 하고, 그 상태를 유지한다. 0일 때, 다시 활성화 된다. |
12-8 |
TXFFST4-0 |
송신 FIFO에 데이터가 몇 BYTE 들어와 있는지를 표시해 준다. |
7 |
TXFFINT Flag |
TX FIFO인터럽트 상태를 나타내는 플래그 비트이다. 1이면 인터럽트가 요청된 것이다. |
6 |
TXFFINT CLR |
1을 쓰면, TXFFINT Flag를 클리어한다. |
5 |
TXFFIENA |
송신 FIFO 인터럽트의 사용 가불을 설정한다. 1이면 인터럽트를 허용한다. |
4-0 |
TXFFIL4-0 |
송신 FIFO에 몇 바이트가 차면 인터럽트를 발생시킬 것인지를 설정하는 레지스터이다. 즉, TXFFIL과 TXFFST의 값이 일치할 때, 인터럽트가 발생한다. |
SCIFFRX : SCI FIFO Registers[Receiver]
15 |
RXFFOVF |
수신 FIFO에 16바이트가 모두 차고 1바이트가 더 전송되어 오버플로우가 일어났을 때, 1로 리셋된다. |
14 |
RXFFOVR CLR |
1이면 RXFFOVF비트를 클리어 시킨다 |
13 |
RXFIFO Reset |
1일 때, 수신 FIFO포인터를 초기화 하고, 그 상태를 유지한다. 1일 때, 다시 활성화 된다. |
12-8 |
RXFFST4-0 |
수신 FIFO에 데이터가 몇 BYTE들어와 있는지를 표시해 준다. |
7 |
RXFFINT Flag |
수신 FIFO 인터럽틑 상태를 나타내는 플래그 비트이다. 1이면 인터럽트가 요청된 것이다. |
6 |
RXFFINT CLR |
1을 쓰면, RXFFINT Flag를 클리어 한다. |
5 |
RXFFIENA |
수신 FIFO 인터럽트의 사용 가불을 설정한다. 1이면 인터럽트를 허용한다. |
4-0 |
RXFFIL4-0 |
수신 FIFO에 몇 바이트가 차면 인터럽트를 발생시킬 것인지를 설정하는 레지스터이다. |
SCIFFCT : SCI FIFO Registers[Control]
15-13 |
ABD, ABD CLR,CDC |
Auto-baud detect기능을 사용하기 위한 설정으로써, 외부에서 들어오는 데이터의 전송속도를 자동으로 측정하는 기능이다. 사용방법: 1.CDC비트를 1로하고 ADBCLR에 1을써 ABD 비트를 0으로 한다.->autobaud-detect 모드 진입 2.보레이트 레지스터(?)를 1이나 0으로 하여 보레이트를 500Kbps로 세팅한다. 3.RX핀으로 문자가 수신되게끔 한다.->내부적으로 수신되는 데이터의 보레이트를 계산하게됨 ->ABD비트가 1로 바뀐다. 4.자동으로 보레이트 레지스터가 감지된 속도로 셋팅되고 CPU에 수신 완료 인터럽트를 요청한다 5.인터럽트에서 SCIFFCT레지스터의 ABD CLR비트를 1로 써주어 ABD비트를 0으로 클리어 해주고, CDC비트도 0으로 클리어 해주어야 한다. 마지막으로 수신 된 문자를 읽어온다. |
7-0 |
FFTXDLY7-0 |
TX FIFO모드에서 TXSHF레지스터와 FIFOTXBUF레지스터 사이에 데이터가 복사되는 주기(딜레이)를 결정한다. TX FIFO모드에서 사용작 SCITXBUF레지스터에 데이터를 집어 넣으면 그 데이터는 곧바로 FIFOTXBUF에 복사되고, 또 곧바로 TXSHF레지스터에 복사되는데 여기에서 FIFOTXBUF에서 TXSHF로 복사되는 주기(딜레이)를 결정하는것 |
딜레이 계산 방법
딜레이 시간 = 1/(통신속도[bps])*FFTXDLY(8bit)
SCIPRI : SCI Priority Control Register
SCI통신 중에 에뮬레이터에 의해 브레이크가 걸렸을 경우, 어떻게 동작할 것인가를 결정한다.
00 : 즉시 멈춘다.
10 : 현재의 TX또는 RX동작이 끝난 후에 멈춘다.
X1 : 브레이크와 상관없이 계속 동작한다.
'TMS320 > F28335' 카테고리의 다른 글
인터럽트 관련 소스 (0) | 2014.08.20 |
---|---|
2812와 달라진 28335의 주변회로 (0) | 2014.08.20 |
Cpu Timer(2) (0) | 2014.08.19 |
Cpu Timer(1) (1) | 2014.08.19 |
ADC(2) (0) | 2014.08.18 |