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.

C5535 ezDSP SPI interface with external ADC

Other Parts Discussed in Thread: ADS1220

Hi,

I am trying to establish communication with the external ADC, ADS1220, and I am using the CSL_spi_internalLB example coupled with trying to implement the psuedo code recommended in the adc's datasheet. I have two main questions. The pseudo code recommends to assert the CS to high and low at different points in the code and I am not sure how to do that in the DSP. Is that the same idea as the spi_Open function? Additionally, I'm unsure of how to check for when DRDY transitions to low,  or send the 24 sclk rising edges to read out conversion data on DOUT/DRDY.

Below is my code that is attempting to interface and communicate with the ADC. It currently just shows that in the read buffer old configurations that I wrote to the write buffer.  Any advice is appreciated and it would also be nice to know if I am moving in the write path as far as the code goes or going in the wrong direction. Thank you in advance.

Best Regards,

Ulbert

#include "csl_spi.h"
#include "csl_general.h"
#include "cslr_spi_001.h"
#include "corazon.h"
#include "ezdsp5535.h"
#include <stdio.h>

#define CSL_TEST_FAILED         (1)
#define CSL_TEST_PASSED         (0)

#define	CSL_SPI_BUF_LEN			(1)//(64)
#define	SPI_CLK_DIV				(24)
#define	SPI_FRAME_LENGTH		(1)

Uint16 spiWriteBuff[CSL_SPI_BUF_LEN];
Uint16 spiReadBuff[CSL_SPI_BUF_LEN];


Int16 spi_sample(void)
{
	Int16 			status = CSL_TEST_PASSED;
	Int16 			result;
	CSL_SpiHandle	hSpi;
	SPI_Config		hwConfig;
	volatile Uint32	looper;

	result = SPI_init();

	if(CSL_SOK != result)
	{
		status = CSL_TEST_FAILED;
		return (status);
	}
	else
	{
		printf ("SPI Instance Initialize successfully\n");
	}

	//see if this is the equivalent of asserting the CS
	hSpi = SPI_open(SPI_CS_NUM_1, SPI_POLLING_MODE);

	if(NULL == hSpi)
	{
		return (CSL_TEST_FAILED);
	}
	else
	{
		printf ("SPI Instance Opened successfully\n");
	}

	/** Set the hardware configuration 							*/
	hwConfig.spiClkDiv	= SPI_CLK_DIV;
	hwConfig.wLen		= SPI_WORD_LENGTH_8;
	hwConfig.frLen		= SPI_FRAME_LENGTH;
	hwConfig.wcEnable	= SPI_WORD_IRQ_DISABLE;
	hwConfig.fcEnable	= SPI_FRAME_IRQ_DISABLE;
	hwConfig.csNum		= SPI_CS_NUM_1;
	hwConfig.dataDelay	= SPI_DATA_DLY_0;
	hwConfig.csPol		= SPI_CSP_ACTIVE_LOW;
	hwConfig.clkPol		= SPI_CLKP_LOW_AT_IDLE;
	hwConfig.clkPh		= SPI_CLK_PH_RISE_EDGE; //was falling edge

	result = SPI_config(hSpi, &hwConfig);

	if(CSL_SOK != result)
	{
		return (CSL_TEST_FAILED);
	}
	else
	{
		printf ("SPI Instance Configured successfully\n");
	}

	/*Enable the Internal Loopback mode*/
#if (defined(CHIP_C5517))
    CSL_FINST(CSL_SPI_REGS->SPIDCRU,SPI_SPIDCRU_LPBK,ENABLE);
#else
#if (defined(CHIP_C5505_C5515) || defined(CHIP_C5504_C5514))
    CSL_FINST(CSL_SPI_REGS->SPIDC2,SPI_SPIDC2_LPBK,ENABLE);
#endif
#endif

	for(looper = 0; looper < CSL_SPI_BUF_LEN; )
	{
		spiWriteBuff[looper] = 0;
		if(CSL_SPI_BUF_LEN>1){
		spiWriteBuff[(looper + 1)] = 0;
		spiReadBuff[(looper + 1)] = 0;
		}
		spiReadBuff[looper] = 0;
		//spiReadBuff[(looper + 1)] = 0;
		looper += 2;
	}
	
	//send reset command (0x06h)
//	spiWriteBuff[7] = 0; 
//	spiWriteBuff[6] = 0;
//	spiWriteBuff[5] = 0;
//	spiWriteBuff[4] = 0; 
//	spiWriteBuff[3] = 0;
//	spiWriteBuff[2] = 1; 
//	spiWriteBuff[1] = 1; 
//	spiWriteBuff[0] = 0; 
 	spiWriteBuff[0] = 0x0006;
	/* Write the Data to the SPI*/
	result = SPI_dataTransaction(hSpi ,spiWriteBuff, CSL_SPI_BUF_LEN, SPI_WRITE);
	if(CSL_SOK != result)
	{
		return (CSL_TEST_FAILED);
	}
	else
	{
		printf ("SPI Instance Write successfully\n");
	}
	EZDSP5535_waitusec(10000);
	
	//send write reg command 
	spiWriteBuff[0] = 0x0040; //write to register 0, 1byte(8bits), (0100 0000)
	/* Write the Data to the SPI*/
	result = SPI_dataTransaction(hSpi ,spiWriteBuff, CSL_SPI_BUF_LEN, SPI_WRITE);
	if(CSL_SOK != result)
	{
		return (CSL_TEST_FAILED);
	}
	else
	{
		printf ("SPI Instance Write successfully\n");
	}
	
	
	//config first buffer
//	spiWriteBuff[7] = 1; //config the input to be AIN1 and negative reference to be tied to ground
//	spiWriteBuff[6] = 0;
//	spiWriteBuff[5] = 0;
//	spiWriteBuff[4] = 1;
//	spiWriteBuff[3] = 0;//config the gain to be one
//	spiWriteBuff[2] = 0;
//	spiWriteBuff[1] = 0;
//	spiWriteBuff[0] = 1;//disable PGA
 	spiWriteBuff[0] = 0x0090;


	/* Write the Data to the SPI*/
	result = SPI_dataTransaction(hSpi ,spiWriteBuff, CSL_SPI_BUF_LEN, SPI_WRITE);
	if(CSL_SOK != result)
	{
		return (CSL_TEST_FAILED);
	}
	else
	{
		printf ("SPI Instance Write successfully\n");
	}
	
	//send write reg command 
	spiWriteBuff[0] = 0x0044; //write to register 1, 1byte(8bits), (0100 0100)
	/* Write the Data to the SPI*/
	result = SPI_dataTransaction(hSpi ,spiWriteBuff, CSL_SPI_BUF_LEN, SPI_WRITE);
	if(CSL_SOK != result)
	{
		return (CSL_TEST_FAILED);
	}
	else
	{
		printf ("SPI Instance Write successfully\n");
	}
	
	
	//config second buffer
//	spiWriteBuff[7] = 1; //config the sampling frequency to 330 sps duty cycle
//	spiWriteBuff[6] = 1;
//	spiWriteBuff[5] = 0;
//	spiWriteBuff[4] = 0; //set to duty cycle sampling mode
//	spiWriteBuff[3] = 1;
//	spiWriteBuff[2] = 1; //set for continuous conversion mode
//	spiWriteBuff[1] = 0; //disable temp converter
//	spiWriteBuff[0] = 0; //disable burnout current sensor
 	spiWriteBuff[0] = 0x00CC;
	/* Write the Data to the SPI*/
	result = SPI_dataTransaction(hSpi ,spiWriteBuff, CSL_SPI_BUF_LEN, SPI_WRITE);
	if(CSL_SOK != result)
	{
		return (CSL_TEST_FAILED);
	}
	else
	{
		printf ("SPI Instance Write successfully\n");
	}
	
	//send write reg command 
	spiWriteBuff[0] = 0x0048; //write to register 0, 1byte(8bits), (0100 1000)
	/* Write the Data to the SPI*/
	result = SPI_dataTransaction(hSpi ,spiWriteBuff, CSL_SPI_BUF_LEN, SPI_WRITE);
	if(CSL_SOK != result)
	{
		return (CSL_TEST_FAILED);
	}
	else
	{
		printf ("SPI Instance Write successfully\n");
	}
	
	
	//config third buffer
//	spiWriteBuff[7] = 1; //config analog supply as voltage reference
//	spiWriteBuff[6] = 1; 
//	spiWriteBuff[5] = 1; //config for 60Hz rejection filtering
//	spiWriteBuff[4] = 1;
//	spiWriteBuff[3] = 0;//config default
//	spiWriteBuff[2] = 0;//config for default
//	spiWriteBuff[1] = 0;
//	spiWriteBuff[0] = 0;
 	spiWriteBuff[0] = 0x00F0;
	/* Write the Data to the SPI*/
	result = SPI_dataTransaction(hSpi ,spiWriteBuff, CSL_SPI_BUF_LEN, SPI_WRITE);
	if(CSL_SOK != result)
	{
		return (CSL_TEST_FAILED);
	}
	else
	{
		printf ("SPI Instance Write successfully\n");
	}
	
		//send write reg command 
	spiWriteBuff[0] = 0x004C; //write to register 0, 1byte(8bits), (0100 1100)
	/* Write the Data to the SPI*/
	result = SPI_dataTransaction(hSpi ,spiWriteBuff, CSL_SPI_BUF_LEN, SPI_WRITE);
	if(CSL_SOK != result)
	{
		return (CSL_TEST_FAILED);
	}
	else
	{
		printf ("SPI Instance Write successfully\n");
	}
	
	
	//config fourth buffer
//	spiWriteBuff[7] = 0; //config default
//	spiWriteBuff[6] = 0;
//	spiWriteBuff[5] = 0;
//	spiWriteBuff[4] = 0;//default
//	spiWriteBuff[3] = 0;
//	spiWriteBuff[2] = 0;
//	spiWriteBuff[1] = 1;//set DREADY/DOUT when data is ready
//	spiWriteBuff[0] = 0;//reserved
 	spiWriteBuff[0] = 0x0001;
	/* Write the Data to the SPI*/
	result = SPI_dataTransaction(hSpi ,spiWriteBuff, CSL_SPI_BUF_LEN, SPI_WRITE);
	if(CSL_SOK != result)
	{
		return (CSL_TEST_FAILED);
	}
	else
	{
		printf ("SPI Instance Write successfully\n");
	}
	
	//optional sanity check to read back all registers with RREG cmd(0x23h)
//	spiWriteBuff[7] = 0; //not sure if to write to spi or read from spi
//	spiWriteBuff[6] = 0;
//	spiWriteBuff[5] = 1;
//	spiWriteBuff[4] = 0;
//	spiWriteBuff[3] = 0;
//	spiWriteBuff[2] = 0;
//	spiWriteBuff[1] = 1;
//	spiWriteBuff[0] = 1;
 
//	spiWriteBuff[0] = 0x0023;
//	/* Write the Data to the SPI*/
//	result = SPI_dataTransaction(hSpi ,spiWriteBuff, CSL_SPI_BUF_LEN, SPI_WRITE);
//	if(CSL_SOK != result)
//	{
//		return (CSL_TEST_FAILED);
//	}
//	else
//	{
//		printf ("SPI Instance Write successfully\n");
//	}	

	//send start command (0x08h)
//	spiWriteBuff[7] = 0; 
//	spiWriteBuff[6] = 0;
//	spiWriteBuff[5] = 0;
//	spiWriteBuff[4] = 0;
//	spiWriteBuff[3] = 1;
//	spiWriteBuff[2] = 0;
//	spiWriteBuff[1] = 0;
//	spiWriteBuff[0] = 0;
 	spiWriteBuff[0] = 0x0008;
	/* Write the Data to the SPI*/
	result = SPI_dataTransaction(hSpi ,spiWriteBuff, CSL_SPI_BUF_LEN, SPI_WRITE);
	if(CSL_SOK != result)
	{
		return (CSL_TEST_FAILED);
	}
	else
	{
		printf ("SPI Instance Write successfully\n");
	}
	EZDSP5535_waitusec(100);
	while(1){
		//send read data command 
	spiWriteBuff[0] = 0x0010; //write to register 0, 1byte(8bits), (0001 0000)
	/* Write the Data to the SPI*/
	result = SPI_dataTransaction(hSpi ,spiWriteBuff, CSL_SPI_BUF_LEN, SPI_WRITE);
	if(CSL_SOK != result)
	{
		return (CSL_TEST_FAILED);
	}
	else
	{
		printf ("SPI Instance Write successfully\n");
	}
		
	/* Read the Data to the SPI*/
	result = SPI_dataTransaction(hSpi ,spiReadBuff, CSL_SPI_BUF_LEN, SPI_READ);
	if(CSL_SOK != result)
	{
		return (CSL_TEST_FAILED);
	}
	else
	{
		printf ("SPI Instance Read successfully\n");
	}

	printf("readBuff = %04x\n", spiReadBuff[0]);
	}
	result = SPI_close(hSpi);

	if(CSL_SOK != result)
	{
		return (CSL_TEST_FAILED);
	}
	else
	{
		printf ("SPI Instance Close successfully\n");
	}

	/* Compare the Data */
	for( looper = 0 ; looper  < CSL_SPI_BUF_LEN ; looper++ )
	{
		if(spiWriteBuff[looper] != spiReadBuff[looper] )
		{
			return (CSL_TEST_FAILED);
		}
    }
	return (status);

}