[DSP]/PICCOLO2011. 4. 29. 22:30

[TMS320F28069 EVM] UART 테스트

[TMS320F28069 EVM] UART 테스트


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
}


코드적으로 한가지 의심스러운 것은  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;
   } 
  }
 }
}  
Posted by nexp

댓글을 달아 주세요

[INTERFACE]/iMCU_W71002010. 11. 20. 23:22

[W7100 EVM] 예제프로그램 작성 - UART 제어 (printf 를 이용한 디버깅)

[W7100 EVM] 예제프로그램 작성 - UART 제어 (printf 를 이용한 디버깅)




8051에서 UART제어를 위한 보레이트 설정 모드는 Mode0~3의 4가지가 있다.





Keil 에서 printf를 사용하기위해서는 putchar()함수를 재 정의해 주어야 한다. serial.c 에 아래 함수들 추가하면 된다.
char putchar (char c) 
{
  // Write data into serial-buffer.
 SBUF = c;
 // Wait till data recording is finished.
 while(!TI);
 TI = 0;
 return c;
}


W7100 UART테스트 예제 코드
void main()
{
 unsigned int cnt = 0;
 SystemInit();  //Initialize iMCU

 Led1Init();
 Led1On();
 Led2Init();
 Led2Off();

//시리얼 포트 초기화
 U0_Init(BAUD_115200);
 U0_PutStr("iMCU Serial Test\r\n");

 while(1)
 {
   switch(DebugGetByte())
   {
    case '1':
     Led1On();
     printf("LED1 On %d\r\n", cnt++);
     break;
    
    case '0':
     Led1Off();
     printf("LED1 Off\r\n");
     break;
   }
 }
}




* 8051에서 printf 사용시 주의 사항
unsigned char 형 데이터를 출력하면 이상하게 출력된다. (unsigned) int형으로 캐스팅 해 주어야  정상동작한다.

Posted by nexp
TAG printf, W7100

댓글을 달아 주세요