K20 EVM - SPI 테스트 3축 가속도 센서값을 TFT LCD 그래프로 표시하기



SPI 를 쉽고 재미 있게 테스트하기 위해 가속도 센서를 활용할 수 있다. LIS3LV02 3축 가속도 센서를 SPI모드로 설정하고 확장 EVM보드에 연결하여 테스트 할 수 있다. 

SPI 방식으로 센서를 설정하거나 3축 가속도 센서값을 읽을 수 있다.



K20 SPI모드 가속도 센서 테스트 동영상




K20 가속도 센서 테스트 드라이버 코드
//-----------------------------------------------------------------------------
// myAccel3LV02 HAL
#define MY_ACCEL3LV02_SPI_MODE 1
#define MY_ACCEL3LV02_I2C_MODE 0

#define ACCEL_CS_BIT BIT2
#define ACCEL_CS_PORT GPIOC

#define ACCEL_CS_INIT() SIM_SCGC5 |= SIM_SCGC5_PORTC_MASK;\
PORTC_PCR2 = PORT_PCR_MUX(1);\
Sbi(GPIOC_PDDR, ACCEL_CS_BIT); 

#define ACCEL_CS_ASSERT() cbi(ACCEL_CS_PORT, ACCEL_CS_BIT)
#define ACCEL_CS_DEASSERT() sbi(ACCEL_CS_PORT, ACCEL_CS_BIT)
#define ACCEL_SPI_INIT() SPI0_Init()
#define ACCEL_Read SPI0_WriteReadByte
#define ACCEL_Write SPI0_WriteReadByte
//-----------------------------------------------------------------------------



MSP430FR5739 EVM - 6축 가속도 자이로 센서 테스트

 

 

 

MSP430FR5739는 FRAM기반의 저전력 MCU로 1조번의 기록에도 문제가 없다고 하니 데이터 기록이 빈번한 센서 데이터 로깅 시스템에 적용하면 좋다.

따라서 MSP430F5739를 이용하여 6축 가속도, 자이로 센서 데이터 로깅 시스템을 테스트 해 보았다.

 

 

테스트를 위해 [NET-EVM] 보드를 이용하였고 센서는 6축 SD746을 이용했다. 6축 자이로, 가속도 센서는 SPI방식으로 제어하고 CS는 A_8번 커넥터인 P3.7에 연결되어 있다.

 

 

 

 

MSP430FR5739 SD746제어 HAL 드라이버 코드

주의 사항은 SD746과 통신을 위해  SPI모드를 1으로 설정해야 정상 동작 한다.

 //-----------------------------------------------------------------------------
#define _SPI1_ENABLE    1

 

//USCIA1 for MSP430FR5739
#define _SPI1_PxSEL   P2SEL0
#define _SPI1_PxSEL1   P2SEL1
#define _SPI1_PxDIR   P2DIR
#define _SPI1_PxIN    P2IN

#define _SPI1_SIMO    BIT5
#define _SPI1_SOMI    BIT6
#define _SPI1_UCLK    BIT4

 

#define MY_SD746_SPI_MODE   1

#define ACCEL_CS_INIT()    Sbi(P3DIR, BIT7)
#define ACCEL_CS_ASSERT()   Cbi(P3OUT, BIT7)
#define ACCEL_CS_DEASSERT()   Sbi(P3OUT, BIT7)

#define MYSD746_SPI_INIT()   SPI1_Init();SPI1_SetMode(_SPI_MODE1)
#define ACCEL_Read     SPI1_WriteReadByte
#define ACCEL_Write     SPI1_WriteReadByte
//-----------------------------------------------------------------------------

 

 

 

MSP430FR5739 6축 가속도 자이로 센서 테스트 동영상

 

 

 

6축 가속도, 자이로 센서 데이터를 MSP430FR5739의 FRAM영역에 저장하고 확인을 위해 시리얼 포트로 전송하여 그래프로 표시 했다. 

 [adStar EVM] 3축가속도 센서 테스트 - TFT LCD출력

 

 

[NET-EVM] 보드에는 I2C(SPI)로 연결되는 자이로, 가속도, 온도, 압력 센서등의 모듈을 연결할 수 있는 표준핀맵 커넥터가 있다.

 

SM-Type EVM 에는 핀 8번에, M-Type EVM에는 핀 P13번(adStar EVM의 P0.0)에 CS핀이 할당되어 있다.

 

 

 

adStar 가속도 센서 드라이버 코드

#define _SPI1_ENABLE     1

//-----------------------------------------------------------------------------
// myAccel3LV02 HAL
#define MY_ACCEL3LV02_SPI_MODE   1
#define MY_ACCEL3LV02_I2C_MODE   0

#define ACCEL_CS_BIT     BIT0
#define ACCEL_CS_PORT     GPIO0

#define ACCEL_CS_INIT()     Sbi(*R_PAF0, GP_CFG(0));Sbi(*R_GP0ODIR, ACCEL_CS_BIT)


#define ACCEL_CS_ASSERT()    cbi(ACCEL_CS_PORT, ACCEL_CS_BIT)
#define ACCEL_CS_DEASSERT()    sbi(ACCEL_CS_PORT, ACCEL_CS_BIT)

#define ACCEL_SPI_INIT()    SPI1_Init()
#define ACCEL_Read      SPI1_WriteReadByte
#define ACCEL_Write      SPI1_WriteReadByte
//-----------------------------------------------------------------------------

 

 

 

adStar 가속도 센서 테스트 동영상

가속도 센서 데이터를 TFT LCD에 출력하는 테스트

 

 

 

adStar 가속도 출력 테스트 소스코드

int main()
{
    short data;
    unsigned int accel;
 unsigned char buf[6]={0,};
 
 SystemInit();

 Led1Init();
 Led2Init();
 Led1On();
 Led2Off();
 
 U0_Init(BAUD_38400);
 DebugPrint("ADstar EVM1\r\n");
 
 //가속도 센서 초기화
 myAccel3lvInit();
 //SPI1_SetSpeed(SPI_SPEED_4MHZ);     
 
 myAccel3lvWrite(CTRL_REG1, 0xC7);

 data = myAccel3lvRead(WHO_AM_I);
 DebugPrint("Who am I? 0x%02X\r\n", data); 
 
 InitDiaplay();
 
 while(1)
 {
        GetAccelValue(AXIS_X, &data);
       
     if(data&0x0800)accel = (data&0x7FF) -2048;
     else accel = (data&0x7FF);

        //DebugPrint("%d ", accel);
        accel = (2048+accel)/10-100;
        buf[0] = accel>>8;
  buf[1] = (accel&0xFF);

        GetAccelValue(AXIS_Y, &data);
        if(data&0x0800)accel = (data&0x7FF) -2048;
     else accel = (data&0x7FF);
        accel = (2048+accel)/10-100;
        //DebugPrint("%d\r\n", accel);
  
        buf[2] = accel>>8;
  buf[3] = (accel&0xFF);
       
  DisplayPloat(SRL_CMD_PLOTY, buf, 4);
        Delay(30);   
 }
 
 return 0;
}

 

[STM32F4] I2C 테스트 - 3축 가속도 센서 TFT LCD 출력

 

 

3축 가속도 센서를 테스트 해야할 일이 있어 STM32F407 보드를 이용하여 I2C 테스트를 해보았다. 기존 STM32F103 I2C 테스트 코드과 크게 차이 없이 테스트 가능했다.

 

[EXP-NET EVM] 보드에는 I2C(SPI)로 연결되는 자이로, 가속도, 온도, 압력 센서등의 모듈을 연결할 수 있는 표준핀맵 커넥터가 있다.

 

 

 

 

SM-Type EVM 에는 핀 8번에, M-Type EVM에는 핀 13번에 각각 CS핀이 할당되어 있다.

 

 

 

STM32F4 I2C테스트 동영상

STM32F407 을 이요하여 3가속도 센서의 데이터를 TFT-LCD에 그래프로 표시하는 테스트 예제




STM32F4 I2C 초기화 코드

void i2c_init1(unsigned int Speed)
{
 I2C_InitTypeDef  I2C_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);     
    //Configure I2C2 pins: SCL and SDA
    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6| GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;    
    GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;    
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    //Connect pins to I2C peripheral
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_I2C1);  
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_I2C1);

    //I2C2 and I2C2 Periph clock enable
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);

    I2C_DeInit(I2C1);    
 
    //I2C2 configuration
    I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
    I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
    I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
    I2C_InitStructure.I2C_OwnAddress1 = 0x33;
    I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
    I2C_InitStructure.I2C_ClockSpeed = Speed;
    I2C_Cmd(I2C1, ENABLE);
    I2C_Init(I2C1, &I2C_InitStructure);
}

 

 

STM32F4 가속도 센서 I2C 제어 코드 

//-----------------------------------------------------------------------------

// myAccel3LV02 HAL

#define MY_ACCEL3LV02_SPI_MODE 0

#define MY_ACCEL3LV02_I2C_MODE 1


//#define ACCEL_CS_BIT BIT6

//#define ACCEL_CS_PORT PORTB


#define ACCEL_CS_BIT BIT11

#define ACCEL_CS_PORT PORTE


#define ACCEL_CS_INIT() RCC_APB2PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);\

GPIO_InitStructure.GPIO_Pin=ACCEL_CS_BIT;\

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;\

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;\

GPIO_Init(GPIOC, &GPIO_InitStructure);\

ACCEL_CS_DEASSERT()

#define ACCEL_CS_ASSERT() Cbi(ACCEL_CS_PORT, ACCEL_CS_BIT)

#define ACCEL_CS_DEASSERT() Sbi(ACCEL_CS_PORT, ACCEL_CS_BIT)


#define ACCEL_SPI_INIT() SPI0_Init()

#define ACCEL_Read SPI0_WriteReadByte

#define ACCEL_Write SPI0_WriteReadByte



#define myAccelI2C_INIT                 i2c2_init

#define myAccelI2C_START                i2c2_start

#define myAccelI2C_WRITE                i2c2_write

#define myAccelI2C_READ_NAK             i2c2_readNak

#define myAccelI2C_STOP                 i2c2_stop



//-----------------------------------------------------------------------------
//myAccel3LV02의 특정 레지스터에서 데이터를 읽어옴
unsigned char myAccel3lvRead(unsigned char reg)

 unsigned char data = 0; 
 
 myAccelI2C_START(LIS3L02_I2C_ADDR+I2C_WRITE);     // device address 및 write mode 설정
 myAccelI2C_WRITE(reg);

    // 레지스터 설정
 myAccelI2C_START(LIS3L02_I2C_ADDR+I2C_READ);       // device address 및 read mode 설정
   
 data = myAccelI2C_READ_NAK(); 
 myAccelI2C_STOP(); 


 return data;
}

 

//myAccel3LV02의 특정 레지스터에 데이터를 기록
void myAccel3lvWrite(unsigned char reg, unsigned char data)
{
 myAccelI2C_START(LIS3L02_I2C_ADDR+I2C_WRITE);     // device address 및 write mode 설정
 myAccelI2C_WRITE(reg);         // 레지스터 설정
 myAccelI2C_WRITE(data);        // 데이터 출력
 myAccelI2C_STOP();  
}

 

[TMS320C6720] SPI 테스트 - 3축 가속도 센서 CCS 를 이용한 그래프표시 하기

TMS320C6720에는 UART는 없지만 SPI포트가 2채널 있다.
테스트 결과 최대 클럭 스피드는 50Mhz(100Mhz//(1+1))까지 출력은 가능하다. FIFO가 없긴하지만, 클럭 설정도 유연하게 설정가능한것 같고...DMA도 지원한다니 SPI인터페이스에 좋을것 같다.



TMS320C6720SPI 관련 블록도





TMS320C672x SPI 주요 레지스터

SPIFMTx 레지스터
17 :  POLARITY
16 : PHASE
15-8 : PRESCALE[7:0]
  BR = SYSCLK2/(PRESCALEx + 1)

SPIDATx : 송신 버퍼

SPIBUF : 수신 버퍼


TMS320C6720 SPI Read/Write함수
SPI1BUF레지스터의 RXEMPTY(BIT31) 가 1이되면 수신이 완료된 것을 나타내고 데이터를 가져오면 된다.
unsigned char SPI1_WriteReadByte(unsigned char Data)

 _SPI1DATA0 = Data;

 while(_SPI1BUF & BIT31);

 return (_SPI1BUF & 0xFF);
}



TMS320C6720 SPI테스트 예제 소스코드
#include "system.h"
#include "myAccel.h"

void main()
{
 unsigned int idx = 0;
 short data = 0;
 short buf[128];

 SystemInit();

 //Led Init..
 Led1Init();
 Led2Init();

 Led1Off();
 Led2Off();

 DebugPrint("[TMS320C6720 EVM] Test Program - SPI Accel Test.\n");

myAccel3lvInit();
   //1000.0111 Power on, enable all axis, self test off
 myAccel3lvWrite(CTRL_REG1, 0xC7);  
    DebugPrint("Accel Init\r\n");   
   
 data = myAccel3lvRead(WHO_AM_I);
 DebugPrint("Who am I? 0x%02X\r\n", data);     

 while(1)
 {
  if(idx > 128)
  {
   for(idx=0;idx<128;idx++)buf[idx]=0;
   idx = 0;
  }

  GetAccelValue(AXIS_X, &data);
  buf[idx++] = data;

  Led1Toggle();
  DebugPrint("%d\r\n", data);
 }
}




[LCD_EXP_EVM] 보드 의 SPI커넥터



CCS3.3을 이용하면 데이터를 그래프로 볼 수 있어 편리한데, 3축 가속도 센서의 데이터값을 그래프로 보기 위해 적당한 값으로 버퍼 잡고 (short buf[128]), 브레이크 포인트 걸어서 실시간으로 센서 데이터값을 그래프로 확인 가능하다.




디버깅 툴이 그리 빠르지 않은넘이라... 실시간이라기는 좀 그렇지만 전체적인 센서의 추위는 확인 할 수 있다.




TMS320C 6720 SPI 가속도센서 테스트 동영상

[MSP430F5529 EVM] SPI테스트 - 3축 가속도 센서 출력

[MSP430F5510 EVM] 및 [MSP430F5529 EVM] 의 SPI는 PORT4의 USB1에 할당 되어 있다.
핀맵을 보면 아래와 같다.

P4.3/PM_UCB1CLK/PM_UCA1STE
P4.2/PM_UCB1SOMI/PM_UCB1SCL
P4.1/PM_UCB1SIMO/PM_UCB1SDA
P4.0/PM_UCB1STE/PM_UCA1CLK




MSP430F5x의 SPI특징
SPI mode features include:
• 7-bit or 8-bit data length
• LSB-first or MSB-first data transmit and receive
• 3-pin and 4-pin SPI operation
• Master or slave modes
• Independent transmit and receive shift registers
• Separate transmit and receive buffer registers
• Continuous transmit and receive operation
• Selectable clock polarity and phase control
• Programmable clock frequency in master mode
• Independent interrupt capability for receive and transmit
• Slave operation in LPM4



MSP430F5x SPI블록도





MSP430F5x SPI 통신 초기화 함수
void SPI1_Init(void) // SPI 통신 초기화 함수
{
 // Select SPI functionality on DIO pins for MOSI, MISO, & CLK.
 P4SEL |= (BIT1|BIT2|BIT3);  
   
  UCB1CTL1 |= UCSWRST;                      // **Put state machine in reset**
  UCB1CTL0 |= UCMST+UCSYNC+UCMSB+UCCKPH;    // 3-pin, 8-bit SPI master
  UCB1CTL1 |= UCSSEL_2;                     // SMCLK
  UCB1CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
//  UCB1IE |= UCRXIE;     

   SPI1_SetSpeed(SPI_SPEED_1MHZ);
}



MSP430F5x SPI 전송 함수
#define SPI1_WRITE_BYTE(x)                 UCB1TXBUF = (x);
#define SPI1_READ_BYTE()     UCB1RXBUF
#define SPI1_WAIT_FOR_EN()     while (!(UCTXIFG&UCB1IFG));
#define SPI1_WAIT_FOR_SEND()              while (UCB1STAT & UCBUSY);
#define SPI1_WAIT_FOR_RX()     while (!(UCRXIFG&UCB1IFG))


unsigned char SPI1_WriteReadByte(unsigned char Data)
{
 SPI1_WAIT_FOR_EN();
 SPI1_WRITE_BYTE(Data);
 SPI1_WAIT_FOR_SEND();
 return SPI1_READ_BYTE();
}



MSP430F5510 SPI Accel 드라이버 함수
#define _SPI1_ENABLE    1

//-----------------------------------------------------------------------------
// myAccel3LV02 HAL
#define MY_ACCEL3LV02_SPI_MODE   1
#define MY_ACCEL3LV02_I2C_MODE   0

//AccelCS A8-P3.7
#define ACCEL_CS_BIT     BIT6
#define ACCEL_CS_PORT     PORT4

#define ACCEL_CS_INIT()     Sbi(P4DIR, ACCEL_CS_BIT);

#define ACCEL_CS_ASSERT()    Cbi(ACCEL_CS_PORT, ACCEL_CS_BIT)
#define ACCEL_CS_DEASSERT()    Sbi(ACCEL_CS_PORT, ACCEL_CS_BIT)
#define ACCEL_SPI_INIT()    SPI1_Init()
#define ACCEL_Read      SPI1_WriteReadByte
#define ACCEL_Write      SPI1_WriteReadByte
//-----------------------------------------------------------------------------



MSP430F5529 3축 가속도 센서 출력 테스트 예제 소스코드
#include "system.h"
#include "serial.h"
#include "spi.h"
#include "myAccel.h"

void main(void)
{
   short data = 0;
    SystemInit();

    Led1Init();
    Led1On();
   
 DebugInit(BAUD_115200);
 DebugPrint("MSP430F5529 EVM SPI Accel Test\r\n");

 myAccel3lvInit();
    myAccel3lvWrite(CTRL_REG1, 0xC7);  //1000.0111 Power on, enable all axis, self test off
   
    while(1)
    {
        Led1Toggle();
       GetAccelValue(AXIS_X, &data);
       DebugPrint("%d\r\n", data); 
 
        Delay(100);
    }
}


[LM3S8962 EVM] SPI테스트 - 3축 가속도센서 테스트




가속도 센서 테스트 드라이버
myMCU-EXP 보드의 가속도 센서(LIS3LV02)는 SPI0, CS(J18->16) ->RD3에 연결되어 있으므로 아래와 같이 드라이버 코드를 작성할 수 있다.
//-----------------------------------------------------------------------------
// myAccel3LV02 HAL
#define MY_ACCEL3LV02_SPI_MODE   1
#define MY_ACCEL3LV02_I2C_MODE   0

#define ACCEL_CS_BIT     BIT3
#define ACCEL_CS_PORT     PORTD

#define ACCEL_CS_INIT()     SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);\
          GPIOPinTypeGPIOOutput(GPIO_PORTD_BASE, ACCEL_CS_BIT);\
          GPIOPadConfigSet(GPIO_PORTD_BASE, ACCEL_CS_BIT, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD);
          
#define ACCEL_CS_ASSERT()    Cbi(ACCEL_CS_PORT, ACCEL_CS_BIT)
#define ACCEL_CS_DEASSERT()    Sbi(ACCEL_CS_PORT, ACCEL_CS_BIT)

#define ACCEL_SPI_INIT()    SPI0_Init()
#define ACCEL_Read      SPI0_WriteReadByte
#define ACCEL_Write      SPI0_WriteReadByte
//-----------------------------------------------------------------------------


LM3S8962 SPI데이터 송수신 드라이버 함수 작성
unsigned char SPI0_WriteReadByte(unsigned char Data)
{
 unsigned long rcv_data;
    SSIDataPut(SSI0_BASE,Data);
 SSIDataGet(SSI0_BASE, &rcv_data);
 return rcv_data;
}



[LM3S8962 EVM] 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; 
   }
  }
[TMS320F28069 EVM] SPI테스트 - 3축 가속도 센서 테스트


SPI테스트 하기에는 가속도센서를 이용하면 상당히 편리하다. 제어 자체도 간단하지만 API로 작성해 둔것이 있으므로 SPI 드라이버 부분과 /CS핀 설정만 하면 쉽게 SPI동작여부를 테스트 할 수 있다.

SPI구조는 TMS320F2808과 같은 구조이고 특별하게 변한것이 없고 코드 또한 동일하게 호환된다. 다만 FIFO가 16 level에서 4 level로 줄었다. 아무래도 가격때문이지 않을까...

[NET-EVM] 보드에서 가속도 센서의 CS는 CN7-P8에 연결되어 있으므로  [TMS320F28069 EVM] 보드에서는 CN6의 P8->GP20에 연결되어 있다.




TMS320F28069 SPI 가속도 센서 초기화 드라이버 코드
#define _SPI0_ENABLE     1

//-----------------------------------------------------------------------------
// myAccel3LV02 HAL
#define MY_ACCEL3LV02_SPI_MODE   1
#define MY_ACCEL3LV02_I2C_MODE   0

#define ACCEL_CS_BIT     BIT19
#define ACCEL_CS_PORT     

#define ACCEL_CS_ASSERT()    cbi(GPIOA_C, LCD_RS_BIT);NOP();
#define ACCEL_CS_DEASSERT()    sbi(GPIOA_S, LCD_RS_BIT);NOP();

#define ACCEL_CS_INIT()     EALLOW;\
          GpioCtrlRegs.GPAMUX2.bit.GPIO20 = 0;\
          GpioCtrlRegs.GPADIR.bit.GPIO20 = 1;\
          EDIS;\
          ACCEL_CS_DEASSERT()
          
#define ACCEL_SPI_INIT()    SPI0_Init()
#define ACCEL_Read      SPI0_WriteReadByte
#define ACCEL_Write      SPI0_WriteReadByte
//-----------------------------------------------------------------------------


[EXP-DSP EVM]확장 보드의 SPI포트에 연결하기 위해 점퍼핀으로 연결 했다.



TMS320F28069 3축 가속도 센서 테스트 동영상




TMS320F28069 SPI테스트 소스코드
void main(void)
{
 short data = 1;
 unsigned int flag = 1;

 //DSP System Initialize
 SystemInit();

 Led1Init();
 Led1On();

 //시리얼 포트 초기화
 DebugInit(BAUD_115200);
 DebugPrint("TMS320F28069 EVM SPI Test(%d)Mhz\r\n", _SYS_CLK);

 //가속도 센서 LIS3LV02 초기화
 myAccel3lvInit();
 myAccel3lvWrite(CTRL_REG1, 0xD7);  //1000.0111 Power on, enable all axis, self test off

 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 'h':
    DebugPrint("Device ID=%02X\r\n", myAccel3lvRead(WHO_AM_I));
    break;

   case 'r':
    GetAccelValue(AXIS_X, &data);
    DebugPrint("X=%d\r\n", data);
    break;
  }

  if(flag)
  {
   GetAccelValue(AXIS_X, &data);
   DebugPrint("%d\r\n", data);
   Delay(100);
  }
   
 }//end while
}




[CANTUS EVM] USB HID테스트 - USB로 센서 데이터 그래프에 표시


CANTUS는 저렴한 MCU임에 불구하고 USB기능이 있어 여러모로 사용할곳이 많은것 같다.
USB를 이용하여 3축 가속도 센서 데이터를 그래프로 표시하는 테스를 해 보았다. 기존 STM32를 이용하여 센서데이터를 USB로 전송하는 예제가 있어 쉽게 포팅할 수 있었다.

HID를 이용하면 드라이버필요 없이 USB에 연결할 수 있어 간단히 USB전송하기 좋다.

ADChip사에서 제공하는 USB API를 이용하면 아주 간단히  USB를 제어 할 수 있다. 깔끔하게 잘 동작한다.
하지만 라이브러이 형태이기 때문에 수정이나 다른 프로젝트에 계속 추가 하기가 쉽지 않아 사용자 처리 부분은 빼내서 처리했다.

그리고 한가지더.. 엔드포인트 수가 적고, 특히 64Byte 엔드포인트는 2개밖에 없다.



USB초기화 부분
 //USB초기화
 //-------------------------------------------
 setinterrupt(INTNUM_USB,usb_irq_f);
 EnableInterrupt(INTNUM_USB,TRUE);
 
 //USB Enable
 Sbi(*R_PAF5, (3<<(2*7)));
    Sbi(*R_P5oDIR, BIT7);
    Sbi(*R_P5oLOW, BIT7);
    Delay(100);
 
 usb_set_description(USB_Configuration_Descriptor,USB_Device_Descriptor,HID_ReportDescriptor,USB_StringDescriptor);
    usb_init();
 //-------------------------------------------



가속도 센서 데이터 수집 및 USB전송 코드
 while(1)
 {
  GetAccelValue(AXIS_X, &data);
  data = 0xFFF&data;
  
  gUsbTxBuffer[0] = data;
  gUsbTxBuffer[1] = data>>8;
  
  GetAccelValue(AXIS_Y, &data);
  data = 0xFFF&data;
  
  gUsbTxBuffer[2] = data;
  gUsbTxBuffer[3] = data>>8;
  
  GetAccelValue(AXIS_Z, &data);
  data = 0xFFF&data;
  
  gUsbTxBuffer[4] = data;
  gUsbTxBuffer[5] = data>>8; 
  
  //USB로 센서 데이터 전송
  SendtoUsb(gUsbTxBuffer, sizeof(gUsbTxBuffer));
  
  Delay(4);
 }


CANTUS USB전송 테스트 동영상
USB HID로 3축 가속도 센서데이터를 전송하고 그래프로 표시하는 예제

[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; 
   }
  }

블로그 이미지

nexp

카테고리

분류 전체보기 (1560)
[MyProject] (48)
[TI] (75)
[NXP] (51)
[ST_MICRO] (129)
[FreeScale] (31)
[MSP430] (140)
[Microchip] (131)
Cortex-M (36)
[ATMEL] (29)
[AnalogDevice] (22)
[Embedded] (2)
ARM9 (24)
[AVR] (80)
[DSP] (111)
[8051] (21)
[MCU] (50)
[INTERFACE] (213)
[AppBoard] (23)
[ROBOT] (25)
[MODULE] (129)
[SENSOR] (41)
[DATA] (21)
[FPGA] (32)
[EVB] (1)
[Proramming] (38)
[MyLog] (6)
[IDEA] (0)
[Utility] (19)
[Book] (24)
취미생활 (4)
[Link] (2)