Click Here To Return:

'C' Processor Side SPI Interface:


#define SPI_CONTROL *(unsigned char volatile *)(FPGA_BASE_ADDR + 0x40)
#define SPI_SPIE 0x80
#define	SPI_SPE 0x40
#define SPI_MSTR 0x10
#define SPI_CPOL 0X08
#define SPI_CPHA 0X04
#define SPI_SPR 0X03

#define SPI_STATUS *(unsigned char volatile *)(FPGA_BASE_ADDR + 0x41)
#define SPI_SPIF 0X80
#define SPI_WCOL 0X40
#define SPI_WFFULL 0X08
#define SPI_WFEMPTY 0x04
#define SPI_RFFULL 0x02
#define SPI_REMPTY 0X01

#define SPI_DATA *(unsigned char volatile *)(FPGA_BASE_ADDR + 0x42)
#define ADC_START_BIT 0X80
#define ADC_CHANNEL_0 0X00
#define ADC_CHANNEL_1 0X40
#define ADC_CHANNEL_2 0X10
#define ADC_CHANNEL_3 0X50
#define ADC_CHANNEL_4 0X20
#define ADC_CHANNEL_5 0X60
#define ADC_CHANNEL_6 0X30
#define ADC_CHANNEL_7 0X70
#define ADC_UNIPOLAR 0X08
#define ADC_SINGLE_ENDED 0X04
#define ADC_EXTERNAL_CLOCK 0X03
#define ADC_INTERNAL_CLOCK 0X02

#define SPI_EXTENSION *(unsigned char volatile *)(FPGA_BASE_ADDR + 0x43)
#define SPI_ICNT 0XC0
#define SPI_ESPR 0X03
#define SPI_TIME 0x01

void spi_Init(void)
{
// DIVIDE BY 64 IS 0X0101 IN SPR LSB & ESPR LSB 2XBits ea.
	SPI_EXTENSION = (0X80 | SPI_TIME);
	SPI_CONTROL = (SPI_SPIE | SPI_MSTR | SPI_TIME);
}

unsigned short int spi_Data_exchange(unsigned char channel)
{
	unsigned char temp_holding;
	unsigned short int temp2_holding;

	SPI_EXTENSION = (0X80 | SPI_TIME);
	SPI_CONTROL = (SPI_SPIE | SPI_MSTR | SPI_TIME);
	SPI_CONTROL = (SPI_SPIE | SPI_SPE | SPI_MSTR | SPI_TIME);
	
	temp_holding = (ADC_START_BIT | ADC_UNIPOLAR | ADC_SINGLE_ENDED |
					ADC_EXTERNAL_CLOCK);
	temp_holding |= (channel & 0x01) << 6;
	temp_holding |= (channel & 0x02) << 3;
	temp_holding |= (channel & 0x04) << 3;

	SPI_DATA = temp_holding;
	SPI_DATA = 0x00;
	SPI_DATA = 0x00;
	while(SPI_SPIF != (SPI_STATUS & SPI_SPIF))
	{
		feed_watchdog();
	}
	temp_holding = SPI_DATA;  // throw away the first one.
	temp_holding = SPI_DATA;  // throw away the first one.
	temp2_holding = temp_holding << 5;
	temp_holding = SPI_DATA;  // throw away the first one.
	temp2_holding += (temp_holding >> 3);

	SPI_CONTROL = (SPI_SPIE | SPI_MSTR | SPI_TIME);
	SPI_STATUS = SPI_SPIF;	// Clear out the interupts


	return(temp2_holding);
}

Calling Template:


// init the SPI engine
	spi_Init();
// writing & reading are simultaneous in SPI
	dprintf("\n\r ... SPI Data Exchange ...");
	c2uck = spi_Data_exchange(5);
	dprintf("\rdata val 5 =>%d",c2uck);

Click Here To Return: