[NXP]/LPC1k2011. 2. 25. 23:00

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

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

LCP1K SPI 특징
- Maximum SPI speed of 25 Mbit/s (master) or 4.17 Mbit/s (slave) (in SSP mode)
- Compatible with Motorola SPI, 4-wire Texas Instruments SSI, and National Semiconductor Microwire buses
- Synchronous serial communication
- Master or slave operation
- 8-frame FIFOs for both transmit and receive
- 4-bit to 16-bit frame


SPI SLK핀은 P0.10, 2.11, P0.6포트에 리맵이 가능한데 [LPC1K EVM] 보드는 0.6에 되어 있으므로 아래와 같이 설정할 수 있다.
#define IOCON_SCKLOC_SCKPIN_PIO0_10               0 // Set SCK function to pin 0.10
#define IOCON_SCKLOC_SCKPIN_PIO2_11               1 // Set SCK function to pin 2.11
#define IOCON_SCKLOC_SCKPIN_PIO0_6                1 // Set SCK function to pin 0.6

 //Set 0.6 to SSP SCK (2.11 and 0.10 can also be used)
    LPC_IOCON->SCK_LOC = IOCON_SCKLOC_SCKPIN_PIO0_6;
    LPC_IOCON->PIO0_6 = IOCON_PIO0_6_FUNC_SCK; 
    LPC_IOCON->PIO0_6  |= IOCON_PIO0_6_MODE_PULLUP;



SPI 드라이버 함수(spi.c)의 초기화 함수 및 송수신 함수를 수정하면 기존 코드를 그대로 사용할 수 있다.
void SPI0_Init(void)
{
 LPC_SYSCON->PRESETCTRL    |=  (1 <<  0);
 LPC_SYSCON->SSP0CLKDIV    =  SCB_SSP0CLKDIV_DIV4;
 LPC_SYSCON->SYSAHBCLKCTRL |= SCB_SYSAHBCLKCTRL_SSP0;

    /* Set P0.8 to SSP MISO */
    LPC_IOCON->PIO0_8 &= ~IOCON_PIO0_8_FUNC_MASK;
    LPC_IOCON->PIO0_8 |= IOCON_PIO0_8_FUNC_MISO0;
    LPC_IOCON->PIO0_8  |= IOCON_PIO0_8_MODE_PULLUP; 
 
    /* Set P0.9 to SSP MOSI */
    LPC_IOCON->PIO0_9  &= ~IOCON_PIO0_9_FUNC_MASK;
    LPC_IOCON->PIO0_9  |= IOCON_PIO0_9_FUNC_MOSI0;
    LPC_IOCON->PIO0_9  |= IOCON_PIO0_9_MODE_PULLUP;

 //Set 0.6 to SSP SCK (2.11 and 0.10 can also be used)
    LPC_IOCON->SCK_LOC = IOCON_SCKLOC_SCKPIN_PIO0_6;
    LPC_IOCON->PIO0_6 = IOCON_PIO0_6_FUNC_SCK; 
    LPC_IOCON->PIO0_6  |= IOCON_PIO0_6_MODE_PULLUP;
  
    // Set clock polarity
 Cbi(LPC_SSP0->CR0, SSP_SSP0CR0_CPOL_MASK);

 // Set edge transition
 Sbi(LPC_SSP0->CR0, SSP_SSP0CR0_CPHA_SECOND); 


 /* Master mode */
 LPC_SSP0->CR1 = SSP_SSP0CR1_SSE_ENABLED | SSP_SSP0CR1_MS_MASTER | SSP_SSP0CR1_LBM_NORMAL;
 
    /* Clock prescale register must be even and at least 2 in master mode */ 
    LPC_SSP0->CPSR = 2;
}


SUINT SPI0_WriteReadByte(SUINT Data)
{
 /* Move on only if NOT busy and TX FIFO not full. */
 while ((LPC_SSP0->SR & (SSP_SSP0SR_TNF_NOTFULL | SSP_SSP0SR_BSY_BUSY)) != SSP_SSP0SR_TNF_NOTFULL);
 LPC_SSP0->DR = Data;
 
 while ( (LPC_SSP0->SR & (SSP_SSP0SR_BSY_BUSY|SSP_SSP0SR_RNE_NOTEMPTY)) != SSP_SSP0SR_RNE_NOTEMPTY );
 return(LPC_SSP0->DR);  
}


LPC1113 SPI 가속도 센서 테스트
가속도 센서를 테스트하기 위해 [NET-EVM]보드를 이용하였다. [NET-EVM]보드의 가속도 센서 CS는 CN7의 P8에 연결되어 있는데 LPC1K EVM보드는 핀수가 적어 할당되어 있지 않다.
그래서 점퍼를 이용하여 P3.5에 연결하여 테스트 하였다.


Posted by nexp

댓글을 달아 주세요

[ST_MICRO]/STM322011. 1. 20. 18:04

STM32 SPI Slave Mode 테스트

STM32 SPI Slave Mode 테스트
SPI Slave통신에 시간을 많이 까먹었는데... 아무튼 아래와 같이 해결 했다.
Master로 부터 데이터 수신클럭 받고 SPI_I2S_ReceiveData()로 데이터를 받아주어야 했는데... 이부분을 생각 못해서 데이터가 이상하게 출력되었다.
 
  //SPI Master로 부터 클럭이 들어오면 데이터 받고
  while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
  temp = SPI_I2S_ReceiveData(SPI2);
  //DebugPrint("SPI2 RX:%02X\r\n", temp);
  
  //원하는 데이터를 보낸다.
  //Send SPI2 data
  SPI_I2S_SendData(SPI2, cnt++);
  //DebugPrint("DataOut2\r\n");
 
 
Master에서는 그냥
    temp = SPI0_WriteReadByte(0x00);
    DebugPrint("Encoder=%02x\r\n", temp);
 
이렇게 하면 데이터 읽어 올 수 있다.
Posted by nexp

댓글을 달아 주세요

[INTERFACE]/WIZNET_EVM2010. 11. 19. 01:32

[W5100] STM32에서 SPI로 테스트중... 속도문제

[W5100] STM32에서 SPI로 테스트중... 속도문제

STM32에서 SPI로 테스트중...
STM32를 SPI를 이용하여 W5100테스트 중이다. 기본 동작은 잘 되지만 전송 속도가 문제다.
SPI클럭을 18M/4 = 4.5Mhz 로 구동 하는데 속도가 400kbps도 안된다. AVR 4Mhz로 구동해도 500k이상 나왔는데...




SPI를 클럭을 메인클럭에서 2분주 해서 다시 시도 해본다. 아예 SPI리드 라이트가 않된다.

wiz_write_buf() 함수를 좀 수정해야 할듯...
CS를 for루프 위쪽으로 올려서 CS제어 부분도 줄여볼까해서 해보니 데이터 에러가 발생한다.

  IINCHIP_CSoff();        
  for(idx=0;idx<len;idx++)
 {
  IINCHIP_SpiSendData(0xF0);
  IINCHIP_SpiSendData(((addr+idx) & 0xFF00) >> 8);
  IINCHIP_SpiSendData((addr+idx) & 0x00FF);
  IINCHIP_SpiSendData(buf[idx]);
   }
 IINCHIP_CSon();


SPI Wirte를 함수에서 직접 레지스트로 바꾸니 좀 더  빨라졌다

 void SPI1_WriteByte(unsigned char Data)
{
 //while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
 while((SPI2->SR & SPI_I2S_FLAG_TXE) == RESET);
   
 SPI_I2S_SendData(SPI2, Data);

//while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
 while((SPI2->SR & SPI_I2S_FLAG_RXNE) == RESET);

 SPI_I2S_ReceiveData(SPI2);

}



[1] iInChip Send: 0.4277 Mbps(148684 bytes, 2.6525 sec)
iInChip Recv: 0.4213 Mbps(148684 bytes, 2.6923 sec)
------------------------------------------------------------


Data Read, Write부분도 변경하니 좀더 빨라진다.
[1] iInChip Send: 0.5328 Mbps(148684 bytes, 2.1290 sec)
iInChip Recv: 0.5251 Mbps(148684 bytes, 2.1604 sec)
------------------------------------------------------------


SPI Read/Wrte 두 함수 모두 변경하니 조금 더 빨라졌다.

void SPI1_WriteByte(unsigned char Data)
{
 while((SPI2->SR & SPI_I2S_FLAG_TXE) == RESET);
    
 SPI2->DR =  Data;

 while((SPI2->SR & SPI_I2S_FLAG_RXNE) == RESET);

 Data = SPI2->DR;
}


560k까지 나오고 있다.
[1] iInChip Send: 0.5737 Mbps(148684 bytes, 1.9773 sec)
iInChip Recv: 0.5655 Mbps(148684 bytes, 2.0060 sec)
------------------------------------------------------------

SPI1_WriteByte() 함수를 쓰지 않고 하니 더 빨라진다.

       int temp;
      
    while((SPI2->SR & SPI_I2S_FLAG_TXE) == RESET);
    SPI2->DR = 0xF0;
 while((SPI2->SR & SPI_I2S_FLAG_RXNE) == RESET);
    temp = SPI2->DR;
   
   
 while((SPI2->SR & SPI_I2S_FLAG_TXE) == RESET);
    SPI2->DR = ((addr)>>8);   
 while((SPI2->SR & SPI_I2S_FLAG_RXNE) == RESET);
    temp = SPI2->DR;

   
 while((SPI2->SR & SPI_I2S_FLAG_TXE) == RESET);
    SPI2->DR = (addr);  
 while((SPI2->SR & SPI_I2S_FLAG_RXNE) == RESET);
    addr = SPI2->DR;
   
   
 while((SPI2->SR & SPI_I2S_FLAG_TXE) == RESET);
    SPI2->DR = data;    
 while((SPI2->SR & SPI_I2S_FLAG_RXNE) == RESET);
    temp = SPI2->DR;


630kbps가 최대 인것 같다.
[1] iInChip Send: 0.6455 Mbps(148684 bytes, 1.7574 sec)
iInChip Recv: 0.6362 Mbps(148684 bytes, 1.7831 sec)
------------------------------------------------------------

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

댓글을 달아 주세요

[DSP]/DSP283352009. 5. 28. 02:05

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

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


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



TMS320F28335 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 레지스터에서 설정 가능하다. TMS320F28335는 최대 10Mhz까지 가능하다.(좀 아쉽다.)

 //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;


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

 //DSP System Initialize
 SystemInit();

 Led1Init();
 Led1On();

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

 case 'r':
    GetAccelValue(AXIS_X, &data);
    DebugPrint("Accel:%d\\n", data);  
    break;
}
}
Posted by nexp

댓글을 달아 주세요