[Microchip]/PIC322011. 3. 12. 22:05

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

[PIC32-SM EVM] SPI 테스트


PIC32의 SPI는 최대 25Mhz로 동작하며 8, 16, 32비트로 설정가능하다.
[PIC32-SM EVM] 보드에는 SPI핀이 SPI2 RG6(SCLK), RG7(MISO), RG8(MOSI)에 할당되어 있다.

PIC32 블록도



PIC32 SPI초기화
void SPI0_Init(void)
{
 SPI2CONbits.ON  = 1;  // Enable 
 SPI2CONbits.FRZ  = 0;
 SPI2CONbits.SIDL  = 0;
 SPI2CONbits.DISSDO = 0;
 SPI2CONbits.MODE32  = 0;
 SPI2CONbits.MODE16 = 0;  //8비트 모드

//SPI 모드 설정
 SPI2CONbits.SMP  = 0;  //위상 설정
 SPI2CONbits.CKE  = 1;  // 0: Idle에서 active로 갈 때 data transaction 1: 반대
 SPI2CONbits.SSEN = 1;  // Slave select enable
 SPI2CONbits.CKP  = 0;  // 0: active high 1: 반대
 SPI2CONbits.MSTEN = 1;
 
 SPI2STATbits.SPIROV = 0;  //수신 오버플로우 초기화

 SPI0_SetSpeed(SPI_SPEED_4MHZ);
}

SPICON 레지스터




SPI모드 설정



PIC32 SPI클럭 설정



PIC32 SPI데이터 송수신 드라이버 함수 작성
SUINT SPI0_WriteReadByte(SUINT Data)
{
 //SPI포트로 데이터 출력
 SPI2BUF = Data;                   
 while( !SPI2STATbits.SPIRBF); // 전송대기

 //데이터 수신
 return SPI2BUF;
}



가속도 센서 테스트 드라이버
NET-EVM 보드의 가속도 센서는 SPI0, CS ->RB13에 연결되어 있으므로 아래와 같이 드라이버 코드를 작성할 수 있다.
#define _SPI0_ENABLE    1

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

#define ACCEL_CS_BIT     BIT13
#define ACCEL_CS_PORT     LATB
#define ACCEL_CS_INIT()    (TRISBbits.TRISB13 = 0)
          
#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
//-----------------------------------------------------------------------------

Posted by nexp

댓글을 달아 주세요

[INTERFACE]/ZIGBEE2011. 1. 7. 22:10

[Zigbee] 무선모듈을 이용한 가속도 센서 데이터 전송 테스트

[Zigbee] 무선모듈을 이용한 가속도 센서 데이터 전송 테스트



Zigbee기반의 RF2UART 모듈의 성능 테스트를 위해 가속도 센서 데이터를 무선으로 전송하는 테스트를 진행했다.

기존 Zigbee모듈들은 UART를 지원하지만 속도가 느리거나 패킷방식으로 전송해야 되서 디버깅에 어려움이 많아 USB2UART를 대체하는 용도로 제작해 보았다. (아래 동영상은 115200에서 100Hz로 데이터 전송하는 예이다. 다른 Zigbee모듈로는 20Hz이상 힘들었다)
MCU입장에서는 그냥 시리얼 통신으로 보면 된다. USB2UART모듈과 핀맵이 호환되므로 개발및 디버깅때는 유선으로 테스트 하고 최종적으로 모듈만 변경하면 무선으로 데이터 송수신 할 수 있다.

테스트 동영상
아래 테스트 동영상은 STM32를 이용하여 가속도 센서 데이터를 수집하고 100Hz주기로 UART로 전송하면 Zigbee 무선모듈으로 PC에 전송하여 표시하는 테스트이다.

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

댓글을 달아 주세요

[ST_MICRO]/STM322009. 7. 10. 10:14

[myUSB rev2] 3축 자이로, 가속도, GPS, 지자계, 압력센서 테스트 보드 제작

[myUSB rev2] 3축 자이로, 가속도, GPS, 지자계, 압력센서 테스트 보드 제작



myUSB 를 좀더 컴펙트 하고 IMU전용의 모듈로 제작했다.
STM32를 이용하여 USB통신으로 데이터 수집하는것은 동일하고 SD, Data Flash로 데이터 저장이 가능하도록 했다.
지원 가능 센서는 3축 자이로 센서, 3축 가속도 센서, 지자계, 압력(고도)센서, GPS를 장착할 수 있다.




가속도3축,  자이로 3축 센서 테스트 동영상



GPS데이터 수집 테스트 동영상
USB를 이용한 가속도 3축, 자이로 3축, 지자계, 압력, 온도, GPS데이터 수집 테스트

Posted by nexp

댓글을 달아 주세요

  1. 비밀댓글입니다

    2010.01.25 10:26 [ ADDR : EDIT/ DEL : REPLY ]
  2. 문경주

    안녕하세요~ 이블로그에서 많은것을 보고 느끼고 있는 사람입니다. 혹시 제작하신 것에 대한 정보를 제가 좀 얻을 수 있을지 해서글남깁니다~저도 stm32F시리즈를 공부하고있는 학생인데요 저도 이것을 한번 제작해보고 싶은데 이것에 대한 소스를 좀 얻을수 있을까요? 가능하시다면 imurmkj@naver.com으로 부탁드리겠습니다!

    2010.09.01 09:28 [ ADDR : EDIT/ DEL : REPLY ]
  3. 비밀댓글입니다

    2010.09.10 17:45 [ ADDR : EDIT/ DEL : REPLY ]
  4. 김연균

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

    2011.07.14 23:42 [ ADDR : EDIT/ DEL : REPLY ]