[MSP430]/MSP4322016.05.16 14:38

MSP432 EVM - SPI테스트

MSP432 EVM - SPI테스트



[MSP432 EVM] 보드의 SPI 포트는 UCB1 P6.2, P6.3, P6.4, P6.5에 할당되어 있다. SPI로 핀을 할당하기 위해 코드에서 아래와 같이 설정해 주면 된다.




void PinMuxConfig(void)

{

    //

    // Configure P6.3 for EUSCI_B1_SPI_I2C EUSCI_B1_SPI_I2C.CLK

    //

    MAP_GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P6, GPIO_PIN3, GPIO_PRIMARY_MODULE_FUNCTION);

    //

    // Configure P6.4 for EUSCI_B1_SPI_I2C EUSCI_B1_SPI_I2C.SIMO

    //

    MAP_GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P6, GPIO_PIN4, GPIO_PRIMARY_MODULE_FUNCTION);

    //

    // Configure P6.5 for EUSCI_B1_SPI_I2C EUSCI_B1_SPI_I2C.SOMI

    //

    MAP_GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P6, GPIO_PIN5, GPIO_PRIMARY_MODULE_FUNCTION);

    //

    // Configure P6.2 for EUSCI_B1_SPI_I2C EUSCI_B1_SPI_I2C.STE

    //

    MAP_GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P6, GPIO_PIN2, GPIO_PRIMARY_MODULE_FUNCTION);

}





MSP432 SPI 초기화 함수

/* SPI Master Configuration Parameter */

const eUSCI_SPI_MasterConfig spiMasterConfig =

{

        EUSCI_B_SPI_CLOCKSOURCE_SMCLK,             // SMCLK Clock Source

        3000000,                                   // SMCLK = DCO = 3MHZ

        500000,                                    // SPICLK = 500khz

        EUSCI_B_SPI_MSB_FIRST,                     // MSB First

        EUSCI_B_SPI_PHASE_DATA_CHANGED_ONFIRST_CAPTURED_ON_NEXT,    // Phase

        EUSCI_B_SPI_CLOCKPOLARITY_INACTIVITY_HIGH, // High polarity

        EUSCI_B_SPI_3PIN                           // 3Wire SPI Mode

};



void SPI0_Init(void)

{

    /* Selecting  SPI mode */

    PinMuxConfig();


    /* Configuring SPI in 3wire master mode */

    SPI_initMaster(EUSCI_B0_BASE, &spiMasterConfig);


    /* Enable SPI module */

    SPI_enableModule(EUSCI_B0_BASE);


    /* Enabling interrupts */

    SPI_enableInterrupt(EUSCI_B0_BASE, EUSCI_B_SPI_RECEIVE_INTERRUPT);

    Interrupt_enableInterrupt(INT_EUSCIB0);

    Interrupt_enableSleepOnIsrExit();

    TXData = 0x01;

}





MSP432 SPI 송수신 함수

unsigned char SPI0_WriteReadByte(unsigned char Data)

{

        while (!(SPI_getInterruptStatus(EUSCI_B0_BASE, EUSCI_B_SPI_TRANSMIT_INTERRUPT)));


        RXData = SPI_receiveData(EUSCI_B0_BASE);


        /* Send the next data packet */

        SPI_transmitData(EUSCI_B0_BASE, Data);

}





Posted by nexp

댓글을 달아 주세요

[TI]/TM4C2014.07.26 08:00

TM4C123 - SPI 테스트 (3축 가속도 센서)

TM4C123 - SPI 테스트 (3축 가속도 센서)




TM4C123 의 SPI 기능을 테스트 해 보았다.

최대 SPI클럭이 25 MHz까지 동작 가능하고 FIFO를 내장하고 있다. 특이사항으로 4채널의 SPI블럭을 사용할 수 있어서 SPI블록이 많이 필요한 어플리케이션에 좋을것 같다. 


TM4C123 EVM 보드에서는 PA2, PA3, PA4, PA5 에 SPI를 할당해 두었다.



TM4C123 의 SPI블록도



TM4C123 의 SPI 핀맵

TM4C 는 최대 4채널의 SPI모듈을 제공한다. 

핀맵을 아래와같이 설정 가능하다.





TM4C123 의 SPI 초기화 함수

TI의 기존 Cortex-M3 코어와 코드를 호환하도록 제작되어 있기 때문에 코드 변경없이 그대로 사용가능하다. 물론 초기화 코드는 약간의 수정이 필요하다.

// SPI 통신 초기화 함수

void SPI0_Init(void) 

{

    // The SSI0 peripheral must be enabled for use.

    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI0);


// Configure the pin muxing for SSI0 functions on port A2, A3, A4, and A5.

    ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);

    

    ROM_GPIOPinConfigure(GPIO_PA2_SSI0CLK);

    //ROM_GPIOPinConfigure(GPIO_PA3_SSI0FSS);

    ROM_GPIOPinConfigure(GPIO_PA4_SSI0RX);

    ROM_GPIOPinConfigure(GPIO_PA5_SSI0TX);

    

    ROM_GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_5 | GPIO_PIN_4 | GPIO_PIN_2);


    ROM_SSIConfigSetExpClk(SSI0_BASE, SysCtlClockGet(), _ssi0_mode,

                       SSI_MODE_MASTER, _ssi0_baud, 8);


    // Enable the SSI0 module.

    ROM_SSIEnable(SSI0_BASE);    

}




TM4C123 의 SPI 송수신 함수

UINT SPI0_WriteReadByte(UINT Data)

{

unsigned long rx_data;

ROM_SSIDataPut(SSI0_BASE, Data);

ROM_SSIDataGet(SSI0_BASE, &rx_data);

return rx_data;    

}



Sellaless SPI 테스트 예제 를 참고 하면 되는데 속도를 필요로 한다면 아무래도 레지스터를 직접 제어 하는것이 좋을것 같다.


UINT SPI0_WriteReadByte(UINT Data)

{

    // Wait until there is space.

    while(!(HWREG(SSI0_BASE + SSI_O_SR) & SSI_SR_TNF))

    {

    }


    // Write the data to the SSI.

    HWREG(SSI0_BASE + SSI_O_DR) = Data;

    while(!(HWREG(SSI0_BASE + SSI_O_SR) & SSI_SR_RNE))

    {

    }


    // Read data from SSI.

    return (HWREG(SSI0_BASE + SSI_O_DR));

}







TM4C123 EVM - 3축 가속도 센서 드라이버 코드





//-----------------------------------------------------------------------------

// myAccel3LV02 HAL

#define MY_ACCEL3LV02_SPI_MODE 1

#define MY_ACCEL3LV02_I2C_MODE 0


#define ACCEL_CS_BIT BIT4

#define ACCEL_CS_PORT PORTB


#define ACCEL_CS_INIT() ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);\

                                        ROM_GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE, ACCEL_CS_BIT);

#define ACCEL_CS_ASSERT() PB4 = 0

#define ACCEL_CS_DEASSERT() PB4 = ACCEL_CS_BIT;


#define ACCEL_SPI_INIT()         SPI0_Init()

#define ACCEL_Read SPI0_WriteReadByte

#define ACCEL_Write SPI0_WriteReadByte

//-----------------------------------------------------------------------------




TM4C123 EVM - 3축 가속도 센서 예제 코드

int main(void)

{

    short data;

    

    SystemInit();

    Led1Init();

    Led1On();

    

    Led2Init();

    Led2On();

    

    DebugInit(BAUD_115200);

    DebugPrint("TM4C Uart Test\r\n");


myAccel3lvInit();

myAccel3lvWrite(CTRL_REG1, 0xC7); //1000.0111 Power on, enable all axis, self test off


    DebugPrint("WHO_AM_I: %x\r\n", myAccel3lvRead(WHO_AM_I));    


    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 't':

DebugPrint("WHO_AM_I: %x\r\n", myAccel3lvRead(WHO_AM_I));

break;

case 'r':

GetAccelValue(AXIS_X, &data);

DebugPrint("%d\r\n", data);

break;

}

}       

    }


}


Posted by nexp

댓글을 달아 주세요

Cortex-M/NUVOTON2014.07.09 12:52

M052LBN EVM - SPI 테스트

M052LBN EVM - SPI 테스트




M052LBN는 저렴한 MCU임에도 2채널의 SPI를 제공한다. FIFO있고 SPI속도도 빠르다.




M052LBN SPI 블록도



M052LBN SPI 초기화 함수

void SPI0_Init(void)

{

SYS_UnlockReg();    

     CLK_EnableModuleClock(SPI0_MODULE);

         

    /* Set multi function pin for SPI1 */

    //SYS->P0_MFP = SYS_MFP_P04_SPISS1 | SYS_MFP_P05_MOSI_1 | SYS_MFP_P06_MISO_1 | SYS_MFP_P07_SPICLK1;

     SYS->P1_MFP = SYS_MFP_P15_MOSI_0 | SYS_MFP_P16_MISO_0 | SYS_MFP_P17_SPICLK0;

    

    

        /* Select HXT as the clock source of SPI1 */

    CLK_SetModuleClock(SPI0_MODULE, CLK_CLKSEL1_SPI0_S_HCLK, MODULE_NoMsk);


    /* Enable SPI1 peripheral clock */

    CLK_EnableModuleClock(SPI0_MODULE);

    

    /* Lock protected registers */

    SYS_LockReg();

    

    

    /* Configure SPI1 as a master, MSB first, 8-bit transaction, SPI Mode-0 timing, clock is 6MHz */

    SPI_Open(SPI0, SPI_MASTER, SPI_MODE_0, 8, 6000000);


    /* Enable the automatic hardware slave select function. Select the SS0 pin and configure as low-active. */

    SPI_EnableAutoSS(SPI0, SPI_SS, SPI_SS_ACTIVE_LOW);

}




SPI_CNTRL 레지스터





M052LBN SPI 송수신 함수

unsigned char SPI0_WriteReadByte(unsigned char Data)

{

    SPI_WRITE_TX0(SPI0, Data);

    /* Trigger SPI transfer */

    SPI_TRIGGER(SPI0);


    /* Check busy state */

    while(SPI_IS_BUSY(SPI0));


   return SPI_READ_RX0(SPI0);

}


Posted by nexp

댓글을 달아 주세요

[TI]/LM3S1xx2014.06.06 21:27

LM3S101 SPI 테스트

LM3S101 SPI 테스트



LM3S101 SPI 초기화 함수

//----------------------------------------------------------------

// SPI 통신 초기화 함수

void SPI0_Init(void) 

{

SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI0);

GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_2 | GPIO_PIN_4 | GPIO_PIN_5);

GPIOPadConfigSet(GPIO_PORTA_BASE, GPIO_PIN_2 | GPIO_PIN_4 | GPIO_PIN_5,

GPIO_STRENGTH_4MA, GPIO_PIN_TYPE_STD_WPU);

 

SSIConfigSetExpClk(SSI0_BASE, SysCtlClockGet(), SSI_FRF_MOTO_MODE_0,

  SSI_MODE_MASTER, 1000000, 8);

SSIEnable(SSI0_BASE);

SPI0_SetSpeed(SPI_SPEED_1MHZ);

}

//----------------------------------------------------------------




LM3S101 SPI 송수신 함수

SUINT SPI0_WriteReadByte(SUINT Data)

{

    // Wait until there is space.

    while(!(HWREG(SSI0_BASE + SSI_O_SR) & SSI_SR_TNF))

    {

    }


    // Write the data to the SSI.

    HWREG(SSI0_BASE + SSI_O_DR) = Data;

    while(!(HWREG(SSI0_BASE + SSI_O_SR) & SSI_SR_RNE))

    {

    }


    // Read data from SSI.

    return (HWREG(SSI0_BASE + SSI_O_DR));

}


Posted by nexp

댓글을 달아 주세요

[ST_MICRO]/STM82014.05.04 19:30

STM8S - SPI 테스트

STM8S - SPI 테스트



STM8S의 SPI는 최대 클럭 스피드 10Mhz로 동작한다. 동급의 8bit MCU인 AVR과 비교하면 조금더 성능이 좋아 보인다.

S-Type EVM 보드를 이용하여 SPI인터페이스의 가속도센서를 테스트 해 보았다.



STM8S SPI블록도

8bit MCU의 전형적이 SPI구조 이고 AVR과 비교 했을때 큰 차이가 없어 보인다.





STM8S SPI초기화 함수

void SPI0_Init(void)

{

SPI_DeInit();

SPI_Init(SPI_FIRSTBIT_MSB, 

            SPI_BAUDRATEPRESCALER_32, 

            SPI_MODE_MASTER, 

            SPI_CLOCKPOLARITY_LOW, 

            SPI_CLOCKPHASE_2EDGE, 

            SPI_DATADIRECTION_2LINES_FULLDUPLEX, 

            SPI_NSS_HARD, 0x00);

SPI_Cmd(ENABLE);

}



STM8S SPI송수신 함수

레지스터의 SPI_FLAG_TXE 비트를 검사해서 1이면 SPI버퍼가 비어 있으므로 데이터를 쓰고, SPI_FLAG_RXNE비트가 1이되면 읽을 준비가 되었으므로 수신한 값을 리턴하면 된다.

unsigned char SPI0_WriteReadByte(unsigned char Data)

{

while (SPI_GetFlagStatus(SPI_FLAG_TXE) == RESET);

SPI->DR = Data;


while(SPI_GetFlagStatus(SPI_FLAG_RXNE) == RESET);


return SPI->DR;

}




Posted by nexp

댓글을 달아 주세요