Tool/software: Code Composer Studio
I am not getting any reading from the peripheral (ADXL345)
I tried reading device ID(which should be 0xe5), but it returns 0. All the data values I get is 0.
Here's my code:
#include <stdbool.h> #include <stdint.h> #include "inc/hw_memmap.h" #include "driverlib/gpio.h" #include "driverlib/pin_map.h" #include "driverlib/ssi.h" #include "driverlib/sysctl.h" #include "driverlib/uart.h" #include "utils/uartstdio.h" #define READ 0x8000 // Register Codes #define DEVID 0x00 #define THRESH_TAP 0x1D #define OFSX 0x1E #define OFSY 0x1F #define OFSZ 0x20 #define DUR 0x21 #define LATENT 0x22 #define WINDOW 0x23 #define THRESH_ACT 0x24 #define THRESH_INACT 0x25 #define TIME_INACT 0x26 #define ACT_INACT_CTL 0x27 #define THRESH_FF 0x28 #define TIME_FF 0x29 #define TAP_AXES 0x2A #define ACT_TAP_STATUS 0x2B #define BW_RATE 0x2C #define POWER_CTL 0x2D #define INT_ENABLE 0x2E #define INT_MAP 0x2F #define INT_SOURCE 0x30 #define DATA_FORMAT 0x31 #define DATAX0 0x32 #define DATAX1 0x33 #define DATAY0 0x34 #define DATAY1 0x35 #define DATAZ0 0x36 #define DATAZ1 0x37 #define FIFO_CTL 0x38 #define FIFO_STATUS 0x39 //Power Control Register Bits #define WU_0 (1<<0) //Wake Up Mode - Bit 0 #define WU_1 (1<<1) //Wake Up mode - Bit 1 #define SLEEP (1<<2) //Sleep Mode #define MEASURE (1<<3) //Measurement Mode #define AUTO_SLP (1<<4) //Auto Sleep Mode bit #define LINK (1<<5) //Link bit //Interrupt Enable/Interrupt Map/Interrupt Source Register Bits #define OVERRUN (1<<0) #define WATERMARK (1<<1) #define FREE_FALL (1<<2) #define INACTIVITY (1<<3) #define ACTIVITY (1<<4) #define DOUBLE_TAP (1<<5) #define SINGLE_TAP (1<<6) #define DATA_READY (1<<7) //Data Format Bits #define RANGE_0 (1<<0) #define RANGE_1 (1<<1) #define JUSTIFY (1<<2) #define FULL_RES (1<<3) #define INT_INVERT (1<<5) #define SPI (1<<6) #define SELF_TEST (1<<7) #define PIN_LOW 0x00 #define PIN_HIGH 0xFF int i=0; void InitConsole(void) { // Enable GPIO port A which is used for UART0 pins. SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); // Configure the pin muxing for UART0 functions on port A0 and A1. // This step is not necessary if your part does not support pin muxing. GPIOPinConfigure(GPIO_PA0_U0RX); GPIOPinConfigure(GPIO_PA1_U0TX); // Enable UART0 so that we can configure the clock. SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); // Use the internal 16MHz oscillator as the UART clock source. UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC); // Select the alternate (UART) function for these pins. GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); // Initialize the UART for console I/O. UARTStdioConfig(0, 115200, 16000000); } void InitSPI(void) { // The SSI2 peripheral must be enabled for use. SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI2); // Enable Port B SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); // SETUP SPI CS Pin (to output) GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE, GPIO_PIN_5); // Set SPI CS to HIGH (active-low) GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_6, 0xFF); // Configure the pin muxing for SSI2 functions on port B4, B5, B6, and B7. GPIOPinConfigure(GPIO_PB4_SSI2CLK); GPIOPinConfigure(GPIO_PB5_SSI2FSS); GPIOPinConfigure(GPIO_PB6_SSI2RX); GPIOPinConfigure(GPIO_PB7_SSI2TX); // Configure the GPIO settings for the SSI pins. GPIOPinTypeSSI(GPIO_PORTB_BASE, GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7); // Configure and enable the SSI port for SPI master mode. Use SSI2, // system clock supply, idle clock level low and active low clock in // freescale SPI mode, master mode, 1MHz SSI frequency, and 8-bit data. // For SPI mode, you can set the polarity of the SSI clock when the SSI // unit is idle. You can also configure what clock edge you want to // capture data on. Please reference the datasheet for more information on // the different SPI modes. SSIConfigSetExpClk(SSI2_BASE, SysCtlClockGet(), SSI_FRF_MOTO_MODE_3, SSI_MODE_MASTER, 1000000, 8); // Enable the SSI2 module. SSIEnable(SSI2_BASE); // Read any residual data from the SSI port. This makes sure the receive // FIFOs are empty, so we don't read any unwanted junk. This is done here // because the SPI SSI mode is full-duplex, which allows you to send and // receive at the same time. The SSIDataGetNonBlocking function returns // "true" when data was returned, and "false" when no data was returned. // The "non-blocking" function checks if there is any data in the receive // FIFO and does not "hang" if there isn't. uint32_t scrap; while(SSIDataGetNonBlocking(SSI2_BASE, &scrap)); } int main(void) { // Set the clocking to run directly from the external crystal/oscillator. SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ); // Set up UART Serial Output InitConsole(); // Set up SSI2 for SPI Communication InitSPI(); UARTprintf("............................................\n"); GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_5, 0x00); SSIDataPut(SSI2_BASE, 0x31); // DATA_FORMAT while(SSIBusy(SSI2_BASE)); SSIDataPut(SSI2_BASE, 0x01); // +/- 4g GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_5, 0xFF); GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_5, 0x00); SSIDataPut(SSI2_BASE, 0x2D); // POWER_CTL while(SSIBusy(SSI2_BASE)); SSIDataPut(SSI2_BASE, 0x08); GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_5, 0xFF); GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_5, 0x00); SSIDataPut(SSI2_BASE, POWER_CTL|MEASURE); //Put the Accelerometer into measurement mode while(SSIBusy(SSI2_BASE)){} SSIDataPut(SSI2_BASE, 0x08); GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_5, 0xFF); uint32_t device_id; SSIDataPut(SSI2_BASE, READ|DEVID); SSIDataGet(SSI2_BASE, &device_id); while(SSIBusy(SSI2_BASE)){} UARTprintf("%i\n", device_id); while (1) { uint32_t values[6]; int16_t x, y, z; SSIDataPut(SSI2_BASE, READ|DATAX0); SSIDataGet(SSI2_BASE, &values[0]); while(SSIBusy(SSI2_BASE)){} SSIDataPut(SSI2_BASE, READ|DATAX1); SSIDataGet(SSI2_BASE, &values[1]); while(SSIBusy(SSI2_BASE)){} x = values[1] | (values[0]>>8); SSIDataPut(SSI2_BASE, READ|DATAY0); SSIDataGet(SSI2_BASE, &values[2]); while(SSIBusy(SSI2_BASE)){} SSIDataPut(SSI2_BASE, READ|DATAY1); SSIDataGet(SSI2_BASE, &values[3]); while(SSIBusy(SSI2_BASE)){} y = values[3] | (values[2]>>8); SSIDataPut(SSI2_BASE, READ|DATAZ0); SSIDataGet(SSI2_BASE, &values[4]); while(SSIBusy(SSI2_BASE)){} SSIDataPut(SSI2_BASE, READ|DATAZ1); SSIDataGet(SSI2_BASE, &values[5]); while(SSIBusy(SSI2_BASE)){} z = values[5] | (values[4]>>8); UARTprintf("%i\t\t%i\t\t%i\n", x, y, z); SysCtlDelay(50 * (SysCtlClockGet() /1000 /3)); } return(0); // will never return }
This is the output I am getting in puTTY:
............................................
0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
These are the warnings I am getting:
What am I missing?