[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

댓글을 달아 주세요

[MODULE]/ADC2011. 1. 12. 17:31

[ADS8320] 16bit ADC테스트

[ADS8320] 16bit ADC테스트



모터 가속도 측정 장치 개발 프로젝트에 적용한 16bit ADC중 저렴하면서 정밀한 AD8320을 테스트 해 보았다.
노이즈 레벨도 적은것 같고 상당히 안정적이다.

AD8320 SPI 타이밍도






AD8320 테스트 코드

unsigned int AD8320_Read()
{
     :
  AD8320_CS0_ASSERT();

  byte0 = AD8320_SPI_READ(0);
  byte1 = AD8320_SPI_READ(0);
  byte2 = AD8320_SPI_READ(0);  
     
  byte0 = byte0 << 14;
  byte1 = byte1 << 6;
  byte2 = byte2 >> 2;

  adc_data = (byte0 | byte1 | byte2);

  AD8320_CS0_DEASSERT();

  return adc_data;
}


ADC테스트 결과
STM32 + AD8320 보드를 이용하여 USB로 16bit ADC데이터 전송하여 그래프로 출력해 보았다.



ECG데이터도 받아 보았다. 깨끗하게 로깅 되는것을 확인 할 수 있다.


Posted by nexp

댓글을 달아 주세요

[MyProject]/20102010. 11. 7. 20:30

[AcceleroMeter] 모터 가속도 측정 장치

[AcceleroMeter] 모터 가속도 측정 장치

회전하는 모터의 가속도를 츨정하여 그래프로 표시하는 시험기를 개발





하드웨어

MCU는 Cortex-M3 코어의 STM32를 사용하였다. 

측정해야 할 데이터는 디지털 엔코더 및 아날로그 출력의 타코메터가 있다.

타코메터는 2채널의 16비트 ADC ADS8320 을 이용하여 동시점에 두개의 ADC값을 읽어올 수 있다. 

데이터응 USB를 통해 HID인터페이스로 전송된다.




디지털 엔코더 입력 보드




소프트웨어

수집된 데이터를 실시간으로 표시하고 그래프 저장 및 출력을 할 수 있도록 구성 했다.




실제 타코 데이터 입력 데이터


Posted by nexp

댓글을 달아 주세요

[DSP]/DSP280x-M2010. 5. 4. 23:00

[DSP280x-M EMV]SPI 테스트 - 3축 가속도 센서(LIS3LV02) 데이터 로깅

[DSP280x-M EMV]SPI 테스트 - 3축 가속도 센서(LIS3LV02) 데이터 로깅


TMS320F2808 의 SPI통신을 이용하여 3축 가속도 센서 LIS3LV02를 테스트 했다. 확장 테스트 보드에 가속도 센서를 장착할 수 있기 때문에 쉽게 테스트 가능하다.

TMS320F2808에는 4개의 독립적인 SPI포트가 있는데 이중 표준커넥터로 뽑아둔 SPIA(P16~P19)를 이용한다.



확장 보드에서 LIS3LV02는 SPI포트에 연결되어 있고 CS핀은 P22에 연결되어 있다.



PC 호스트 프로그램



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



DSP280x-M SPI테스트를 위해 Code Composer Studio에 SPI관련 소스 및 가속도 센서 코드 추가



TMS320F280x SPI블럭도






SPI Mode설정
LIS3LV02제어를 위해서는 SPI Mode0로 설정해야한다. SPICCR, SPICTL레지스터에서 설정할 수 있다.




SPI 설정


SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;
SpiaRegs.SPICTL.bit.CLK_PHASE = 0;   //SPI MODE0

 //SPI 초기화
 SpiaRegs.SPICCR.bit.SPISWRESET = 0;
 SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;
 SpiaRegs.SPICCR.bit.SPILBK = 0;  //루프백 비사용
 SpiaRegs.SPICCR.bit.SPICHAR = 7;  //8비트 모드 
 SpiaRegs.SPICCR.bit.SPISWRESET = 1; // Ready to transmit

 SpiaRegs.SPICTL.bit.SPIINTENA = 0; //인터럽트 비사용
 SpiaRegs.SPICTL.bit.TALK = 1;   // Transmit enable
 SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1; //SPI마스터 모드
 SpiaRegs.SPICTL.bit.CLK_PHASE = 0;   //SPI MODE0
 SpiaRegs.SPICTL.bit.OVERRUNINTENA = 0; //Overrun interrupt disable

 SpiaRegs.SPIPRI.bit.FREE = 1;       // Set so breakpoints don't disturb xmission


SPI클럭 속도 설정
SpiaRegs.SPIBRR 레지스터에서 설정 가능하다.

 //SPI 클럭속도 설정
 SPI0_SetSpeed(SPI_SPEED_4MHZ);



 //SPI GPIO초기화
 EALLOW;
    GpioCtrlRegs.GPAPUD.bit.GPIO16 = 0;   // Enable pull-up on GPIO16 (SPISIMOA)
    GpioCtrlRegs.GPAPUD.bit.GPIO17 = 0;   // Enable pull-up on GPIO17 (SPISOMIA)
    GpioCtrlRegs.GPAPUD.bit.GPIO18 = 0;   // Enable pull-up on GPIO18 (SPICLKA)
    GpioCtrlRegs.GPAPUD.bit.GPIO19 = 0;   // Enable pull-up on GPIO19 (SPISTEA)

    GpioCtrlRegs.GPAQSEL2.bit.GPIO16 = 3; // Asynch input GPIO16 (SPISIMOA)
    GpioCtrlRegs.GPAQSEL2.bit.GPIO17 = 3; // Asynch input GPIO17 (SPISOMIA)
    GpioCtrlRegs.GPAQSEL2.bit.GPIO18 = 3; // Asynch input GPIO18 (SPICLKA)
    GpioCtrlRegs.GPAQSEL2.bit.GPIO19 = 3; // Asynch input GPIO19 (SPISTEA)
   
    GpioCtrlRegs.GPAMUX2.bit.GPIO16 = 1; // Configure GPIO16 as SPISIMOA
    GpioCtrlRegs.GPAMUX2.bit.GPIO17 = 1; // Configure GPIO17 as SPISOMIA
    GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 1; // Configure GPIO18 as SPICLKA
    GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 1; // Configure GPIO19 as SPISTEA
    EDIS;
 
 //SPI FIFO 초기화
    SpiaRegs.SPIFFTX.all=0xE040;
    SpiaRegs.SPIFFRX.all=0x204f;
    SpiaRegs.SPIFFCT.all=0x0;


TMS320F2808 3축 가속도 센서 테스트 소스
void main(void)
{
 short data = 0;
 unsigned int flag = 0;

 //DSP System Initialize
 SystemInit();

 Led1Init();
 Led1On();

 DebugInit(BAUD_57600);
 DebugPrint("SPI Test\r\n");

 myAccel3lvInit();
 myAccel3lvWrite(CTRL_REG1, 0xD7);  //1000.0111 Power on, enable all axis, self test off
 myAccel3lvWrite(CTRL_REG2, 0x40);

 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=");
    U0_PutInt(myAccel3lvRead(WHO_AM_I));
    break;

 case 'r':
    GetAccelValue(AXIS_X, &data);
    U0_PutInt(data);  
    break;
}
}
Posted by nexp

댓글을 달아 주세요

[MSP430]/MSP430F22xx2010. 3. 7. 23:00

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

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




MSP430F2274 SPI 블록도



[MSP430F2274 EVM] 보드에서 SPI는 P3.0~P3.3에 할당되어 있는 UCB0-SPI를 사용하고 있다.



spi.c 드라이이버 함수의 초기화 및 송수신 함수만 수정하면 기존 코드 그대로 사용할 수 있다.
#define SPI0_WRITE_BYTE(x)                 UCB0TXBUF = (x);
#define SPI0_READ_BYTE()     UCB0RXBUF
#define SPI0_WAIT_FOR_EN()     while (!(IFG2&UCB0TXIFG));
#define SPI0_WAIT_FOR_SEND()              while (UCB0STAT & UCBUSY);
#define SPI0_WAIT_FOR_RX()     while (!(IFG2&UCB0RXIFG))

//USCIB0 for 2271
#define TI_CC_SPI_USCIB0_PxSEL   P3SEL
#define TI_CC_SPI_USCIB0_PxDIR   P3DIR
#define TI_CC_SPI_USCIB0_PxIN    P3IN
#define TI_CC_SPI_USCIB0_SIMO    BIT1
#define TI_CC_SPI_USCIB0_SOMI    BIT2
#define TI_CC_SPI_USCIB0_UCLK    BIT3

void SPI0_Init(void)
{
 //MSP430 SPI초기화
 UCB0CTL1 |= UCSWRST;                      // **Disable USCI state machine**
 UCB0CTL0 |= UCMST+UCCKPH+UCMSB+UCSYNC;    // 3-pin, 8-bit SPI master
 UCB0CTL1 |= UCSSEL_2;                     // SMCLK
 UCB0BR0 = 0x02;                           // UCLK/2
 UCB0BR1 = 0;

 //SPI Port Init 
 TI_CC_SPI_USCIB0_PxSEL |= TI_CC_SPI_USCIB0_SIMO
         | TI_CC_SPI_USCIB0_SOMI
         | TI_CC_SPI_USCIB0_UCLK;
 // SPI option select
 TI_CC_SPI_USCIB0_PxDIR |= TI_CC_SPI_USCIB0_SIMO | TI_CC_SPI_USCIB0_UCLK;

  // Initialize USART state machine
 UCB0CTL1 &= ~UCSWRST;
}

unsigned char SPI0_WriteReadByte(unsigned char Data)
{
 SPI0_WAIT_FOR_EN();
 SPI0_WRITE_BYTE(Data);
 SPI0_WAIT_FOR_SEND();

 return SPI0_READ_BYTE();
}


SPI MODE설정시 주의 사항




SPI 가속도 센서를 테스트 하기위해 [NET-EVM] 보드를 이용하였는데 SPI CS는 CN7의 P8번에 연결되어 있고 이는 MSP430보드의 P3.7에 할당되어 있다. 드라이버 파일(config.h)에 아래와 같이 설정할 수 있다.
//AccelCS A8-P3.7
#define ACCEL_CS_BIT     BIT7
#define ACCEL_CS_PORT     P3OUT

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


[MSP430F2274 EVM]보드를 이용한 SPI테스트 예제 - 가속도 센서 테스트
//-----------------------------------------------------------------------------
int main(void)
{
 int flag = 0;
 short data = 0;
 
    //System Init
 SystemInit();
 
    //LED Init
 Led1Init();
 Led1On();
 
 //Serial Init
 DebugInit(BAUD_115200);
 DebugPrint("MSP430F2274 SPI Test Program.\r\n");
 
//SPI및 가속도 센서초기화
 myAccel3lvInit();
 
 while (1)
 {
  if(u0_IsReceiveData())
  {
   switch(U0_GetByte())
   {
    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%x\r\n", data);  
     break; 
     
    case 'x':
     GetAccelValue(AXIS_X, &data);
  
     DebugPrint("%d\r\n", data);  
     break;    
   }
  }  
 }
}



Posted by nexp

댓글을 달아 주세요