Part Number: TMS320F280049
Other Parts Discussed in Thread: ADS1248, C2000WARE, ADS1298
Hi Team,
I am afraid this might me be a long question. Anyway I will make it as short as possible. I am trying to establish communication between 280049 and ADS1248. I am experiencing following issues while doing the same.
1. At first I was not using FIFO and not monitoring DRDY pin for data conversion completion indication. Instead I used an appropriate delay of 201 milli seconds (5SPS) in between SYNC command and RDATA command to read conversion result from ADC. While doing like this I was not able read correct results from ADC. I probed my SPI pins in this condition and observed that instead of a series of data I am having only the first data (0x1640) appearing on my SIMO pin and after that SIMO pin stays at high state irrespective of any data written to transmit buffer.
SpiaRegs.SPITXBUF = 0xFF06; // Send the RESET command and wait for 0.6ms
DELAY_US(600);
// Register configuration of ADS1248
SpiaRegs.SPITXBUF = 0x1640; // Send the SDATAC command and WREG Command 1st byte
SpiaRegs.SPITXBUF = 0x030A; // WREG Command 2nd byte and MUX0 register value
SpiaRegs.SPITXBUF = 0x0020; // VBIAS register value and MUX1 register value
SpiaRegs.SPITXBUF = 0x404A; // SYS0 register and WREG 1st command byte
SpiaRegs.SPITXBUF = 0x0105; // WREG 2nd command byte and IDAC0 register value
SpiaRegs.SPITXBUF = 0x0304; // IDAC1 register value and NOP command
My SPI baud rate is at 1MHz and system clock frequency is at 100MHz. Considering ADS1248 is a slow slave I started to add delay in between each transfer that is in between each write to spi transmit buffer. With trial and error I got expected results with a delay of 20 micro seconds in between each transfer.
SpiaRegs.SPITXBUF = 0xFF06; // Send the RESET command and wait for 0.6ms
DELAY_US(600);
// Register configuration of ADS1248
SpiaRegs.SPITXBUF = 0x1640; // Send the SDATAC command and WREG Command 1st byte
DELAY_US(20);
SpiaRegs.SPITXBUF = 0x030A; // WREG Command 2nd byte and MUX0 register value
DELAY_US(20);
SpiaRegs.SPITXBUF = 0x0020; // VBIAS register value and MUX1 register value
DELAY_US(20);
SpiaRegs.SPITXBUF = 0x404A; // SYS0 register and WREG 1st command byte
DELAY_US(20);
SpiaRegs.SPITXBUF = 0x0105; // WREG 2nd command byte and IDAC0 register value
DELAY_US(20);
SpiaRegs.SPITXBUF = 0x0304; // IDAC1 register value and NOP command
DELAY_US(20);
With this code everything was working fine but I can't have this much delay in my code due to other limitations. Why this delay is required? anything less than 20 micro seconds is not working.
2. Since I was was facing issues with Non FIFO transfer I attempted to transmit data using FIFO but without any interrupts. Using FIFO I am able to send data correctly through SIMO without delay. Since it is a duplex transmission I considered resetting receive FIFO pointer to zero before receiving my conversion results. When I wrote code like the following resetting FIFO it doesn't resetting the FIFO.
SpiaRegs.SPITXBUF = 0xFF12; // NOP and RDATA SpiaRegs.SPIFFRX.bit.RXFIFORESET = 0; SpiaRegs.SPIFFRX.bit.RXFIFORESET = 1;
But when I wrote the code like the following It is actually resetting the FIFO. Why this happens?
SpiaRegs.SPIFFRX.bit.RXFIFORESET = 0; SpiaRegs.SPITXBUF = 0xFF12; // NOP and RDATA SpiaRegs.SPIFFRX.bit.RXFIFORESET = 1;
3. Even if I successfully cleared FIFO I am sending only 32 clock cycles to get 4 bytes of data that is 2 FIFO inputs (2 bytes of each). Instead of 2 data each of 2 byte the FIFOSTS is showing 4 data inside FIFO. From where the extra two data coming from? Is there is any provision to look into FIFO memory location to actually observe the stack manually?
SpiaRegs.SPIFFRX.bit.RXFIFORESET = 0; SpiaRegs.SPITXBUF = 0xFF12; // NOP and RDATA SpiaRegs.SPIFFRX.bit.RXFIFORESET = 1; SpiaRegs.SPITXBUF = 0xFFFF; // NOP commands to receive first 2 bytes of data SpiaRegs.SPITXBUF = 0xFFFF; // NOP commands to receive second 2 bytes of data while(SpiaRegs.SPIFFRX.bit.RXFFST < 4); // RXFFST is 4 here instead of 2
I am attaching total full code along with this.
/* EXTERNAL CRYSTAL FREQUENCY 20MHz
*******************************************************************************/
//-----------------------------------------------------------------------------
// Include Header Files
// ----------------------------------------------------------------------------
#include"F28x_Project.h"
void main()
{
int32 r1 = 0x00000000,r3 = 0x00000000;
int16 r2 = 0x0000;
// Initiate system controls, GPIO pins, interrupt
InitSysCtrl();
InitGpio();
EALLOW;
GpioCtrlRegs.GPAGMUX1.bit.GPIO9 = 1;
GpioCtrlRegs.GPAMUX1.bit.GPIO9 = 3; // set Gpio pin 9 as SPI clock pin
GpioCtrlRegs.GPAPUD.bit.GPIO9 = 0; // Pull up enable
GpioCtrlRegs.GPAQSEL1.bit.GPIO9 = 3; // Qualifier Selection
GpioCtrlRegs.GPAGMUX1.bit.GPIO8 = 1;
GpioCtrlRegs.GPAMUX1.bit.GPIO8 = 3; // set Gpio pin 8 as SPI SIMO pin
GpioCtrlRegs.GPAPUD.bit.GPIO8 = 0; // Pull up enable
GpioCtrlRegs.GPAQSEL1.bit.GPIO8 = 3; // Qualifier Selection
GpioCtrlRegs.GPAGMUX1.bit.GPIO10 = 1;
GpioCtrlRegs.GPAMUX1.bit.GPIO10 = 3; // set Gpio pin 10 as SPI SOMI pin
GpioCtrlRegs.GPAPUD.bit.GPIO10 = 0; // Pull up enable
GpioCtrlRegs.GPAQSEL1.bit.GPIO10 = 3; // Qualifier Selection
GpioCtrlRegs.GPAGMUX1.bit.GPIO14 = 0;
GpioCtrlRegs.GPAMUX1.bit.GPIO14 = 0; // set Gpio pin 14 as GPIO output pin (CS/)
GpioCtrlRegs.GPADIR.bit.GPIO14 = 1; // set direction as output
GpioCtrlRegs.GPAGMUX1.bit.GPIO15 = 0;
GpioCtrlRegs.GPAMUX1.bit.GPIO15 = 0; // set Gpio pin 15 as GPIO output pin (START)
GpioCtrlRegs.GPADIR.bit.GPIO15 = 1; // set direction as output
GpioCtrlRegs.GPBGMUX1.bit.GPIO34 = 0;
GpioCtrlRegs.GPBMUX1.bit.GPIO34 = 0; // set Gpio pin 34 as GPIO output pin (ADC_RST)
GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1; // set direction as output (ADC_RST)
EDIS;
GpioDataRegs.GPACLEAR.bit.GPIO15 = 1; // START pin LOW
GpioDataRegs.GPASET.bit.GPIO14 = 1; // Clear CS/ pin to high
GpioDataRegs.GPBSET.bit.GPIO34 = 1; // ADC Reset disabled
// SpiaRegs.SPIFFTX.all = 0xE040;
// SpiaRegs.SPIFFRX.all = 0x2044;
// SpiaRegs.SPIFFCT.all = 0x0;
SpiaRegs.SPIFFTX.bit.SPIFFENA = 1; // Enable FIFO mode
SpiaRegs.SPIFFTX.bit.TXFFINTCLR = 1;
SpiaRegs.SPIFFTX.bit.TXFIFO = 1;
SpiaRegs.SPIFFTX.bit.SPIRST = 1;
SpiaRegs.SPIFFRX.bit.RXFFOVFCLR = 1;
SpiaRegs.SPIFFRX.bit.RXFFINTCLR = 1;
SpiaRegs.SPIFFRX.bit.RXFIFORESET = 1;
SpiaRegs.SPICCR.bit.SPISWRESET = 0; // clear software reset bit
SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1; // master mode selected
SpiaRegs.SPICTL.bit.CLK_PHASE = 0; // clock phase selection
SpiaRegs.SPICCR.bit.CLKPOLARITY = 0; // clock polarity
SpiaRegs.SPIBRR.bit.SPI_BIT_RATE = 24; //(25MHz/25 = 1 MHz)
SpiaRegs.SPICCR.bit.SPICHAR = 15; // character per transfer
SpiaRegs.SPISTS.bit.INT_FLAG = 1; // clear interrupt flag
SpiaRegs.SPISTS.bit.OVERRUN_FLAG = 1; // clear over run flag
SpiaRegs.SPIPRI.bit.FREE = 1;
SpiaRegs.SPICCR.bit.SPILBK = 0; // loop back disable
SpiaRegs.SPICTL.bit.TALK = 1; // slave talk enabled
SpiaRegs.SPICTL.bit.SPIINTENA = 0; // interrupt disable
SpiaRegs.SPICCR.bit.SPISWRESET = 1; // software reset disabled
GpioDataRegs.GPACLEAR.bit.GPIO14 = 1; // Clear CS/ pin to low
GpioDataRegs.GPASET.bit.GPIO15 = 1; // Enable the device by setting START pin high
DELAY_US(1);
SpiaRegs.SPIFFRX.bit.RXFIFORESET = 0;
SpiaRegs.SPITXBUF = 0xFF06; // Send the RESET command and wait for 0.6ms
DELAY_US(600);
// Register configuration of ADS1248
SpiaRegs.SPITXBUF = 0x1640; // Send the SDATAC command and WREG Command 1st byte
SpiaRegs.SPITXBUF = 0x030A; // WREG Command 2nd byte and MUX0 register value
SpiaRegs.SPITXBUF = 0x0020; // VBIAS register value and MUX1 register value
SpiaRegs.SPITXBUF = 0x404A; // SYS0 register and WREG 1st command byte
SpiaRegs.SPITXBUF = 0x0105; // WREG 2nd command byte and IDAC0 register value
SpiaRegs.SPITXBUF = 0x0304; // IDAC1 register value and NOP command
// GpioDataRegs.GPACLEAR.bit.GPIO15 = 1; // START pin held low
// while(SpiaRegs.SPIFFTX.bit.TXFFST !=0);
GpioDataRegs.GPASET.bit.GPIO14 = 1; // Clear CS/ pin to high
DELAY_US(201000);
GpioDataRegs.GPACLEAR.bit.GPIO14 = 1; // Clear CS/ pin to low
DELAY_US(1);
SpiaRegs.SPITXBUF = 0xFF12; // NOP and RDATA
SpiaRegs.SPIFFRX.bit.RXFIFORESET = 1;
SpiaRegs.SPITXBUF = 0xFFFF; // NOP commands
SpiaRegs.SPITXBUF = 0xFFFF; // NOP commands
while(SpiaRegs.SPIFFRX.bit.RXFFST < 4);
r1 = SpiaRegs.SPIRXBUF;
r2 = SpiaRegs.SPIRXBUF;
r2 = SpiaRegs.SPIRXBUF;
r2 = SpiaRegs.SPIRXBUF;
r3 = (r1<<8)+(r2>>8);
DELAY_US(1);
GpioDataRegs.GPASET.bit.GPIO14 = 1; // Clear CS/ pin to high
}
Thank you,
Vineeth N

