Quantcast
Channel: Forums - Recent Threads
Viewing all articles
Browse latest Browse all 262198

I have a problem with DSP 28335 to develop a AD5754R by SPI.

$
0
0

when i confugured the SPI,the AD5754R can not receive information .please give me a hand . thank you .the program as follow:

// TI File $Revision: /main/8 $
// Checkin $Date: August 10, 2007 09:06:32 $
//###########################################################################
//
// FILE: Example_2833xSpi_FFDLB.c
//
// TITLE: DSP2833x Device Spi Digital Loop Back program.
//
// ASSUMPTIONS:
//
// This program requires the DSP2833x header files.
//
// This program uses the internal loop back test mode of the peripheral.
// Other then boot mode pin configuration, no other hardware configuration
// is required.
//
// As supplied, this project is configured for "boot to SARAM"
// operation. The 2833x Boot Mode table is shown below.
// For information on configuring the boot mode of an eZdsp,
// please refer to the documentation included with the eZdsp,
//
// $Boot_Table:
//
// GPIO87 GPIO86 GPIO85 GPIO84
// XA15 XA14 XA13 XA12
// PU PU PU PU
// ==========================================
// 1 1 1 1 Jump to Flash
// 1 1 1 0 SCI-A boot
// 1 1 0 1 SPI-A boot
// 1 1 0 0 I2C-A boot
// 1 0 1 1 eCAN-A boot
// 1 0 1 0 McBSP-A boot
// 1 0 0 1 Jump to XINTF x16
// 1 0 0 0 Jump to XINTF x32
// 0 1 1 1 Jump to OTP
// 0 1 1 0 Parallel GPIO I/O boot
// 0 1 0 1 Parallel XINTF boot
// 0 1 0 0 Jump to SARAM <- "boot to SARAM"
// 0 0 1 1 Branch to check boot mode
// 0 0 1 0 Boot to flash, bypass ADC cal
// 0 0 0 1 Boot to SARAM, bypass ADC cal
// 0 0 0 0 Boot to SCI-A, bypass ADC cal
// Boot_Table_End$
//
// DESCRIPTION:
//
// This program is a SPI example that uses the internal loopback of
// the peripheral. Interrupts are not used.
//
// A stream of data is sent and then compared to the recieved stream.
//
// The sent data looks like this:
// 0000 0001 0002 0003 0004 0005 0006 0007 .... FFFE FFFF
//
// This pattern is repeated forever.
//
// Watch Variables:
// sdata - sent data
// rdata - received data
//
////###########################################################################
// Original Author: S.S.
//
// $TI Release: DSP2833x Header Files V1.01 $
// $Release Date: September 26, 2007 $
//###########################################################################


#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h" // DSP2833x Examples Include File

// 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 DACInit(void);
void DACOutput(void);
void SpiTransfer(void);
void Delay(volatile unsigned int delay);

unsigned int tx_len;
unsigned char tx_data[256];
unsigned char *p_tx;


// DAC 寄存器组
struct
{

struct
{
volatile unsigned char Addr :3; // 0-2
volatile unsigned char REG :3; // 3-6
volatile unsigned char ZERO :1; // 7
volatile unsigned char RW :1; // 8
}CFG;
volatile short Data;
}DACReg;

void main(void)
{
// 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

InitXintf16Gpio(); //zq

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
// spi_fifo_init();
GpioDataRegs.GPBDAT.bit.GPIO57 = 1;
// Step 5. User specific code:
// Interrupts are not used in this example.
// DAC 初始化
// GpioDataRegs.GPBDAT.bit.GPIO57 = 1;
DACInit();
// 输出电压值
DACOutput();
while(1);
}


// Step 7. Insert all local Interrupt Service Routines (ISRs) and functions here:

void Delay(volatile unsigned int delay)
{
while(delay--);
}


void error(void)
{
asm(" ESTOP0"); // Test failed!! Stop!
for (;;);
}

void spi_init()
{
SpiaRegs.SPICCR.all =0x0007; // Reset on, rising edge, 8-bit char bits
SpiaRegs.SPICTL.all =0x0006; // Enable master mode, normal phase,
// enable talk, and SPI int disabled.
SpiaRegs.SPIBRR =0x007F;
SpiaRegs.SPICCR.all =0x0087; // Relinquish SPI from Reset
SpiaRegs.SPIPRI.bit.FREE = 1; // Set so breakpoints don't disturb xmission
}

/*void spi_fifo_init()
{
// Initialize SPI FIFO registers
SpiaRegs.SPIFFTX.all=0xA040;
SpiaRegs.SPIFFRX.all=0x204f;
SpiaRegs.SPIFFCT.all=0x0;
}*/
void DACInit(void)
{
// 
DACReg.CFG.RW = 0; // 
DACReg.CFG.ZERO = 0; // 恒为 0
DACReg.CFG.REG = 2; // 寄存器选择 电源控制寄存器
DACReg.CFG.Addr = 0; // 通道选择 无
DACReg.Data = 0x000F; // 数据 4 通道上电
tx_len = 3;
memcpy(&tx_data, &DACReg, 3);
SpiTransfer();

// 输出范围选择 0~10V
DACReg.CFG.RW = 0; // 写
DACReg.CFG.ZERO = 0; // 恒为 0
DACReg.CFG.REG = 1; // 寄存器选择 输出范围寄存器
DACReg.CFG.Addr = 4; // 通道选择 所有通道
DACReg.Data = 0x0001; // 数据 10V
tx_len = 3;
memcpy(&tx_data, &DACReg, 3);
SpiTransfer();
}
void DACOutput(void)
{
// DAC寄存器 VoutA = 3V
DACReg.CFG.RW = 0; // 写
DACReg.CFG.ZERO = 0; // 恒为 0
DACReg.CFG.REG = 0; // 寄存器选择 DAC 寄存器
DACReg.CFG.Addr = 4; // 通道选择 A通道
DACReg.Data = 0x4cc0; // 数据
tx_len = 3;
memcpy(&tx_data, &DACReg, 3);
SpiTransfer();
Delay(0xf);

// DAC寄存器 VoutB = 5V
DACReg.CFG.RW = 0; // 写
DACReg.CFG.ZERO = 0; // 恒为 0
DACReg.CFG.REG = 0; // 寄存器选择 DAC 寄存器
DACReg.CFG.Addr = 1; // 通道选择 B通道
DACReg.Data = 0x7ff0; // 数据
tx_len = 3;
memcpy(&tx_data, &DACReg, 3);
SpiTransfer();
Delay (0xf);

// DAC寄存器 VoutC = 7V
DACReg.CFG.RW = 0; // 写
DACReg.CFG.ZERO = 0; // 恒为 0
DACReg.CFG.REG = 0; // 寄存器选择 DAC 寄存器
DACReg.CFG.Addr = 2; // 通道选择 C通道
DACReg.Data = 0xb320; // 数据
tx_len = 3;
memcpy(&tx_data, &DACReg, 3);
SpiTransfer();
Delay(0xf);

// DAC寄存器 VoutD = 10V
DACReg.CFG.RW = 0; // 写
DACReg.CFG.ZERO = 0; // 恒为 0
DACReg.CFG.REG = 0; // 寄存器选择 DAC 寄存器
DACReg.CFG.Addr = 3; // 通道选择 D通道
DACReg.Data = 0xfff0; // 数据
tx_len = 3;
memcpy(&tx_data, &DACReg, 3);
SpiTransfer();
Delay(0xf);
}
void SpiTransfer (void)
{
GpioDataRegs.GPBDAT.bit.GPIO57 = 0;
while(tx_len)
{
tx_len--;
if(tx_len==2)
{
SpiaRegs.SPITXBUF=tx_data[2-tx_len];
}
else if(tx_len==1)
{
SpiaRegs.SPITXBUF=((tx_data[2-tx_len])>>8);
}
else
{
SpiaRegs.SPITXBUF=(tx_data[1]);
}
while(SpiaRegs.SPISTS.bit.BUFFULL_FLAG !=0) { }
}
GpioDataRegs.GPBDAT.bit.GPIO57 = 1;
Delay (10);
}

//===========================================================================
// No more.
//===========================================================================


Viewing all articles
Browse latest Browse all 262198

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>