This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

CCS/TMS320F28335: SPI data couldn't be received from tlv2548

Part Number: TMS320F28335
Other Parts Discussed in Thread: TLV2548, , ADS8332

Tool/software: Code Composer Studio

 I am trying to interface tlv2548 with TMS320F28335.  The pins are defined as attached figure here with.  The code I got from TI website is an implemebatation of ADS8332 interfacing with TMS320f28335. Cosidering a datasheet , I have  some how customized to tlv2548. The customized code is also shown bellow. My problem is that I couldn't receive data from the slave(tlv2548).  It stops at while loop highlighted  in yellow color below. Sending data   and the  SPICLK looks okay on Oscilloscope.. would you help me please in solving this problem?

 Thank you in advance.

#define BUF_SIZE 5 // Sample buffer size

#define SIZE 4000// 8192 // ADC Result buffer size

#define Sampling_Period 1000 // 1000us for 1ksps sampling speed

#include "DSP28x_Project.h" // Device Headerfile and Examples Include File

#define BUF_SIZE 5 // Sample buffer size

#define SIZE 4000// 8192 // ADC Result buffer size

#define Sampling_Period 1000 // 1000us for 1ksps sampling speed

#include "DSP28x_Project.h" // Device Headerfile and Examples Include File

¡¡

Uint16 ADS833x_Buf[BUF_SIZE];

Uint16 ADS833x_Result[SIZE];

// ADS8332 CFR: internal OSC/Manual-Trigger/250ksps/INT active low/auto nap disabled/nap&deep nap disabled/TAG disabled

Uint16 ADS833x_CFR_Reg = 0xEBD; // 0xFBD for Auto channel select and Manual-Trigger,/INT function

// 0x7BD for Manual channel select and Manual-Trigger,/INT function

Uint16 ADS833x_Write_Com = 0xA000; // Command for writing CFR registers

Uint16 Reg_Word;

// Prototype statements for functions found within this file.

// interrupt void ISRTimer2(void);

void delay_loop(void);

void spi_xmit(Uint16 a);

void spi_fifo_init(void);

void spi_init(void);

void error(void);

void ADS833x_init(void);

void ADS833x_WriteRegister(Uint16 Data);

Uint16 ADS833x_ReadRegister();

Uint16 ADS833x_ReadData();

void ADS833x_Channel_Select(Uint16 Data) ;

¡¡

¡¡

Uint16 InByte,rdata;

void main(void)

{

// Uint16 sdata; // send data

// Uint16 rdata; // received data;

// Step 1. Initialize System Control:

// PLL, WatchDog, enable Peripheral Clocks

// This example function is found in the DSP2833x_SysCtrl.c file.

InitSysCtrl();

// Step 2. Initalize GPIO:

// This example function is found in the DSP2833x_Gpio.c file and

// illustrates how to set the GPIO to it's default state.

// InitGpio(); // Skipped for this example

// Setup only the GP I/O only for SPI-A functionality

// This function is found in DSP2833x_Spi.c

InitSpiaGpio();

// Step 3. Clear all interrupts and initialize PIE vector table:

// Disable CPU interrupts

DINT;

// Initialize PIE control registers to their default state.

// The default state is all PIE interrupts disabled and flags

// are cleared.

// This function is found in the DSP2833x_PieCtrl.c file.

InitPieCtrl();

// Disable CPU interrupts and clear all CPU interrupt flags:

IER = 0x0000;

IFR = 0x0000;

// Initialize the PIE vector table with pointers to the shell Interrupt

// Service Routines (ISR).

// This will populate the entire table, even if the interrupt

// is not used in this example. This is useful for debug purposes.

// The shell ISR routines are found in DSP2833x_DefaultIsr.c.

// This function is found in DSP2833x_PieVect.c.

InitPieVectTable();

// Step 4. Initialize all the Device Peripherals:

// This function is found in DSP2833x_InitPeripherals.c

// InitPeripherals(); // Not required for this example

spi_fifo_init(); // Initialize the Spi FIFO

spi_init(); // init SPI

InitSpiGpio();

¡¡

ADS833x_init();

// Step 5. User specific code:

// Interrupts are not used in this example.

InByte = 0x00;

for(;;)

{

// Transmit data

// spi_xmit(sdata);

// Wait until data is received

ADS833x_Channel_Select(0x00);

InByte = ADS833x_ReadData();

while(SpiaRegs.SPIFFRX.bit.RXFFST !=1) { }

// Check against sent data

// rdata = SpiaRegs.SPIRXBUF;

// if(rdata != InByte ) error();

// if(sdata == 255)

// sdata = 0;

// sdata += 5;

}

}

¡¡

// Step 7. Insert all local Interrupt Service Routines (ISRs) and functions here:

void delay_loop()

{

long i;

for (i = 0; i < 1000000; i++) {}

}

¡¡

void error(void)

{

asm(" ESTOP0"); // Test failed!! Stop!

for (;;);

}

void spi_init()

{

SpiaRegs.SPICCR.all =0x000F; // Reset on, rising edge, 16-bit char bits

SpiaRegs.SPICTL.all =0x0006; // Enable master mode, normal phase,

// enable talk, and SPI int disabled.

SpiaRegs.SPIBRR = 0x007F;

SpiaRegs.SPICCR.all =0x008F; // Relinquish SPI from Reset

// SpiaRegs.SPICCR.bit.SPILBK = 0;

SpiaRegs.SPIPRI.bit.FREE = 1; // Set so breakpoints don't disturb xmission

}

void spi_xmit(Uint16 a)

{

SpiaRegs.SPITXBUF=a;

}

void spi_fifo_init()

{

// Initialize SPI FIFO registers

SpiaRegs.SPIFFTX.all=0xE040;

SpiaRegs.SPIFFRX.all=0x204f;

SpiaRegs.SPIFFCT.all=0x0;

}

void ADS833x_Channel_Select(Uint16 Data)

{

Data = Data << 12;

while(SpiaRegs.SPISTS.bit.BUFFULL_FLAG !=0) { } // Wait until SPITXBUF is free

SpiaRegs.SPITXBUF = Data;

}

¡¡

void ADS833x_init() // Initialize ADS833x

{

Reg_Word = ADS833x_Write_Com + ADS833x_CFR_Reg;

ADS833x_WriteRegister(Reg_Word); // ADS833x internal CFR register configuration

// while(SpiaRegs.SPISTS.bit.INT_FLAG !=1){} // Wait until RX data is ready

while(SpiaRegs.SPIFFRX.bit.RXFFST !=1) { }

ADS833x_Buf[0] = ADS833x_ReadRegister();

ADS833x_Buf[1] = ADS833x_Buf[0] & 0x0FFF;

if(ADS833x_CFR_Reg != ADS833x_Buf[1]) error( ); // Check that CFR register content

}

void ADS833x_WriteRegister(Uint16 Data) // Write CMR and CFR register

{

while(SpiaRegs.SPISTS.bit.BUFFULL_FLAG !=0) { } // Wait until SPITXBUF is free

SpiaRegs.SPITXBUF = Data;

}

Uint16 ADS833x_ReadRegister() // Read CFR register

{

Uint16 rData0;

while(SpiaRegs.SPISTS.bit.BUFFULL_FLAG !=0) { } // Wait until SPITXBUF is free

SpiaRegs.SPITXBUF= 0x9000;

while(SpiaRegs.SPISTS.bit.BUFFULL_FLAG !=0){} // Wait until SPITXBUF is free

rData0 = SpiaRegs.SPIRXBUF; // Read RXBUF to clear INT_FLAG

// while(SpiaRegs.SPISTS.bit.INT_FLAG !=1){} // Wait until RX data is ready

while(SpiaRegs.SPIFFRX.bit.RXFFST !=1) { }

rData0 = SpiaRegs.SPIRXBUF;

return rData0;

}

Uint16 ADS833x_ReadData() // Read conversion data

{

Uint16 rData;

while(SpiaRegs.SPISTS.bit.BUFFULL_FLAG !=0) { } // Wait until SPITXBUF is free

SpiaRegs.SPITXBUF= 0xE000;

while(SpiaRegs.SPISTS.bit.BUFFULL_FLAG !=0){} // Wait until SPITXBUF is free

rData = SpiaRegs.SPIRXBUF; // Read RXBUF to clear INT_FLAG

// while(SpiaRegs.SPISTS.bit.INT_FLAG !=1){} // Wait until RX data is ready

while(SpiaRegs.SPIFFRX.bit.RXFFST !=1) { }

rData = SpiaRegs.SPIRXBUF;

return rData;

}

//===========================================================================

// No more.

//===========================================================================

{

Uint16 rData0;

while(SpiaRegs.SPISTS.bit.BUFFULL_FLAG !=0) { } // Wait until SPITXBUF is free

SpiaRegs.SPITXBUF= 0x9000;

while(SpiaRegs.SPISTS.bit.BUFFULL_FLAG !=0){} // Wait until SPITXBUF is free

rData0 = SpiaRegs.SPIRXBUF; // Read RXBUF to clear INT_FLAG

// while(SpiaRegs.SPISTS.bit.INT_FLAG !=1){} // Wait until RX data is ready

while(SpiaRegs.SPIFFRX.bit.RXFFST !=1) { }

rData0 = SpiaRegs.SPIRXBUF;

return rData0;

}

Uint16 ADS833x_ReadData() // Read conversion data

{

Uint16 rData;

while(SpiaRegs.SPISTS.bit.BUFFULL_FLAG !=0) { } // Wait until SPITXBUF is free

SpiaRegs.SPITXBUF= 0xE000;

while(SpiaRegs.SPISTS.bit.BUFFULL_FLAG !=0){} // Wait until SPITXBUF is free

rData = SpiaRegs.SPIRXBUF; // Read RXBUF to clear INT_FLAG

// while(SpiaRegs.SPISTS.bit.INT_FLAG !=1){} // Wait until RX data is ready

while(SpiaRegs.SPIFFRX.bit.RXFFST !=1) { }

rData = SpiaRegs.SPIRXBUF;

return rData;

}

//===========================================================================

// No more.

//===========================================================================

  • Hi Fakadu,
    I think you may be receiving 0x0000 in your final rdata value and hence causing an error.

    Here is what I think may be happening,

    After your line, 'Reg_Word = ADS833x_Write_Com + ADS833x_CFR_Reg;' Reg_Word should be 0xAEBD

    Then you write that to the TX Buffer with the line 'ADS833x_WriteRegister(Reg_Word);'

    However, afterwards when you include the line, 'ADS833x_Buf[0] = ADS833x_ReadRegister();'
    The code goes to the indicated function where you write 0x9000 to the TX Buffer.
    The first time you assign the contents of the RX Buffer to rData0 the value should be 0xAEBD
    The second time you assign the contents of the RX Buffer to rData0 the value should be 0x9000
    The value that you return out of the function would then be 0x9000

    The contents of ADS833x_Buf[0] will be 0x9000
    Bit wise anding that result with 0x0FFF will yield 0x0000

    Then in your if statement , 'if(ADS833x_CFR_Reg != ADS833x_Buf[1]) error( );
    ADS833x_CFR_Reg and ADS833x_Buf[1] will never equal

    I am not sure why you wrote 0x9000 to the TX Buffer but if you want your code to get past the highlighted if statement then I would get rid of the that and get rid of the second rData0 assignment.
    0xAEBD & 0xFFF would then yield 0xEBD, equaling the value of ADS833x_CFR_Reg

    Is this what you are experiencing?

    Best Regards,

    Marlyn

  • Fikadu,

    Please ask pointed question. Saying "SPI doesn't receive data" is too open-ended. Please provide more inputs like scopeshots, configuration details (not SPI code), why a certain bit isn't getting set when TRM say so etc.

    Regards,
    Manoj
  • Marlyn,
    Thank you a lot for your response.
    0x9000 is to ready CFR register command as it is specified within datasheet. later i observed that SPISTE is always high. I guess that is the main problem for not to receive data. Do you have any idea to solve that?
    Thank you.
  • Manoj,
    Thank you a lot for your help.
    Haardware Pins configuration is as figure attched above, where as GPIO configuration is as follows:

    GpioCtrlRegs.GPAPUD.bit.GPIO16 = 0; // Enable pull-up on GPIO16 (SPISIMOA)
    GpioCtrlRegs.GPAPUD.bit.GPIO17 = 0; // Enable pull-up on GPIO17 (SPISOMIA)
    GpioCtrlRegs.GPAPUD.bit.GPIO18 = 0; // Enable pull-up on GPIO18 (SPICLKA)
    GpioCtrlRegs.GPAPUD.bit.GPIO19 = 0; // Enable pull-up on GPIO19 (SPISTEA)

    As I gave a reply to Marlyn, SPISTE is always high when loopback is disbaled. would you suggest me a way to clear this error?
    Thank you
  • Fikadu,
    I am assuming you did not change anything in the InitSpiaGpio() function? More specifically, you kept the part where GPIO19 gets configured as SPISTE.
    Would you please include a screen capture of what you are seeing with the signals properly labeled to better help you?

    Also, this post talks about a similar issue. It would not hurt to look through it,
    e2e.ti.com/.../490553

    Best Regards,
    Marlyn
  • Fikadu,
    I have not heard back from you in a few days,
    Have you been able to get the screen captures or resolve your issue?
     
    Best Regards,
    Marlyn

  • Fikadu,
    I will be closing this thread soon. Please post if you would like for me to not close the thread.

    Best Regards,
    Marlyn
  • Marlyn,
    Sorry for late reply. I just shifted to some other thing, because it couldn't be solved and I didn't have much time to spend on it.
    I guess, it is better to close the ussue for the time being and I will open when I will back to it in case I face a problem.

    Thank you a lot
  • Fikadu,

    We will close the thread for now. If you do not reply within 30 days, the thread will lock. You can then click the "Ask a related question" button, which will create a new thread but add a link to this one.

    Regards,
    Mark