[TMS320F28069 EVM] UART 테스트
UART를 테스트 하기 위해 예제 코드를 수정해서 테스트했다. 기존 TMS320F2808 예제 소스코드와 거의 동일하기 때문에 특별히 수정할것이 없을것 같았는데... 컴파일까지는 에러없이 된다.
다운로드 후 테스트 해보니 UART로 아무런 데이터도 전송되지 않는다.
무엇때문일까?
예제 코드를 보니 TMS320F2808과 같은 구조이다.(거의 코드 수정없이 가능하다. 코드는 문제가 아니라는 것인데...) 그렇다면 큰 문제없어야 할텐데...
클럭이 다르긴 한데.. 클럭이 달라진다고 해도 보레이트만 달라질 뿐 뭐라도 날아와야 하는데..
일단 TMS320F2806x에서 하드웨어 적으로 뭔가 달라진 것이 없는지 체크할 필요가 있다.
핀맵은 동일하고.. 내부 구조나 enable, 클럭등을 확인할 필요가 있다.
혹시 메모리 맵이나. 기타 설정에 문제가 있는것이 아닌지...
데이터시트를 좀더 자세히 들여다 봐야 할것 같다.
TMS320F28069 SCI 블록도
TMS320F28069 SCI UART 초기화코드
코드적으로 한가지 의심스러운 것은 TX,RX인터럽트를 설정하고 있는데... 물론 기존 코드에서도 문제가 없긴하지만 인터럽트 백터가 이상하다면 문제가 될 수 있을것 같다. 이부분 삭제하고 테스트 해볼 필요가 있을것 같다.
SciaRegs.SCICTL2.all =0x0003;
SciaRegs.SCICTL2.bit.TXINTENA =1;
SciaRegs.SCICTL2.bit.RXBKINTENA =1;
->테스트 결과 문제없다. 인터럽트는 사용하지 않으므로 문제가 없다.
무엇이 문제 일까? 항상 새로운 칩들은 문제가 발생하기 마련이다. 이런 문제를 풀어나가는 과정을 즐겨야 한다. 항상 해결하고나면 아무것도 아닌데...
USER Guide를 천천히 읽어보니 약간의 차이를 발견할 수 있다.
문제는 보레이트 설정에 있었던것 같다. 기존 TMS320F2808과는 보레이트 설정에 차이가 있다.
BRR = LSPCLK/8/Baudrate @LSPCLK 20Mhz
결정적으로 TI에서 제공하는 예제코드에 문제가 있다. 보레이트 설정 레지스터(SCIHBAUD, SCILBAUD)가 각각 8비트만 의미 있다.
SciaRegs.SCIHBAUD =0x0000; // 9600 baud @LSPCLK = 20MHz (80 MHz SYSCLK).
SciaRegs.SCILBAUD =0x0103;
TI에서 제공하는것인데.. 좀이상하다. 컴파일러 환경이 달라서 그런가? CCS 4.x에서 테스트 해볼 필요가 있겠다.
->아무튼 아래와 같이 수정하니 잘 동작한다.
SciaRegs.SCIHBAUD =0x0001;
SciaRegs.SCILBAUD =0x0003;
PICCOLO TMS320F28069 UART테스트 예제 소스코드
나머지는 TMS320F2808 기존 코드를 그대로 사용해도 잘 동작한다. 프로그램을 좀 수정하여 printf 도 사용 가능하도록 수정하였다.
UART를 테스트 하기 위해 예제 코드를 수정해서 테스트했다. 기존 TMS320F2808 예제 소스코드와 거의 동일하기 때문에 특별히 수정할것이 없을것 같았는데... 컴파일까지는 에러없이 된다.
다운로드 후 테스트 해보니 UART로 아무런 데이터도 전송되지 않는다.
무엇때문일까?
예제 코드를 보니 TMS320F2808과 같은 구조이다.(거의 코드 수정없이 가능하다. 코드는 문제가 아니라는 것인데...) 그렇다면 큰 문제없어야 할텐데...
클럭이 다르긴 한데.. 클럭이 달라진다고 해도 보레이트만 달라질 뿐 뭐라도 날아와야 하는데..
일단 TMS320F2806x에서 하드웨어 적으로 뭔가 달라진 것이 없는지 체크할 필요가 있다.
핀맵은 동일하고.. 내부 구조나 enable, 클럭등을 확인할 필요가 있다.
혹시 메모리 맵이나. 기타 설정에 문제가 있는것이 아닌지...
데이터시트를 좀더 자세히 들여다 봐야 할것 같다.
TMS320F28069 SCI 블록도
TMS320F28069 SCI UART 초기화코드
void U0_Init(unsigned char baud)
{
InitSciaGpio();
SciaRegs.SCICCR.all =0x0007; // 1 stop bit, No loopback
// No parity,8 char bits,
// async mode, idle-line protocol
SciaRegs.SCICTL1.all =0x0003; // enable TX, RX, internal SCICLK,
// Disable RX ERR, SLEEP, TXWAKE
SciaRegs.SCICTL2.all =0x0003;
SciaRegs.SCICTL2.bit.TXINTENA =1;
SciaRegs.SCICTL2.bit.RXBKINTENA =1;
U0_SetBaud(baud);
SciaRegs.SCICTL1.all =0x0023; // Relinquish SCI from Reset
}
{
InitSciaGpio();
SciaRegs.SCICCR.all =0x0007; // 1 stop bit, No loopback
// No parity,8 char bits,
// async mode, idle-line protocol
SciaRegs.SCICTL1.all =0x0003; // enable TX, RX, internal SCICLK,
// Disable RX ERR, SLEEP, TXWAKE
SciaRegs.SCICTL2.all =0x0003;
SciaRegs.SCICTL2.bit.TXINTENA =1;
SciaRegs.SCICTL2.bit.RXBKINTENA =1;
U0_SetBaud(baud);
SciaRegs.SCICTL1.all =0x0023; // Relinquish SCI from Reset
}
코드적으로 한가지 의심스러운 것은 TX,RX인터럽트를 설정하고 있는데... 물론 기존 코드에서도 문제가 없긴하지만 인터럽트 백터가 이상하다면 문제가 될 수 있을것 같다. 이부분 삭제하고 테스트 해볼 필요가 있을것 같다.
SciaRegs.SCICTL2.all =0x0003;
SciaRegs.SCICTL2.bit.TXINTENA =1;
SciaRegs.SCICTL2.bit.RXBKINTENA =1;
->테스트 결과 문제없다. 인터럽트는 사용하지 않으므로 문제가 없다.
무엇이 문제 일까? 항상 새로운 칩들은 문제가 발생하기 마련이다. 이런 문제를 풀어나가는 과정을 즐겨야 한다. 항상 해결하고나면 아무것도 아닌데...
USER Guide를 천천히 읽어보니 약간의 차이를 발견할 수 있다.
문제는 보레이트 설정에 있었던것 같다. 기존 TMS320F2808과는 보레이트 설정에 차이가 있다.
BRR = LSPCLK/8/Baudrate @LSPCLK 20Mhz
결정적으로 TI에서 제공하는 예제코드에 문제가 있다. 보레이트 설정 레지스터(SCIHBAUD, SCILBAUD)가 각각 8비트만 의미 있다.
SciaRegs.SCIHBAUD =0x0000; // 9600 baud @LSPCLK = 20MHz (80 MHz SYSCLK).
SciaRegs.SCILBAUD =0x0103;
TI에서 제공하는것인데.. 좀이상하다. 컴파일러 환경이 달라서 그런가? CCS 4.x에서 테스트 해볼 필요가 있겠다.
->아무튼 아래와 같이 수정하니 잘 동작한다.
SciaRegs.SCIHBAUD =0x0001;
SciaRegs.SCILBAUD =0x0003;
PICCOLO TMS320F28069 UART테스트 예제 소스코드
나머지는 TMS320F2808 기존 코드를 그대로 사용해도 잘 동작한다. 프로그램을 좀 수정하여 printf 도 사용 가능하도록 수정하였다.
#include "system.h"
#include "serial.h"
void main(void)
{
unsigned int cnt = 0;
//DSP System Initialize
SystemInit();
DebugInit(BAUD_115200);
DebugPrint("TMS320F28069 EVM Serial Test(%d)Mhz\r\n", _SYS_CLK);
Led1Init();
Led2Init();
Led1On();
while(1)
{
if(DebugIsByte())
{
switch(U0_GetByte())
{
case '0':
Led1Off();
DebugPrint("LED OFF\r\n");
break;
case '1':
Led1On();
DebugPrint("LED ON\r\n");
break;
case '+':
DebugPrint("Cnt Value=%d(0x%02X)\r\n", cnt++);
break;
}
}
}
}
#include "serial.h"
void main(void)
{
unsigned int cnt = 0;
//DSP System Initialize
SystemInit();
DebugInit(BAUD_115200);
DebugPrint("TMS320F28069 EVM Serial Test(%d)Mhz\r\n", _SYS_CLK);
Led1Init();
Led2Init();
Led1On();
while(1)
{
if(DebugIsByte())
{
switch(U0_GetByte())
{
case '0':
Led1Off();
DebugPrint("LED OFF\r\n");
break;
case '1':
Led1On();
DebugPrint("LED ON\r\n");
break;
case '+':
DebugPrint("Cnt Value=%d(0x%02X)\r\n", cnt++);
break;
}
}
}
}
반응형