[MCU]/CANTUS2011. 4. 10. 20:59

[CANTUS EVM] SPI테스트 - SPI 가속도 센서 테스트

[CANTUS EVM] SPI테스트 - SPI 가속도 센서 테스트



CANTUS의  SPI구조는 아래 그림과 같고 특징적으로는 8Byte FIFO가 있다.



CANTUS SPI테스트를 위해 [NET-EVM]보드의 가속도 센서를 테스트 해 보았다.
가속도센서의 SPI CS핀은 P5.2에 연결되어 있다.



ADChip사에서 제공하는 드라이버코드는 여러기능을 위해 작성되어 있기 때문에 속도 면이나 기존 코드를 위해 그냥 사용하기는 힘들다. 데이터시트보고 로레벨로 작성해 보았다.
SUINT SPI0_WriteReadByte(SUINT Data)
{
 //SPI포트로 데이터 출력 
 *R_SPI0DATA = Data;
 
 // 전송대기
 while (!(*R_SPI0STAT & SPISTAT_SPIF));
 
 //데이터 수신
 return *R_SPI0DATA;
}


CANTUS SPI모드 설정



CANTUS SPI테스트 동영상




CANTUS SPI 테스트 코드
#include "system.h"
#include "serial.h"
#include "myAccel.h"

int main()
{
 short data;
 
 SystemInit();

 Led1Init();
 Led1On();

 U0_Init(BAUD_115200);
 DebugPrint("CANTUS SPI - Accel LIS3LV02 Test\r\n");

 //가속도 센서 초기화
 myAccel3lvInit();
 myAccel3lvWrite(CTRL_REG1, 0xC7);
 
 while(1)
 {
  if(U0_IsGetByte())
  {
   switch(U0_GetByte())
   {
    case '0':
     DebugPrint("Led1 Off\r\n");
     Led1Off();
     break;

    case '1':
     DebugPrint("Led1 On\r\n");     
     Led1On();
    break;
    
    case 'i':
     myAccel3lvWrite(CTRL_REG1, 0xC7);  //1000.0111 Power on, enable all axis, self test off
     DebugPrint("Accel Init\r\n");
     break;   

    case 'r':
     data = myAccel3lvRead(WHO_AM_I);

     DebugPrint("Who am I? 0x%02X\r\n", data);  
     break; 
     
    case 'x':
     GetAccelValue(AXIS_X, &data);

     DebugPrint("%d\r\n", data);  
     break; 
   }
  }
Posted by nexp

댓글을 달아 주세요

[MCU]/CANTUS2011. 4. 3. 03:04

[CANTUS EVM] TFT LCD제어

[CANTUS EVM] TFT LCD제어



[LCD-EXP EVM]
보드를 이용하여 CANTUS로 COM26T2844 TFT LCD를 제어 해 보려고 한다.
환경설정이 달라지면서 여러가지 문제점이 많다. 기존 소스를 포팅하니 오류가 많이 뜬다.
-> 문제는 디렉토리 설정에서 현재 자신의 프로젝트를 가리키는 설정에 문제가 있었다.
-> 그냥 "." 기입하면 자신의 디렉토리가 설정된다.



CANTUS의  GPIO 출력 레지스터는 일반 MCU와 달리  Low, High를 PxOHIGH, PxOLOW에 각각 따로 설정해야 한다. 특히 LCD와 같이 데이터를 포트제어로 해야 할때 문제가 있다. 두번 제어 해야 하므로 속도도 문제가 되고...

아무튼 기존 다른 MCU에서 사용했던 코드를 포팅 했는데.. TFT LCD가 정상 동작 하지 않는다.
왜 이렇게 만들었을까?

#define _LCD_DAT_OUT(Data)    *R_P0oLOW=0xFF;*R_P0oHIGH = (Data&0xFF);\
                                                          *R_P1oLOW=0xFF;*R_P1oHIGH = ((Data>>8)&0xFF);


스코프로 하나씩 찍어보자..
-> 문제는 /RD 쪽 포트 설정에 문제였던것 같다.
//-----------------------------------------------------------------------------
// TFT LCD Driver
#define TFT_DRV_HD66791     0
#define TFT_DRV_COM44     1

#define LCD_LAT_BIT      
#define LCD_LAT_PORT     
#define LCD_LAT_ON()     
#define LCD_LAT_OFF()     
#define LCD_DATA_LATCH()    LCD_LAT_ON();LCD_LAT_OFF();

#define LCD_EN_BIT      BIT5
#define LCD_EN_PORT      
#define LCD_ENABLE()     Sbi(*R_P5oLOW, LCD_EN_BIT)
#define LCD_DISABLE()     Sbi(*R_P5oHIGH, LCD_EN_BIT)

#define LCD_RST_BIT      BIT6
#define LCD_RST_PORT     
#define LCD_RST_OFF()     Sbi(*R_P2oLOW, LCD_RST_BIT)
#define LCD_RST_ON()     Sbi(*R_P2oHIGH, LCD_RST_BIT)

#define LCD_RS_BIT      BIT7
#define LCD_RS_PORT      
#define LCD_RS_OFF()     Sbi(*R_P2oLOW, LCD_RS_BIT)
#define LCD_RS_ON()      Sbi(*R_P2oHIGH, LCD_RS_BIT)

#define LCD_WR_BIT      BIT3
#define LCD_WR_PORT      
#define LCD_WR_OFF()     Sbi(*R_P2oLOW, LCD_WR_BIT)
#define LCD_WR_ON()      Sbi(*R_P2oHIGH, LCD_WR_BIT)

#define LCD_RD_BIT      BIT2
#define LCD_RD_PORT      
#define LCD_RD_OFF()     Sbi(*R_P2oLOW, LCD_RD_BIT)
#define LCD_RD_ON()      Sbi(*R_P2oHIGH, LCD_RD_BIT)

#define LCD_BL_BIT      BIT4
#define LCD_BL_PORT      
#define LCD_BL_OFF()     Sbi(*R_P5oLOW, LCD_BL_BIT)
#define LCD_BL_ON()      Sbi(*R_P5oHIGH, LCD_BL_BIT)

#define _LCD_DAT_OUT(Data)    *R_P0oLOW=0xFF;*R_P0oHIGH = (Data&0xFF);\
          LCD_DATA_LATCH();\
          *R_P1oLOW=0xFF;*R_P1oHIGH = ((Data>>8)&0xFF);

#define TFTGpioInit()     Sbi(*R_PAF5, (3<<4));Sbi(*R_PAF5, (3<<5));*R_P0oDIR = 0xFF;\
          *R_P1oDIR = 0xFF;\
          *R_P2oDIR = 0xFF;\
          *R_P5oDIR = 0xFF;


이제 정상 동작한다.
그런제 JTAG다운로드가 너무 느리다. 80Kbyte의 간단한 이미지를 다운하는데 1분가까이 걸린다. 이건뭐... 시리얼보다 느리니.. 개발하지 말라는건지...

일단 LCD출력속도를 한번 테스트 해 보았다.

LCD_EXP_EVM 를 이용한 속도 테스트 결과와 비교해 볼 수 있다.




SD에 저장해서 출력하는 방식을 취해보았다. 잘 동작한다.



CANTUS 512 SD Card사용 TFT LCD테스트 동영상

 



Posted by nexp

댓글을 달아 주세요

[MCU]/CANTUS2011. 4. 3. 01:30

[CANTUS EVM] SD Card 테스트

[CANTUS EVM] SD Card 테스트



CANTUS 는 SDIO를 지원하므로 SD Card를 고속으로 접근할 수 있다. [CANTUS EVN]보드 뒷면에는 T-Flash를 연결할 수 있도록 해서 SDIO를 테스트 해 볼 수 있다.

[CANTUS EVM] SD Card 회로도





CANTUS개발환경의에는 SD Card제어를위한 라이버러리를 제공기 때문에 쉽게 테스트 가능하다.
#include "system.h"
#include "serial.h"

unsigned int scan_files (char* path)
{
 unsigned int file_cnt = 0;
    FRESULT res;
    FILINFO fno;
    DIR dir;
    int i;
    char *fn;
 
#if _USE_LFN
    static char lfn[_MAX_LFN * (_DF1S ? 2 : 1) + 1];
    fno.lfname = lfn;
    fno.lfsize = sizeof(lfn);
#endif

 DebugPrint("Open..");
    res = f_opendir(&dir, path);
 
    if (res == FR_OK) {
        i = strlen(path);
  DebugPrint("OK.");
        for (;;) {
            res = f_readdir(&dir, &fno);
            if (res != FR_OK || fno.fname[0] == 0) break;
#if _USE_LFN
            fn = *fno.lfname ? fno.lfname : fno.fname;
#else
            fn = fno.fname;
#endif
            if (fno.fattrib & AM_DIR) {
                DebugPrint("[D]%s\r\n",fn);
            } else {
                DebugPrint("%s/%s : \t\t %dbyte\r\n", path, fn,fno.fsize);
            }
        }
    }
 else{
  DebugPrint("path(%s) not found:Error(%d)\r\n",path,res);
  
 }
 
    return file_cnt;
}

int main()
{
 FATFS fs;
 int file_cnt;
 
 SystemInit();
 
 DebugInit(BAUD_115200);
 DebugPrint("CANTUS SD Card Test3\r\n");
  
 DebugPrint("System Clock(%dMhz)\r\n",GetAHBclock()/1000000); 

 Led1Init();
 Led1On();

 DebugPrint("Mount..."); 
 if(f_mount(DRIVE_SDCARD,&fs) != FR_OK)
 {
  DebugPrint("Error");
  while(1);
 }
 else DebugPrint("OK\r\n");
 
 DebugPrint("File Search:\r\n");
 
 file_cnt = scan_files("1:");
 DebugPrint("file count:%d\r\n", file_cnt);
 while(1);

 return 1;
}




CANTUS SD Card테스트 결과
SD Memory Card
Identification Mode Start
the mandatory maximum operating frequency of SD Memory Card : 25Mhz
SD Memory Size : 485Mbyte ,Blocksize:512byte
SD CARD Initialize Completed
SDCard operating frequency:18800640
OK.
File Search:
1:/a_3.bmp :    192054byte
1:/a_12.bmp :    192054byte
1:/img1.bmp :    192054byte
1:/img2.bmp :    192054byte
file count : 4
Posted by nexp

댓글을 달아 주세요

[MCU]/CANTUS2009. 12. 19. 19:10

[CANTUS EVM] UART테스트

[CANTUS EVM] UART테스트

CANTUS는 8채널의 16450호환 UART가 있다. FIFO도 16Byte가 있고.. 멋지다.



CANTUS에서 UART제어를 위해 Seial.c에 있는 U0_GetByte(), U0_PutByte()를 수정해 주면 된다.  ADChip사에서 제공되는 코드는 너무많은 기능을 제공하려다 보니 오히려 복잡하고 속도도 느려질 수 있다. 그래서 데이터시트를 보고 간단히 작성해 보았다.
#define UART0_LSR   *(volatile unsigned long*)((unsigned long)R_UART0_BASE + UART_LSR) 
#define UART0_URDR   *(volatile unsigned long*)((unsigned long)R_UART0_BASE + UART_RBR)
#define UART0_UTDR   *(volatile unsigned char*)((unsigned long)R_UART0_BASE + UART_THR)

unsigned char U0_GetByte(void)
{
 while((UART0_LSR & ULSR_DRDY))
 {
  return UART0_URDR;
 }

void U0_PutByte(unsigned char Data)
{
 while(!(UART0_LSR & ULSR_TEMP));
 UART0_UTDR = Data;
}



CANTUSPIC32 UART테스트 예제코드
#include "system.h"
#include "serial.h"

int main()
{
 SystemInit();

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

 U0_Init(BAUD_115200);
 DebugPrint("Cantus EVM1\r\n");
 
  while(1)
 {
  if(U0_IsGetByte())
  {
   switch(U0_GetByte())
   {
    case '0':
     DebugPrint("Led1 Off\r\n");
     Led1Off();
     break;
    case '1':
     DebugPrint("Led1 On\r\n");     
     Led1On();
    break;
   } 
  }

Posted by nexp
TAG CANTUS

댓글을 달아 주세요

[MCU]/CANTUS2009. 12. 17. 15:00

[CANTUS EVM] GPIO를 이용한 LED테스트

[CANTUS EVM] GPIO를 이용한 LED테스트

CANTUS의 GPIO는 아래 그림과 같은 구조이다.
구조는 그리 복잡하지 않은데... 한가지 아쉬운점은 Data 레지스터가 HIGH레지스터, LOW레지스터로 나누어져 있어 데이터버스처럼 쓰기가 효율적이지 못한점과 토글할때도 번거러운점이 있다.



GPIO기능설정
각포트는 여러기능을 할 수 있기 때문에 먼저 PAFx레지스터에 GPIO모드로 사용할것을 설정하는 것이 필요하다.




GPIO방향 설정
GPIO의 입출력 방향 설정은 DIR레지스터로 설정 가능하다.

#define Led1Init()     Sbi(*R_PAF5, (3<<(2*4)));Sbi(*R_P5oDIR, LED1_BIT)


[CANTUS EVM] 보드의 LED회로도



[CANTUS EVM] LED 드라이버 코드
//-----------------------------------------------------------------------------
// On board LED
#define LED1_BIT     BIT4
#define LED1_PORT

#define Led1Init()     Sbi(*R_PAF5, (3<<(2*4)));Sbi(*R_P5oDIR, LED1_BIT)
#define Led1Off()     sbi(*R_P5oHIGH, LED1_BIT)
#define Led1On()     cbi(*R_P5oLOW, LED1_BIT)

#define LED2_BIT     BIT5
#define LED2_PORT

#define Led2Init()     Sbi(*R_PAF5, (3<<(2*5)))F;Sbi(*R_P5oDIR, LED2_BIT)
#define Led2Off()     sbi(*R_P5oHIGH, LED2_BIT)
#define Led2On()     cbi(*R_P5oLOW, LED2_BIT)
//-----------------------------------------------------------------------------
Posted by nexp
TAG CANTUS

댓글을 달아 주세요