'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);
|