[MSP430]/MSP430F5x2011. 11. 26. 17:30

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

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


Posted by nexp

댓글을 달아 주세요

[TI]/LM3S89622011. 9. 1. 19:49

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

[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; 
   }
  }
Posted by nexp

댓글을 달아 주세요

[DSP]/PICCOLO2011. 4. 30. 23:00

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

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




Posted by nexp

댓글을 달아 주세요

[MCU]/CANTUS2011. 4. 11. 10:30

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

[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축 가속도 센서데이터를 전송하고 그래프로 표시하는 예제

Posted by nexp

댓글을 달아 주세요

  1. 파파존스

    관리자의 승인을 기다리고 있는 댓글입니다

    2011.04.19 18:35 [ ADDR : EDIT/ DEL : REPLY ]

[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

댓글을 달아 주세요