Hi,
I'm using TM4C123G for reading register (data ) through SPI from a BMP280 Barometric Pressure Sensor. I've tried almost everything, but nothing works. It seems that TM4c123g does not receive anything. I post my code here. What ist wrong?
/*
* main.c
*/
#include <stdbool.h>
#include <stdint.h>
#include <math.h>
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/gpio.h"
#include "driverlib/pin_map.h"
#include "driverlib/sysctl.h"
#include "driverlib/uart.h"
#include "utils/uartstdio.h"
#include "driverlib/ssi.h"
#include "driverlib/ssi.c"
enum
{
BMP280_REG_RESULT_PRESSURE = 0xF7,
BMP280_REG_RESULT_TEMPRERATURE = 0xFA,
BMP280_COMMAND_TEMPERATURE = 0x2E,
BMP280_COMMAND_PRESSURE0 = 0x25,
BMP280_COMMAND_PRESSURE1 = 0x29,
BMP280_COMMAND_PRESSURE2 = 0x2D,
BMP280_COMMAND_PRESSURE3 = 0x31,
BMP280_COMMAND_PRESSURE4 = 0x5D,
SLAVE_ADDRESS = 0x76,
BMP280_REGISTER_DIG_T1 = 0x88,
BMP280_REGISTER_DIG_T2 = 0x8A,
BMP280_REGISTER_DIG_T3 = 0x8C,
BMP280_REGISTER_DIG_P1 = 0x8E,
BMP280_REGISTER_DIG_P2 = 0x90,
BMP280_REGISTER_DIG_P3 = 0x92,
BMP280_REGISTER_DIG_P4 = 0x94,
BMP280_REGISTER_DIG_P5 = 0x96,
BMP280_REGISTER_DIG_P6 = 0x98,
BMP280_REGISTER_DIG_P7 = 0x9A,
BMP280_REGISTER_DIG_P8 = 0x9C,
BMP280_REGISTER_DIG_P9 = 0x9E,
BMP280_REGISTER_CHIPID = 0xD0,
BMP280_REGISTER_VERSION = 0xD1,
BMP280_REGISTER_SOFTRESET = 0xE0,
BMP280_REGISTER_CAL26 = 0xE1, // R calibration stored in 0xE1-0xF0
BMP280_REGISTER_CONTROL = 0xF4,
BMP280_REGISTER_CONFIG = 0xF5,
BMP280_REGISTER_PRESSUREDATA = 0xF7,
BMP280_REGISTER_TEMPDATA = 0xFA,
};
void initSPI();
void SPIWrite(uint32_t SPI_BASE , uint16_t SPI_WAdres ,uint16_t SPI_Wdata );
int32_t SPIRead(uint32_t SPI_BASE , uint32_t SPI_RAdres );
int32_t TEST;
void main(void){
SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ);
initSPI();
SysCtlDelay(40000);
while(1){
TEST = SPIRead(SSI0_BASE,0x89);
}
}
void initSPI(void)
{
// SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |SYSCTL_XTAL_8MHZ);
// Enable the SSI0 peripheral
SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI0);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
// The SSI0 peripheral is on Port A and pins 2,3,4 and 5.
// Enable GPIO port A
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
uint32_t clockk=SysCtlClockGet();
SysCtlClockGet();
SSIConfigSetExpClk(SSI0_BASE, SysCtlClockGet(), SSI_FRF_TI, SSI_MODE_MASTER, 500000, 8);
// This function/s configures the pin muxing on port A pins 2,3,4 and 5
// It uses the values DEFINED at the top of the program and takes 1 parameter
GPIOPinConfigure(GPIO_PA2_SSI0CLK);
GPIOPinConfigure(GPIO_PA3_SSI0FSS);
GPIOPinConfigure(GPIO_PA4_SSI0RX);
GPIOPinConfigure(GPIO_PA5_SSI0TX);
SysCtlDelay(4);
// Configures the pins for use by the SSI, takes 2 parameters
GPIOPinTypeSSI(GPIO_PORTA_BASE, GPIO_PIN_5 | GPIO_PIN_4 | GPIO_PIN_3 |
GPIO_PIN_2);
SysCtlDelay(4);
// Configures the SSI port for SPI master mode, it takes 6 parameters
//SSIConfigSetExpClk(SSI0_BASE, 2000000 , SSI_FRF_MOTO_MODE_3, SSI_MODE_MASTER, 1600 , 8 );
GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE, GPIO_PIN_3);
GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_3, 0xFF);
// Enables the SSI0 module
SSIEnable(SSI0_BASE);
SysCtlDelay(4);
uint32_t scrap;
while(SSIDataGetNonBlocking(SSI0_BASE, &scrap));
}
void SPIWrite(uint32_t SPI_BASE , uint16_t SPI_WAdres ,uint16_t SPI_Wdata ){
//uint32_t send_data=0;
GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_3, 0x00);
SSIDataPut(SPI_BASE, SPI_WAdres);
while(SSIBusy(SPI_BASE));
SSIDataPut(SPI_BASE, SPI_Wdata);
while(SSIBusy(SPI_BASE));
GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_3, 0xff);
}
int32_t SPIRead(uint32_t SPI_BASE , uint32_t SPI_RAdres ){
int32_t receive_data_adress=0,values=0;
GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_3, 0x00);
receive_data_adress=SPI_RAdres|0x80;
SSIDataPut(SPI_BASE, receive_data_adress);
while(SSIBusy(SPI_BASE));
SSIDataPut(SPI_BASE, 0xff);
while(SSIBusy(SPI_BASE));
//SSIDataGet(SPI_BASE, &values);
while(SSIDataGetNonBlocking(SPI_BASE, &values));
GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_3, 0xff);
return values;
}