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.
//===========================================================================