|
本帖最后由 fpgaw 于 2011-1-14 09:39 编辑
SPARTAN 3E STARTER KIT板载DAC程序[代码示例]
#include "xparameters.h"
#include "stdio.h"
#include "xutil.h"
#include "xgpio_l.h" /* general-purpose I/O peripheral control functions */
//====================================================
void usleep(unsigned int delay);
void spi_init(void);
void spi_write(unsigned char data);
void set_dac(unsigned char channel,unsigned int data);
int main (void) {
print("-- Entering main() --\r\n");
//XGpio_mSetDataDirection(XPAR_LEDS_8BIT_BASEADDR, 1, 0x00000000);
XGpio_mSetDataDirection(XPAR_SPI_DISABLE_BASEADDR, 1, 0x00000000);
XGpio_mSetDataDirection(XPAR_FLAH_DISABLE_BASEADDR, 1, 0x00000000);
XGpio_mSetDataDirection(XPAR_SDI_BASEADDR, 1, 0x00000000);
XGpio_mSetDataDirection(XPAR_SDO_BASEADDR, 1, 0xffffffff);
XGpio_mSetDataDirection(XPAR_SCK_BASEADDR, 1, 0x00000000);
XGpio_mSetDataDirection(XPAR_DAC_CS_BASEADDR, 1, 0x00000000);
XGpio_mSetDataDirection(XPAR_DAC_CLR_BASEADDR, 1, 0x00000000);
XGpio_mWriteReg(XPAR_SPI_DISABLE_BASEADDR, 1, 0x60000000);
XGpio_mWriteReg(XPAR_FLAH_DISABLE_BASEADDR, 1, 0xe0000000);
//XGpio_mWriteReg(XPAR_LEDS_8BIT_BASEADDR, 1, 0x0000000e);
spi_init();
set_dac(0,2500);
set_dac(1,3000);
set_dac(2,2500);
set_dac(3,3000);
return 0;
}
void usleep(unsigned int delay)
{
unsigned int j, i;
for(i=0; i<delay; i++)
for(j=0; j<10000; j++);
}
void spi_init(void)
{
XGpio_mSetDataReg(XPAR_SCK_BASEADDR, 1, 0x00000000);//SCK=0
XGpio_mSetDataReg(XPAR_DAC_CS_BASEADDR, 1, 0xffffffff);//DAC_CS=1
XGpio_mSetDataReg(XPAR_DAC_CLR_BASEADDR, 1, 0xffffffff);//DAC_CLR=1
}
void spi_write(unsigned char data)
{
unsigned char i;
for(i=0;i<8;i++)
{
if(data&0x80)
{
XGpio_mWriteReg(XPAR_SDI_BASEADDR, 1, 0xffffffff);
}
else
{
XGpio_mWriteReg(XPAR_SDI_BASEADDR, 1, 0x00000000);
}
XGpio_mWriteReg(XPAR_SCK_BASEADDR, 1, 0x00000000);//SCK=0
usleep(10);
XGpio_mWriteReg(XPAR_SCK_BASEADDR, 1, 0xffffffff);//SCK=1
usleep(10);
data=data<<1;
}
}
/***********************************************************************
channel:select output channel
A:0
B:1
C:2
D:3
dataAC data 0 to 4095
**********************************************************************/
void set_dac(unsigned char channel,unsigned int data)
{
unsigned char high;
unsigned char low;
spi_init();
XGpio_mSetDataReg(XPAR_DAC_CS_BASEADDR, 1, 0x00000000);//DAC_CS=0
spi_write(0x00);
usleep(10);
spi_write(0x30+channel);//spi_write(0x31);//channel B
usleep(10);
//spi_write(0xBB);
high=(data&0xff0)>>4;
spi_write(high);
usleep(10);
//spi_write(0x80);
low=(data&0xf)<<4;
spi_write(low);
usleep(10);
XGpio_mSetDataReg(XPAR_DAC_CS_BASEADDR, 1, 0xffffffff);//DAC_CS=1
} |
|