spi test unit 26 로봇 sw 교육원 조용수. 학습 목표 spi sample spi read/write function spi...
TRANSCRIPT
SPI TestUNIT
26
로봇 SW 교육원조용수
2학습 목표
• SPI Sample • SPI Read/Write Function• SPI loop back Test• MPL115A1 Pressure and Temperature Sensor
3SPI Sample
• SPI Loop Back Source• \M051_Series_BSP_CMSIS_Rev3.00.001\Sam-
pleCode\StdDriver\SPI_Loopback\KEIL
4System Init
void SYS_Init(void){ SYS_UnlockReg();
CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART_S_HIRC, CLK_CLKDIV_UART(1)); CLK_SetModuleClock(SPI0_MODULE, CLK_CLKSEL1_SPI0_S_HCLK, MODULE_NoMsk);
CLK_EnableModuleClock(UART0_MODULE); CLK_EnableModuleClock(SPI0_MODULE);
SYS->P3_MFP = SYS_MFP_P30_RXD0 | SYS_MFP_P31_TXD0; SYS->P1_MFP = SYS_MFP_P14_SPISS0 | SYS_MFP_P15_MOSI_0 | SYS_MFP_P16_MISO_0 | SYS_MFP_P17_SPICLK0;
SYS_LockReg();
SystemCoreClockUpdate();}
5System Init
void SPI_Init(void){ /* Configure as a master, clock idle low, 32-bit transaction, drive out-put on falling clock edge and latch input on rising edge. */ /* Set IP clock divider. SPI clock rate = 2MHz */ SPI_Open(SPI0, SPI_MASTER, SPI_MODE_0, 32, 2000000);
/* Enable the automatic hardware slave select function. Select the SS pin and configure as low-active. */ SPI_EnableAutoSS(SPI0, SPI_SS, SPI_SS_ACTIVE_LOW);}
6System Init
while(1){ /* Write to TX register */ SPI_WRITE_TX0(SPI0, g_au32SourceData[u32DataCount]); /* Trigger SPI data transfer */ SPI_TRIGGER(SPI0); /* Check SPI0 bust status */ while(SPI_IS_BUSY(SPI0)); /* Read received data */ g_au32DestinationData[u32DataCount] = SPI_READ_RX0(SPI0); u32DataCount++; if(u32DataCount > TEST_COUNT) break;}
7System Init
while(1){ /* Write to TX register */ SPI_WRITE_TX0(SPI0, g_au32SourceData[u32DataCount]); /* Trigger SPI data transfer */ SPI_TRIGGER(SPI0); /* Check SPI0 bust status */ while(SPI_IS_BUSY(SPI0)); /* Read received data */ g_au32DestinationData[u32DataCount] = SPI_READ_RX0(SPI0); u32DataCount++; if(u32DataCount > TEST_COUNT) break;}
8MPL115A1
• Digitized pressure and temperature information to-gether with programmed calibration coefficients for host micro use.
• Factory calibrated• 50 kPa to 115 kPa absolute pressure• ±1 kPa accuracy• 2.375V to 5.5V supply• Integrated ADC• SPI Interface• Monotonic pressure and temperature data outputs• Surface mount RoHS compliant package
9MPL115A1
10MPL115A1
11MPL115A1 SPI Command
12System Init
void SPI_Init(void){ /* Configure as a master, clock idle low, 32-bit transaction, drive out-put on falling clock edge and latch input on rising edge. */ /* Set IP clock divider. SPI clock rate = 2MHz */ SPI_Open(SPI0, SPI_MASTER, SPI_MODE_0, 8, 2000000);
/* Enable the automatic hardware slave select function. Select the SS pin and configure as low-active. */ //SPI_EnableAutoSS(SPI0, SPI_SS, SPI_SS_ACTIVE_LOW);}
13MPL115A1
void writeSPI(char address , char data ){
int count = 1000;SPI_SET_SS_LOW(SPI0);while(count--);/* Write to TX register */SPI_WRITE_TX0(SPI0, address);/* Trigger SPI data transfer */SPI_TRIGGER(SPI0);/* Check SPI0 bust status */while(SPI_IS_BUSY(SPI0));/* Write to TX register */SPI_WRITE_TX0(SPI0, data);/* Trigger SPI data transfer */SPI_TRIGGER(SPI0);/* Check SPI0 bust status */while(SPI_IS_BUSY(SPI0));SPI_SET_SS_HIGH(SPI0);
}
14MPL115A1
char readSPI(char address){
char read;int count = 1000;SPI_SET_SS_LOW(SPI0);while(count--);
SPI_WRITE_TX0(SPI0, address);SPI_TRIGGER(SPI0);while(SPI_IS_BUSY(SPI0));
SPI_WRITE_TX0(SPI0, 0x00);SPI_TRIGGER(SPI0);while(SPI_IS_BUSY(SPI0));
read = SPI_READ_RX0(SPI0);SPI_SET_SS_HIGH(SPI0);return read;
}
15MPL115A1
#define NWS_BARO 30.04
#define PRESH 0x80 // 80#define PRESL 0x82 // 82#define TEMPH 0x84 // 84#define TEMPL 0x86 // 86
#define A0MSB 0x88 // 88#define A0LSB 0x8A // 8A#define B1MSB 0x8C // 8C#define B1LSB 0x8E // 8E#define B2MSB 0x90 // 90#define B2LSB 0x92 // 92#define C12MSB 0x94 // 94#define C12LSB 0x96 // 96#define C11MSB 0x98 // 98#define C11LSB 0x9A // 9A#define C22MSB 0x9C // 9C#define C22LSB 0x9E // 9E
16MPL115A1
float A0;float B1; float B2; float C12;void readMPL115A1_Coefficients() {
int A0H, A0L, B1H, B1L, B2H, B2L, C12H, C12L;A0H = readSPI(A0MSB);A0L = readSPI(A0LSB);A0 = (A0H << 5) + (A0L >> 3) + (A0L & 0x07) / 8.0;B1H = readSPI(B1MSB);B1L = readSPI(B1LSB);B1 = ((((B1H & 0x1F ) * 0x100) + B1L) / 8192.0) - 3;B2H = readSPI(B2MSB);B2L = readSPI(B2LSB);B2 = ((((B2H - 0x80 ) << 8) + B2L) / 16384.0) - 2;C12H = readSPI(C12MSB);C12L = readSPI(C12LSB);C12 = (((C12H * 0x100 ) + C12L) / 16777216.0) ;
}
17MPL115A1
float readMPL115A1() {
int count = 30000;unsigned char uiPH, uiPL;float press = 0.0;float pressure = 0.0;float presKPa = 0.0;float temp = 0.0;unsigned int uiTadc;
unsigned char uiTH, uiTL;unsigned int temperature_counts = 0;
writeSPI(0x24, 0x00); // Start temperature conversionwhile(count--);// Read pressureuiTH = readSPI(TEMPH);uiTL = readSPI(TEMPL);uiPH = readSPI(PRESH);uiPL = readSPI(PRESL);printf("Read MPL115A1 0x%x, 0x%x \n", uiTH, uiTL);printf("Read MPL115A1 0x%x, 0x%x \n", uiPH, uiPL);
18MPL115A1
uiTadc = (unsigned int) uiTH << 8;uiTadc += (unsigned int) uiTL & 0x00FF;// Temperature is a 10bit valueuiTadc = uiTadc >> 6;// -5.35 counts per °C, 472 counts is 25°Ctemp = 25 + (uiTadc - 472) / -5.35;printf("Temperature %f \n", temp);
press = ((uiPH * 256 ) + uiPL) / 64;temp = ((uiTH * 256) + uiTH) / 64;pressure = A0 + (B1 + C12 * temp) * press + B2 * temp;presKPa = pressure * (65.0/1023.0) + 50.0;printf("Pressure %f , Pressure(KPa) %f \n", pressure, presKPa);
}