[INTERFACE]/ESP82662017. 9. 7. 04:44

ESP8266 SPI 테스트 - MAX31855 를 이용한 써모 커플 온도 읽기

ESP8266 SPI 테스트 - MAX31855 를 이용한 써모 커플 온도 읽기



[ESP8266-SSM EVM] 보드의 SPI포트는 IO12~IO14에 할당 되어 있다. Arduino Code 이므로 라이브러리 함수를 사용하면 쉽게 출력 할수 있다.








SPI 방식의 MAX31855 온도 센서 모듈을 이용하여 온도 값을 읽어 오는 예제를 테스트 해 보았다.

MAX31855 온도 센서 모듈은 SSM-EVM Type 핀맵에 호환되고 SSM-EVM 확장 테스트 보드에 연결하면 쉽게 테스트 가능하다.


MAX31855를 테스트 하기 위해 기존 SPI 코드를 이용해도 되지만 Ardino 예제를 이용해 보고 싶어서  Arduino 라이브러리를 검색해서 추가 하였다.



기본 제공 예제를 이용하면 써모커플의 온도 값을 가져오는 것을 확인 할 수 있다.

#include <MAX31855.h> // Include MAX31855 Sensor library

/*******************************************************************************************************************

** Declare all program constants                                                                                  **

*******************************************************************************************************************/

const uint32_t SERIAL_SPEED     = 115200; ///< Set the baud rate for Serial I/O

const uint8_t  SPI_CHIP_SELECT  =      15; ///< Chip-Select PIN for SPI

const uint8_t  SPI_MISO         =   MISO; ///< Master-In, Slave-Out PIN for SPI

const uint8_t  SPI_SYSTEM_CLOCK =    SCK; ///< System Clock PIN for SPI


/*******************************************************************************************************************

** Declare global variables and instantiate classes                                                               **

*******************************************************************************************************************/

MAX31855_Class MAX31855; ///< Create an instance of MAX31855


/***************************************************************************************************************//*!

* @brief    Arduino method called once at startup to initialize the system

* @details  This is an Arduino IDE method which is called first upon boot or restart. It is only called one time

*           and then control goes to the main "loop()" method, from which control never returns

* @return   void

*******************************************************************************************************************/

void setup()

{

  Serial.begin(SERIAL_SPEED);

  #ifdef  __AVR_ATmega32U4__  // If this is a 32U4 processor, then wait 3 seconds for the interface to initialize

    delay(3000);

  #endif

  Serial.println(F("Starting software SPI demo program for MAX31855"));

  Serial.print(F("Initializing MAX31855 sensor\n"));

  /********************************************************************************************

  ** Uncomment out either the hardware or software SPI call, depending upon which is in use  **

  ********************************************************************************************/

  while (!MAX31855.begin(SPI_CHIP_SELECT))                            // Hardware SPI for MAX31855

//while (!MAX31855.begin(SPI_CHIP_SELECT,SPI_MISO,SPI_SYSTSEM_CLOCK)) // Software SPI for MAX31855

  {

    Serial.println(F("Unable to start MAX31855. Waiting 3 seconds."));

    delay(3000);

  } // of loop until device is located

 Serial.println();

} // of method setup()


/***************************************************************************************************************//*!

* @brief    Arduino method for the main program loop

* @details  This is the main program for the Arduino IDE, it is an infinite loop and keeps on repeating.

* @return   void

*******************************************************************************************************************/

void loop()

{

  int32_t ambientTemperature = MAX31855.readAmbient(); // retrieve MAX31855 die ambient temperature

  int32_t probeTemperature   = MAX31855.readProbe();   // retrieve thermocouple probe temp

  uint8_t faultCode          = MAX31855.fault();       // retrieve any error codes

  if ( faultCode )                                     // Display error code if present

  {

    Serial.print("Fault code ");

    Serial.print(faultCode);

    Serial.println(" returned.");

  }

  else

  {

    Serial.print("Ambient Temperature is ");

    Serial.print((float)ambientTemperature/1000,3);

    Serial.println("\xC2\xB0""C");

    Serial.print("Probe Temperature is   ");

    Serial.print((float)probeTemperature/1000,3);

    Serial.println("\xC2\xB0""C\n");

  } // of if-then-else an error occurred

  delay(5000);

} // of method loop()




실행하면 MAX31855에 연결된 써모커플의 온도 값을 읽어오는 것을 확인 할 수 있다.



Posted by nexp

댓글을 달아 주세요

[MSP430]/MSP4322016. 5. 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. 7. 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. 7. 9. 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. 6. 6. 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

댓글을 달아 주세요