Hi,
I am using the TIVA board to acquire the data from ADS1299 EVM daughter board via SPI.
I initialized the ADS1299 and then write/read register to/from it. But the value read is 0. This is the code. Thank you!
Qi
// INCLUDE
#include <stdint.h>
#include <stdbool.h>
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/debug.h"
#include "driverlib/fpu.h"
#include "driverlib/gpio.h"
#include "driverlib/pin_map.h"
#include "driverlib/rom.h"
#include "driverlib/sysctl.h"
#include "driverlib/uart.h"
#include "utils/uartstdio.h"
#include "math.h"
#include "stdio.h"
#include "inc/hw_ssi.h"
#include "driverlib/ssi.h"
// DEFINE
#define ADS_WAKEUP 0x2
#define ADS_STANDBY 0x4
#define ADS_RESET 0x6
#define ADS_START 0x8
#define ADS_STOP 0xA
#define ADS_RDATAC 0x10
#define ADS_SDATAC 0x11
#define ADS_RDATA 0x12
#define ADS_RREG 0x20
#define ADS_WREG 0x40
// GLOBAL VARIABLES
uint32_t read_value;
uint32_t value;
uint32_t value2;
uint32_t inst1;
uint32_t inst2;
//SUBFUNCTIONS
void LEDTwinkleTwice();
void ADS1299_SysCmdWrite(uint32_t value);
void ADS1299_ReadCmdWrite(uint32_t value);
void ADS1299_RegWrite(uint32_t adres,uint32_t value);
uint32_t ADS1299_RegRead(uint32_t adres2);
//MAIN FUNCTION
//3 steps. (step 1) config: clock/ssi/gpio/interrupt (step 2) config ADS1299 via SPI (step 3) acquire DATA from ADS1299
int main(void)
{
unsigned long ulindex=0;
unsigned long rxindex=0;
unsigned long ulData=0;
unsigned long rxData[16]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
unsigned long try=1;
unsigned long clockget=0;
unsigned int rxDataOne = 0xFF;
unsigned int reg_start_adress=0xFF;
unsigned int reg_number=0xFF;
unsigned int reg_value=0xFF;
//(step 1) config: clock/ssi/gpio/interrupt----------------------------------------------------------------------------------------------
//CONFIG CLOCK: 50MHz
SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ);
clockget = SysCtlClockGet();
//CONFIG GPIO&SSI: SSI0 master
SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI0);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
GPIOPinConfigure(GPIO_PA2_SSI0CLK);
GPIOPinConfigure(GPIO_PA3_SSI0FSS);
GPIOPinConfigure(GPIO_PA4_SSI0RX);
GPIOPinConfigure(GPIO_PA5_SSI0TX);
GPIOPinTypeSSI(GPIO_PORTA_BASE,GPIO_PIN_5|GPIO_PIN_4|GPIO_PIN_3|GPIO_PIN_2);
SSIConfigSetExpClk(SSI0_BASE, SysCtlClockGet(),SSI_FRF_MOTO_MODE_0,SSI_MODE_MASTER,10000, 8);
SSIEnable(SSI0_BASE);
//CONFIG GPIO:
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
GPIOPinTypeGPIOOutput(GPIO_PORTE_BASE, GPIO_PIN_1); //output, ADS SPI ~RESET,
GPIOPinTypeGPIOOutput(GPIO_PORTE_BASE, GPIO_PIN_2); //output, ADS SPI START,
GPIOPinTypeGPIOOutput(GPIO_PORTE_BASE, GPIO_PIN_4); //output, ADS SPI ~CS,
GPIOPinTypeGPIOInput(GPIO_PORTE_BASE, GPIO_PIN_5); //input, ADS SPI ~DRDY (interrupt)
GPIOPinWrite(GPIO_PORTE_BASE, GPIO_PIN_1, GPIO_PIN_1); //RESET=1
GPIOPinWrite(GPIO_PORTE_BASE, GPIO_PIN_2, 0); //START=0
GPIOPinWrite(GPIO_PORTE_BASE, GPIO_PIN_4, GPIO_PIN_4); //CS=1
//(step 2) config ADS1299 via SPI ----------------------------------------------------------------------------------------------
//(1) POR (2)RESET (3) issue SPI CS (4) SDATAC, write REG, read REG
SysCtlDelay(8000000); //(1) power up setup, poweronReset/OSC startup: 2power16 tclk of ADS
GPIOPinWrite(GPIO_PORTE_BASE, GPIO_PIN_1,0); //(2) RESET=0
SysCtlDelay(100000); //(2) wait more than 2 tclk + 18 tclk
GPIOPinWrite(GPIO_PORTE_BASE, GPIO_PIN_1,GPIO_PIN_1); //(2) RESET=1
SysCtlDelay(100000);
GPIOPinWrite(GPIO_PORTE_BASE,GPIO_PIN_4, 0); //(3) SPI CS=0
SysCtlDelay(8000000);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); //LED for debug
GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_2); //LED for debug
GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_2, GPIO_PIN_2); //LED for debug
GPIOPinWrite(GPIO_PORTF_BASE,GPIO_PIN_2, 0); //LED for debug
SSIDataPut(SSI0_BASE,ADS_SDATAC); //(4) SDATAC: stop ADS conversion command
while(SSIBusy(SSI0_BASE));
SysCtlDelay(100000);
//(4) write ADS reg: address (0x01-ADS CONFIG0), value(0x95), write 1 time
reg_start_adress = 0x01;
reg_number = 0x0; //0 represents 1 reg
reg_value = 0x95;
SSIDataPut(SSI0_BASE, ADS_WREG | (reg_start_adress & 0x1F));
while(SSIBusy(SSI0_BASE));
SysCtlDelay(100000);
SSIDataPut(SSI0_BASE,reg_number);
while(SSIBusy(SSI0_BASE));
SysCtlDelay(100000);
SSIDataPut(SSI0_BASE,reg_value);
while(SSIBusy(SSI0_BASE));
SysCtlDelay(100000);
/(4) read ADS reg: address (0x01-ADS CONFIG0), read 1 time
SSIDataPut(SSI0_BASE, ADS_RREG | (reg_start_adress & 0x1F));
while(SSIBusy(SSI0_BASE));
SysCtlDelay(100000);
SSIDataPut(SSI0_BASE,reg_number);
while(SSIBusy(SSI0_BASE));
SysCtlDelay(100000);
SSIDataPut(SSI0_BASE,0xFF); //dummy SPI write to get SPI RX data, which is prepared for ADS CONFIG0
while(SSIBusy(SSI0_BASE));
SysCtlDelay(100000);
for(ulindex = 0; ulindex <= 6; ulindex++)
//rx data 0 - 5 should be 0, data 6 should be 0x95 from ADS register, but it is still 0
{ //
// Wait until there is data to be read.
SSIDataGet(SSI0_BASE, &rxDataOne);
while(SSIBusy(SSI0_BASE));
rxData[ulindex] = rxDataOne;
try++;
}
try++;
}