我的源代码:
#include "DSP2833x_Device.h" #include "DSP2833x_Examples.h" void delay_loop(void); void spi_xmit(Uint16 a); void spi_fifo_init(void); void spi_init(void); interrupt void cpu_timer0_isr(void); //interrupt void cpu_timer0_isr(void); Uint16 sdata; // send data Uint16 rdata; short Hrdata,Lrdata; // received data float temp;
/***********************/ void scia_loopback_init(void); void scia_fifo_init(void); void scia_xmit(int a); void error(int); interrupt void scia_rx_isr(void); interrupt void scia_tx_isr(void);
// Global counts used in this example Uint16 LoopCount; Uint16 ErrorCount,i,j; int n=0; void main(void) { Uint16 SendChar; Uint16 ReceivedChar;
// Step 1. Initialize System Control registers, PLL, WatchDog, Clocks to default state: // This function is found in the DSP2833x_SysCtrl.c file. InitSysCtrl();
// Step 2. Select GPIO for the device or for the specific application: // This function is found in the DSP2833x_Gpio.c file. // InitGpio(); skip this as this is example selects the I/O // for SCI-A in this file itself InitSciGpio(); InitSpiaGpio(); // Step 3. Initialize PIE vector table: // The PIE vector table is initialized with pointers to shell Interrupt // Service Routines (ISR). The shell routines are found in DSP2833x_DefaultIsr.c. // Insert user specific ISR code in the appropriate shell ISR routine in // the DSP28_DefaultIsr.c file.
// Disable and clear all CPU interrupts: DINT; IER = 0x0000; IFR = 0x0000;
// Initialize Pie Control Registers To Default State: // This function is found in the DSP2833x_PieCtrl.c file. // InitPieCtrl(); PIE is not used for this example
// Initialize the PIE Vector Table To a Known State: // This function is found in DSP2833x_PieVect.c. // This function populates the PIE vector table with pointers // to the shell ISR functions found in DSP2833x_DefaultIsr.c. InitPieVectTable();
EALLOW; PieVectTable.TINT0=&cpu_timer0_isr; EDIS; InitCpuTimers(); ConfigCpuTimer(&CpuTimer0,150,1000);//800us StartCpuTimer0(); IER|=M_INT1; PieCtrlRegs.PIEIER1.bit.INTx7=1; EINT; ERTM; // CpuTimer0Regs.TCR.bit.TSS=0; // Enable CPU and PIE interrupts // This example function is found in the DSP2833x_PieCtrl.c file. //EnableInterrupts();
// Step 4. Initialize all the Device Peripherals to a known state: // This function is found in DSP2833x_InitPeripherals.c // InitPeripherals(); skip this for SCI tests
// Step 5. User specific functions, Reassign vectors (optional), Enable Interrupts:
LoopCount = 0; ErrorCount = 0;
scia_fifo_init(); // Initialize the SCI FIFO scia_loopback_init(); // Initalize SCI for digital loop back spi_fifo_init(); // Initialize the Spi FIFO spi_init(); // Note: Autobaud lock is not required for this example
// Send a character starting with 0 SendChar = 0;
// Step 6. Send Characters forever starting with 0x00 and going through // 0xFF. After sending each, check the recieve buffer for the correct value
for(;;) { while(CpuTimer0.InterruptCount<3); CpuTimer0.InterruptCount=0; spi_xmit(0x0400); while(SpiaRegs.SPIFFRX.bit.RXFFST !=1) {} rdata = SpiaRegs.SPIRXBUF; Hrdata=(rdata>>8); Lrdata=(rdata&0x00ff); rdata =rdata&0x3fff; scia_xmit(Hrdata); scia_xmit(Lrdata); // while(SciaRegs.SCIFFRX.bit.RXFFST !=1) { } // wait for RRDY/RXFFST =1 for 1 data available in FIFO
// Check received character // ReceivedChar = SciaRegs.SCIRXBUF.all; // if(ReceivedChar != SendChar) error(1);
// Move to the next character and repeat the test // SendChar++; // Limit the character to 8-bits // SendChar &= 0x00FF; LoopCount++; for(i=0;i<=10000;i++) {for(j=0;j<150;j++);} EALLOW; SysCtrlRegs.WDKEY=0xAA; EDIS; }
}
interrupt void cpu_timer0_isr(void) { CpuTimer0.InterruptCount++; n++; EALLOW; SysCtrlRegs.WDKEY=0x55; EDIS; PieCtrlRegs.PIEACK.all=PIEACK_GROUP1;
} // Step 7. Insert all local Interrupt Service Routines (ISRs) and functions here:
void error(int ErrorFlag) { Uint16 Error = ErrorFlag; ErrorCount++; // asm(" ESTOP0"); // Uncomment to stop the test here // for (;;);
}
// Test 1,SCIA DLB, 8-bit word, baud rate 0x000F, default, 1 STOP bit, no parity void scia_loopback_init() { // Note: Clocks were turned on to the SCIA peripheral // in the InitSysCtrl() function
SciaRegs.SCICCR.all =0x0007; // 1 stop bit, No loopback // No parity,8 char bits, // async mode, idle-line protocol SciaRegs.SCICTL1.all =0x0003; // enable TX, RX, internal SCICLK, // Disable RX ERR, SLEEP, TXWAKE SciaRegs.SCICTL2.all =0x0003; SciaRegs.SCICTL2.bit.TXINTENA =1; SciaRegs.SCICTL2.bit.RXBKINTENA =1; SciaRegs.SCIHBAUD =0x0001; SciaRegs.SCILBAUD =0x00E7; // SciaRegs.SCICCR.bit.LOOPBKENA =1; // Enable loop back SciaRegs.SCICTL1.all =0x0023; // Relinquish SCI from Reset }
// Transmit a character from the SCI' void scia_xmit(int a) { SciaRegs.SCITXBUF=a; }
// Initalize the SCI FIFO void scia_fifo_init() { SciaRegs.SCIFFTX.all=0xE040; SciaRegs.SCIFFRX.all=0x204f; SciaRegs.SCIFFCT.all=0x0;
}
void delay_loop() { long i; for (i = 0; i < 100000; i++) {} } void spi_init() {
SpiaRegs.SPICCR.bit.SPISWRESET = 0; SpiaRegs.SPICCR.all =0x004F; // Reset on, rising edge, 16-bit char bits SpiaRegs.SPICTL.all =0x0006; // Enable master mode, normal phase, // enable talk, and SPI int disabled. SpiaRegs.SPIBRR =0x007F; // SpiaRegs.SPICCR.all =0x008F; // Relinquish SPI from Reset // SpiaRegs.SPIPRI.bit.FREE = 1; // Set so breakpoints don't disturb xmission SpiaRegs.SPICCR.bit.SPISWRESET = 1; }
void spi_xmit(Uint16 a) { SpiaRegs.SPITXBUF=a; }
void spi_fifo_init() { // Initialize SPI FIFO registers SpiaRegs.SPIFFTX.all=0xE040; SpiaRegs.SPIFFRX.all=0x204F; SpiaRegs.SPIFFCT.all=0x0; }
//=========================================================================== // No more. //===========================================================================
为什么串口传输接收的数据总是不对 |