[NXP]/LPC8002014. 3. 9. 22:30

LPC812 EVM - SPI 테스트

LPC812 EVM - SPI 테스트

LPC812는 2개의 SPI를 내장하고 있다. 저가격 소형 칩이라도 기능은 막강하다. 특히 SWITCH MATRIX 방식으로 SPI 핀맵을 원하는 형태로 할당 할 수 있기 때문에 상상히 유연성이 좋은것 같다.

SPI의 최대 클럭 속도는 메인클럭인 30Mhz까지 출력 가능하다. 


LPC812 SPI 블록도





LPC812 EVM 에서 SPI 핀맵할당

LPC812 EVM에서 SPI핀맵은 아래와같이 할당 했고 Switch Matrix Tool을 이용하여 코드 생성을 쉽게 할 수 있다.





LPC812 SPI 초기화 함수

void SPI0_Init(void)

{

    /* Enable SWM clock */

    LPC_SYSCON->SYSAHBCLKCTRL |= (1<<7);


    /* Pin Assign 8 bit Configuration */

    /* SPI0_SCK */

    LPC_SWM->PINASSIGN3 = 0x07ffffffUL; 

    /* SPI0_MOSI */

    /* SPI0_MISO */

    LPC_SWM->PINASSIGN4 = 0xffff0203UL; 


    

    /* Enable SPI clock */

    LPC_SYSCON->SYSAHBCLKCTRL |= (1<<11);


    /* Bring SPI out of reset */

    LPC_SYSCON->PRESETCTRL &= ~(0x1<<0);

    LPC_SYSCON->PRESETCTRL |= (0x1<<0);


    /* Set clock speed and mode */

    LPC_SPI0->DIV = 15-1;

    LPC_SPI0->DLY = 0;

    LPC_SPI0->CFG = (SPI_CFG_MASTER & ~SPI_CFG_ENABLE);

    LPC_SPI0->CFG |= SPI_CFG_ENABLE;    

}




LPC812 SPI 송수신 함수

unsigned char SPI0_WriteReadByte(unsigned char Data)

{

while ( (LPC_SPI0->STAT & SPI_STAT_TXRDY) == 0 );


    LPC_SPI0->TXDATCTL = SPI_TXDATCTL_FSIZE(8-1) | SPI_TXDATCTL_EOT | Data;

    while ( (LPC_SPI0->STAT & SPI_STAT_RXRDY) == 0 );

    

    return LPC_SPI0->RXDAT;   

}





LPC812 모드 설정







void SPI0_SetMode(int Mode)

{

switch(Mode)

{

case _SPI_MODE0:

            Cbi(LPC_SPI0->CFG, SPI_CFG_CPOL);

            Cbi(LPC_SPI0->CFG, SPI_CFG_CHPA);

break;

            

case _SPI_MODE1:

            Cbi(LPC_SPI0->CFG, SPI_CFG_CPOL);

            Sbi(LPC_SPI0->CFG, SPI_CFG_CHPA);

break;


case _SPI_MODE2:

            Sbi(LPC_SPI0->CFG, SPI_CFG_CPOL);

            Cbi(LPC_SPI0->CFG, SPI_CFG_CHPA);

break;


case _SPI_MODE3:

            Sbi(LPC_SPI0->CFG, SPI_CFG_CPOL);

            Sbi(LPC_SPI0->CFG, SPI_CFG_CHPA);

break;            

}

}




Posted by nexp

댓글을 달아 주세요

Cortex-M/INFINEON2013. 11. 24. 23:30

XMC1300 EVM - SPI 테스트 (Infineon Cortex-M0)

[XMC1300 EVM] - SPI 테스트 (Infineon Cortex-M0)


XMC 시리즈는 시리얼 통신( UART, SPI, I2S, I2C )을 동일한 블록으로 만들어 두고 모드로 선택해서 사용할수 있도록 되어 있다.

장단점이 있을것 같은데... 

장점으로 동일한 셋팅으로 사하기 때문에 소프트웨어 부담이 줄어든다. 반면 2채널 밖에 없기 때문에 여러 통신을 동시에 사용할때 어려움이 있다.



XMC1300 SPI 블록도




XMC1300 SPI 핀맵

XMC의 핀기능은 하나의 포트에 여러가지 기능을 사가능하도록 해 두었는데, 다만 기능들이 일관성이 없어 데이터시트 상에 핀의 기능을 확인할 때 주의가 필요한것 같다.


SPI 기능핀은 여러핀 리맵가능한것 처럼 되어 있지만 사실 상당히 제한적으로 설정 가능하다. 데이터시트를 자세히 보고 할당해야 한다. XMC1300 EVM 보드에서는 아래와 같이 할당 했다.

P1.0(MOSI) - USIC0_CH0.DOUT0(ALT7)


P1.1(MISO) - USIC0_CH0.DX0D


P0.8(SCLK) - USIC0_CH0.SCLKOUT(ALT6)


P1.4(SS) - USIC0_CH0.SELO0(ALT6)



SPI MISO 기능으로 사용할 수 있는 핀




XMC1300 SPI 관련 레지스터

CCR (Channel Control Register)

MODE [3:0] rw Operating Mode


0H - USIC channel is disabled

1H - SSC (SPI) 모드로 동작

2H - ASC (SCI, UART) 모드로 동작

3H - I2S 모드로 동작

4H - I2C 모드로 동작



XMC1300 SPI 초기화 함수

void SPI0_Init(void)

{

    PORT1_Set_Mode(1,INPUT_PU);

    PORT1_Set_Mode(0,OUTPUT_PP_AF7);

    PORT0_Set_Mode(8,OUTPUT_PP_AF6);

  

//Kernel State Configuration Register - Module Enable + Bit Protection for MODEN

USIC0_CH0->KSCFG |= (1 << USIC_CH_KSCFG_MODEN_Pos) | (1 << USIC_CH_KSCFG_BPMODEN_Pos);


//Normal divider mode selected

WR_REG(USIC0_CH0->FDR, USIC_CH_FDR_DM_Msk, USIC_CH_FDR_DM_Pos, 1);

//Configuration of baud rate

WR_REG(USIC0_CH0->FDR, USIC_CH_FDR_STEP_Msk, USIC_CH_FDR_STEP_Pos, FDR_STEP);

WR_REG(USIC0_CH0->BRG, USIC_CH_BRG_PDIV_Msk, USIC_CH_BRG_PDIV_Pos, BRG_PDIV);

    

    WR_REG(USIC0_CH0->BRG, USIC_CH_BRG_SCLKOSEL_Msk, USIC_CH_BRG_SCLKOSEL_Pos, 0);    

    WR_REG(USIC0_CH0->BRG, USIC_CH_BRG_SCLKCFG_Msk, USIC_CH_BRG_SCLKCFG_Pos, 1);


//Configuration of USIC Input Stage

        //Select P1.2

WR_REG(USIC0_CH0->DX0CR, USIC_CH_DX0CR_DSEL_Msk, USIC_CH_DX0CR_DSEL_Pos, 3);

WR_REG(USIC0_CH0->DX0CR, USIC_CH_DX0CR_INSW_Msk, USIC_CH_DX0CR_INSW_Pos, 1);


//Configuration of USIC Shift Control

//Transmit/Receive MSB first is selected, Transmission Mode (TRM) = 1, Passive Data Level (PDL) = 1

WR_REG(USIC0_CH0->SCTR, USIC_CH_SCTR_PDL_Msk, USIC_CH_SCTR_PDL_Pos, 1);

WR_REG(USIC0_CH0->SCTR, USIC_CH_SCTR_TRM_Msk, USIC_CH_SCTR_TRM_Pos, 1);

WR_REG(USIC0_CH0->SCTR, USIC_CH_SCTR_SDIR_Msk, USIC_CH_SCTR_SDIR_Pos, 1);

//Set Word Length (WLE) & Frame Length (FLE)

WR_REG(USIC0_CH0->SCTR, USIC_CH_SCTR_FLE_Msk, USIC_CH_SCTR_FLE_Pos, 7);

WR_REG(USIC0_CH0->SCTR, USIC_CH_SCTR_WLE_Msk, USIC_CH_SCTR_WLE_Pos, 7);


//Configuration of USIC Transmit Control/Status Register

//TBUF Data Enable (TDEN) = 1, TBUF Data Single Shot Mode (TDSSM) = 1

WR_REG(USIC0_CH0->TCSR, USIC_CH_TCSR_TDEN_Msk, USIC_CH_TCSR_TDEN_Pos, 1);

WR_REG(USIC0_CH0->TCSR, USIC_CH_TCSR_TDSSM_Msk, USIC_CH_TCSR_TDSSM_Pos, 1);


//Configuration of Protocol Control Register

WR_REG(USIC0_CH0->PCR_SSCMode, USIC_CH_PCR_SSCMode_MSLSEN_Msk,                                USIC_CH_PCR_SSCMode_MSLSEN_Pos, 1);


//Configuration of Channel Control Register

WR_REG(USIC0_CH0->CCR, USIC_CH_CCR_MODE_Msk, USIC_CH_CCR_MODE_Pos, 1);

WR_REG(USIC0_CH0->CCR, USIC_CH_CCR_AIEN_Msk, USIC_CH_CCR_AIEN_Pos, 0);


//Data Pointer & Buffer Size for Transmitter Buffer Control - DPTR = 0,  SIZE = 5

WR_REG(USIC0_CH0->TBCTR, USIC_CH_TBCTR_DPTRSIZE_Msk, USIC_CH_TBCTR_DPTRSIZE_Pos, 0x05000000);

//Data Pointer & Buffer Size for Receiver Buffer Control - DPTR = 32,  SIZE = 5

WR_REG(USIC0_CH0->RBCTR, USIC_CH_RBCTR_DPTRSIZE_Msk, USIC_CH_RBCTR_DPTRSIZE_Pos, 0x05000020);

}



XMC1300 SPI Read/Write 함수

unsigned char SPI0_WriteReadByte(unsigned char Data)

{

    //while(!(USIC0_CH0->TRBSR&BIT11));

    USIC0_CH0->IN[0] = Data;

    

    while(USIC0_CH0->TRBSR&BIT3);

    return USIC0_CH0->OUTR;  

}



Posted by nexp

댓글을 달아 주세요

[FreeScale]/KINETIS2013. 11. 3. 22:00

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

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



Posted by nexp

댓글을 달아 주세요

[MSP430]/MSP430_FRAM2013. 5. 17. 23:00

MSP430FR5739 EVM - eUSCI SPI 통신 테스트

MSP430FR5739 EVM - eUSCI SPI 통신 테스트

 

 

MSP430FR5739의 SPI역시 기존과 약간의 변화가 있는것 같다.

설계 할때 잘 해둘필요가 있는데... 아무튼 다시 한번 정리해 본다.

 

 

MSP430FR5739 SPI 블록도
 




MSP430FR5739 SPI 핀맵 설정

SEL 레지스터를 이용하여 SPI기능을 할당할 수 있다. 다른 MSP430시리즈와 달리 SEL0, SEL1으로 두개의 레지스터가 있다.

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



//SPI Port Init

Cbi(_SPI1_PxSEL, (_SPI1_UCLK|_SPI1_SOMI|_SPI1_SIMO));

Sbi(_SPI1_PxSEL1, (_SPI1_UCLK|_SPI1_SOMI|_SPI1_SIMO));


// SPI option select

Sbi(_SPI1_PxDIR, (_SPI1_UCLK|_SPI1_SOMI|_SPI1_SIMO));






MSP430FR5739 SPI 초기화 함수


void SPI1_Init(void) // SPI 통신 초기화 함수

{

    // Initialize USART state machine

UCB0CTL1 &= ~UCSWRST;

//SPI Port Init

Cbi(_SPI1_PxSEL, (_SPI1_UCLK|_SPI1_SOMI|_SPI1_SIMO));

Sbi(_SPI1_PxSEL1, (_SPI1_UCLK|_SPI1_SOMI|_SPI1_SIMO));


// SPI option select

Sbi(_SPI1_PxDIR, (_SPI1_UCLK|_SPI1_SOMI|_SPI1_SIMO));

UCA1CTLW0 |= UCSWRST;                     // **Put state machine in reset**

UCA1CTLW0 |= UCMST+UCSYNC+UCCKPL+UCMSB;   // 3-pin, 8-bit SPI master

// Clock polarity high, MSB

UCA1CTLW0 |= UCSSEL__SMCLK;                    // SMCLK


UCA1CTLW0 &= ~UCSWRST;                    // **Initialize USCI state machine**

//UCA1IE |= UCRXIE;                         // Enable USCI_A0 RX interrupt

}





MSP430FR5739 송수신 함수

#define SPI1_WRITE_BYTE(x)                 UCA1TXBUF = (x);

#define SPI1_READ_BYTE() UCA1RXBUF

#define SPI1_WAIT_FOR_SEND()             while (!(UCA1IFG&UCTXIFG))

#define SPI1_WAIT_FOR_RX() while (!(UCA1IFG&UCRXIFG))



unsigned char SPI1_WriteReadByte(unsigned char Data)

{

//SPI TXBUF 데이터 있는가 확인

SPI1_WAIT_FOR_SEND();

//데이터 전송

SPI1_WRITE_BYTE(Data);


//SPI 데이터가 수신되면

SPI1_WAIT_FOR_RX();

return SPI0_READ_BYTE();

}






인터럽트로 처리할 경우

extern RINGBUFFER gUartBuffer;


#pragma vector=USCI_A0_VECTOR

__interrupt void USCI_A0_ISR(void)

{    

    switch(__even_in_range(UCA0IV,0x08))

    {

      case 0: break; // Vector 0 - no interrupt

      case 2:  // Vector 2 - RXIFG


SetRingBuffer(&gUartBuffer, UCA0RXBUF);

        break;

      default:

        break;

    }

}



Posted by nexp

댓글을 달아 주세요

[MCU]/adStar2012. 12. 22. 16:00

[adStar EVM] SPI 테스트

[adStar EVM] SPI 테스트

adStar는 2채널의 SPI가 있다. CANTUS에서는 HDSC와 핀이 겹쳐서 아쉬울 때가 있었는데... 2채널이 되어 상당히 편해 졌다.

핀맵은 아래와 같다.

 

P0.0/SPWM2L_P/SPI0_nCS/TWI_SCL
P0.1/SPWM2L_N/SPI0_MISO/TWI_SDA
P0.2/SPWM2R_P/SPI0_MOSI/nCS1
P0.3/SPWM2R_N/SPI0_SCK/nCS2

 

P5.1/IIS_LRCLK0/SPI_MOSI1/A1

P5.0/IIS_SCLK0/SPI_MISO1/A0

P4.7/IIS_SDI0/SPI_CS1/TMO3

P4.6/IIS_MCLK/SPI_SCK1/CAP3

 

 

CANTUS와 코어는 동일하지만 2개의 SPI가 존재 하므로 기존 코드어세 약간의 수정이 필요하다.

 

adStar SPI초기화 함수

void SPI1_Init(void) // SPI 통신 초기화 함수
{
  Cbi(*R_PAF5, 0x0F); // SPI_SCK, SPI_MISO, SPI_MOSI
 Cbi(*R_PAF4, 0xF000);

 Sbi(*R_PAF5, F_PAF5_0_SPI_MISO1 | F_PAF5_1_SPI_MOSI1); // SPI_SCK, SPI_MISO, SPI_MOSI
 Sbi(*R_PAF4, F_PAF4_7_SPI_CS1 | F_PAF4_6_SPI_SCK1);

 

 *R_SPI0CON(1) = SPICON_MSTR | SPICON_MSBF | SPICON_EN; 
 
    int baud = spi_set_freq(1, SPI_MASTER, W25Xxx_SPI_FREQ);
}

 

 

adStar SPI송수신 함수

unsigned char SPI1_WriteReadByte(unsigned char Data)
{
 //SPI포트로 데이터 출력 
 *R_SPI0DATA(1) = Data;
 
 // 전송대기
 while (!(*R_SPI0STAT(1) & SPISTAT_SPIF));
 
 //데이터 수신
 return *R_SPI0DATA(1);
}

 

 

기존 CANTUS로 작성된  3축 가속도 센서 구동시 잘 동작하는것을 확인할 수 있다.

 

Posted by nexp
TAG adstar, SPI

댓글을 달아 주세요