⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dsp281x_sci.c

📁 代码用于测试dsp2812的硬件功能
💻 C
字号:
//###########################################################################
//
// FILE:	DSP281x_Sci.c
// TITLE:	DSP281x SCI Initialization & Support Functions.
//	WRITER:	ZHANG X.L.
//
//###########################################################################

#include "DSP281x_Device.h"     // DSP281x Headerfile Include File
#include "DSP281x_Examples.h"   // DSP281x Examples Include File

volatile Uint8 DSP_STOP = 0x01;
volatile Uint8 DSP_RESTART = 0x01;

interrupt void SciaRxIntISR(void);
interrupt void SciaTxIntISR(void);
interrupt void ScibRxIntISR(void);
interrupt void ScibTxIntISR(void);

//---------------------------------------------------------------------------
// InitSCI: 
// This function initializes the SCI to a known state.
//---------------------------------------------------------------------------
void InitSci(void)
{
#if	SCIA_SCIB	
	// Initialize SCIA:
	EALLOW;
	GpioMuxRegs.GPFMUX.bit.SCIRXDA_GPIOF5 = 1;
  	GpioMuxRegs.GPFMUX.bit.SCITXDA_GPIOF4 = 1; 
	PieVectTable.RXAINT = &SciaRxIntISR;
	PieVectTable.TXAINT = &ScibTxIntISR;
	EDIS;

	SciaRegs.SCICCR.all = 0x0007;    // 1 stop bit,  No loopback
                                  // No parity,8 char bits,
                                  // async mode, idle-line protocol
  	SciaRegs.SCICTL1.all = 0x0023;   //re-enable the SCI, enable TX, RX, internal SCICLK,
                                  // Disable RX ERR, SLEEP, TXWAKE
  	SciaRegs.SCIHBAUD = 0;          // BRR = LSPCLK / (SCI baud rate * 8) - 1 ;
  	SciaRegs.SCILBAUD = 194;		// 19200 Baud , LSPCLK = 30MHz ;

  	SciaRegs.SCICTL2.bit.TXINTENA = 0;   // Disable SCI-Transmit-interrupt
  	SciaRegs.SCICTL2.bit.RXBKINTENA = 1; // Enable SCI-A-Receive-interrupt
  	SciaRegs.SCIFFTX.bit.SCIFFENA = 0;    //Disable SCI FIFO enhancements

  	SciaRegs.SCIPRI.all = 0x0000;   //Immediate stop on emulation suspend   
  	SciaRegs.SCICTL1.all = 0x0023;  // Relinquish SCI from Reset
#else  
 	// Initialize SCIB:
	// Have the same configuration with SCI-A;
	// Attention:Don't forget to change the configuration of
	//  SCIBCLKEN in the function of InitSystem(),in "DSP281x_SysCtrl.c";
	EALLOW;
	GpioMuxRegs.GPGMUX.bit.SCIRXDB_GPIOG5 = 1;
	GpioMuxRegs.GPGMUX.bit.SCITXDB_GPIOG4 = 1;
	PieVectTable.RXBINT = &ScibRxIntISR;
	PieVectTable.TXBINT = &ScibTxIntISR;
	EDIS;
 
	ScibRegs.SCICCR.all = 0x0007;     
	  	ScibRegs.SCICTL1.all = 0x0003;   

  	ScibRegs.SCIHBAUD = 0;          
  	ScibRegs.SCILBAUD = 194;

  	ScibRegs.SCICTL2.bit.TXINTENA = 0;  
  	ScibRegs.SCICTL2.bit.RXBKINTENA = 1;
  	ScibRegs.SCIFFTX.bit.SCIFFENA = 0;    

  	ScibRegs.SCIPRI.all = 0x0000;      
  	ScibRegs.SCICTL1.all = 0x0023;  
#endif
}

void SCITXD(Uchar TXdata)
{
#if	SCIA_SCIB
	//transmit one byte data from SCIA;
  	SciaRegs.SCITXBUF = TXdata;
  	while(!SciaRegs.SCICTL2.bit.TXEMPTY);

	ScibRegs.SCICTL1.bit.SWRESET = 0; 
	asm(" RPT #3 || NOP "); 
	ScibRegs.SCICTL1.bit.SWRESET = 1;  
#else
	//transmit one byte data from SCIB;
	ScibRegs.SCITXBUF = TXdata;
	while(!ScibRegs.SCICTL2.bit.TXEMPTY);

	ScibRegs.SCICTL1.bit.SWRESET = 0; 
	asm(" RPT #3 || NOP "); 
	ScibRegs.SCICTL1.bit.SWRESET = 1; 
#endif
}	

void SCITXD_f(float32 TXData_f)
{
	Uint16 buff[2];
	Uint8 i,Sciftemp[4];
	buff[0] = ((Uchar *)&TXData_f)[0];
	buff[1] = ((Uchar *)&TXData_f)[1];
	Sciftemp[0] = (Uint8)(buff[0] & 0x00FF);
	Sciftemp[1] = (Uint8)(buff[0] >> 0x08);
	Sciftemp[2] = (Uint8)(buff[1] & 0x00FF);
	Sciftemp[3] = (Uint8)(buff[1] >> 0x08);
	for ( i = 0x00; i < 0x04 ; i++)
	{
		SCITXD(Sciftemp[0x03-i]);
		//delay(0x0000012C);		// delay(300) , NEEDED;
//		delay((Uint32)300); 
	}

}

void SCITXD_i(Uint32 TXData_i)
{
	Uint16 buff[2];
	Uint8 i,Sciftemp[4];
	buff[0] = ((Uchar *)&TXData_i)[0];
	buff[1] = ((Uchar *)&TXData_i)[1];
	Sciftemp[0] = (Uint8)(buff[0] & 0x00FF);
	Sciftemp[1] = (Uint8)(buff[0] >> 0x08);
	Sciftemp[2] = (Uint8)(buff[1] & 0x00FF);
	Sciftemp[3] = (Uint8)(buff[1] >> 0x08);
	for ( i = 0x00; i < 0x04 ; i++)
	{
		SCITXD(Sciftemp[0x03-i]);
		//delay(0x0000012c);		// delay(300) , NEEDED;
//		delay((Uint32)300); 
	}

}

void SCITXD_Uint16(Uint16 TXData_Uint16)
{
	SCITXD(TXData_Uint16 / 256);
//	delay((Uint32)300); 
	SCITXD(TXData_Uint16 % 256);
//	delay((Uint32)300); 
}
//---------------------------------------------------------
// function: interrupt service routine
// Scia & Scib;
//----------------------------------------------------------
interrupt void SciaRxIntISR(void)     // SCIARXD ; INT 9.1 ;
{ 
	Uchar iData; 
	iData=SciaRegs.SCIRXBUF.bit.RXDT;
	iData = iData;
	ScibRegs.SCICTL1.bit.SWRESET = 0; 
	asm(" RPT #3 || NOP "); 
	SciaRegs.SCICTL1.bit.SWRESET=1;//re-enable the SCI;
	
	DigDisplay_dec8((Uint32)iData);//$$$$ 
	CpuTimer0.InterruptCount = 0;
	while(CpuTimer0.InterruptCount < 4);

//	SCITXD(iData);
#if	TEST_RUN
	if(iData == STOP)
		DSP_STOP = 0x00;
	else if (iData == RESTART)
		DSP_RESTART = 0x00;
#endif
	// To receive more interrupts from this PIE group, acknowledge this interrupt 
  	PieCtrlRegs.PIEACK.all = PIEACK_GROUP9;
}


interrupt void SciaTxIntISR(void)     // SCI-A-TXD;INT9.2
{
	// Insert ISR Code here

	// To receive more interrupts from this PIE group, acknowledge this interrupt 
	// PieCtrlRegs.PIEACK.all = PIEACK_GROUP9;
	
	// Next two lines for debug only to halt the processor here
	// Remove after inserting ISR Code 
	ESTOP0;
	for(;;);
}

interrupt void ScibRxIntISR(void)     // SCIBRXD ; INT9.3 ;
{ 
	Uchar iData; 
	iData = ScibRegs.SCIRXBUF.bit.RXDT;
	iData = iData;
	ScibRegs.SCICTL1.bit.SWRESET = 0; 
	asm(" RPT #3 || NOP "); 
	ScibRegs.SCICTL1.bit.SWRESET = 1;//re-enable the SCI;

	DigDisplay_dec8((Uint32)iData);//$$$$ 
	CpuTimer0.InterruptCount = 0;
	while(CpuTimer0.InterruptCount < 4);

//	SCITXD(iData);	// $;
#if	TEST_RUN
	if(iData == STOP)
		DSP_STOP = 0x00;
	else if (iData == RESTART)
		DSP_RESTART = 0x00;
#endif
	// To receive more interrupts from this PIE group, acknowledge this interrupt 
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP9;
}

interrupt void ScibTxIntISR(void)     // SCI-B-TXD;INT9.4;
{
  // Insert ISR Code here

  // To receive more interrupts from this PIE group, acknowledge this interrupt 
  // PieCtrlRegs.PIEACK.all = PIEACK_GROUP9;

  // Next two lines for debug only to halt the processor here
  // Remove after inserting ISR Code
	ESTOP0;
	for(;;);

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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -