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

📄 sci.c

📁 dsptms320lf240x的sci程序
💻 C
字号:
/* -------------------------------------------------------------------------*/
/*	                 SCI library  for my2406/2407 board          			*/
/*																			*/
/*										     Copyright(c) Do-Yoon Kim       */
/*															SCI.c	    	*/
/*															ver 2.0			*/
/*															2002.7.10	    */
/*	捞镑俊 乐绰 窃荐甸篮 prefix肺 SCI甫 傍烹利栏肺 爱绰促.			        */
/*	捞 饶俊 青困甫 唱鸥郴绰 悼荤, 弊府绊 备眉利牢悼累阑 唱鸥郴绰	        */
/*	钎泅捞 嘿绰促.								                            */
/*      林狼: 捞 header绰 util.h 第俊 嘿绢具 茄促.				            */
/* ------------------------------------------------------------------------ */


#include <util.h>

ULONG CPU_clk(void);
void SCISetBaud( ULONG baud_rate );
void SCIInit( void );
void SCIReset( void );
void SCISetRXINT( int enable );
void SCISetTXINT( int enable);
void SCISetRXINTPriority( int priority );
void SCISetTXINTPriority( int priority );
UCHAR SCIReceive( void );
void SCISend( char data );
void SCIPrintHex(int iii);
void SCIPrintString( char *str );


// 箭磊甫 ASCII肺 官操绢 傈价窍扁 困茄 抛捞喉
char num_str[] = "0123456789ABCDEF";


ULONG CPU_clk(void)
{
    UINT clk;
    clk = SCSR1 & 0x0E00;
    if(clk == 0x0000)   return 40000000UL;
    if(clk == 0x0200)   return 20000000UL;
    if(clk == 0x0400)   return 13300000UL;
    if(clk == 0x0600)   return 10000000UL;
    if(clk == 0x0800)   return  8000000UL;
    if(clk == 0x0A00)   return  6600000UL;
    if(clk == 0x0C00)   return  5700000UL;
    if(clk == 0x0E00)   return  5000000UL; 
}


// baud rate甫 官曹 锭 荤侩茄促.
void SCISetBaud( ULONG baud_rate )
{
	ULONG   baud;
	baud = CPU_clk()/((baud_rate*8UL)-1UL);
	SCIHBAUD = (unsigned int)((baud>>16) & 0x0000FFFF);
	SCILBAUD = (unsigned int)(baud & 0x0000FFFF);
}


void SCIInit( void )
{   
	// UART俊 包访等 饭瘤胶磐绰 醚 10俺捞促.
	
	SCI_ENABLE;                 	// SCI module俊 努钒阑 牢啊茄促.
	SET(MCRA, (SCITXD|SCIRXD));		//MCRA.0:SCIRXD, MCRA.1:SCIRXD 
	SCICCR = 0x07;
	// |stop bits|Parity Odd/even|Parity enable|Loop back enable| 
	//  0000b => 1 stop bit, odd parity, parity disable, loop back disable
	// |IDLE/ADDR|char2|char1|char0|
	//  0111b => idle mode, 8 bit data
	//  0110b => idle mode, 7 bit data
	
	SCICTL1 = 0x03; 
	// |reserved|RX ERR INT|SW reset|reserved| 				
	// 0000b => disabe RX error interrupt1 and software reset		
	// |TXWAKE|SLEEP|TX ENA|RX ENA|					
	// 0011b => TX, RX enable						
	
	SCICTL2 = 0xC0;
	// |TXRDY|TX EMPTY|reserved|reserved|:捞 滴 厚飘绰 read only 捞促.
	// |reserved|reserved|RX INT ENA|TX INT ENA|
	//  0000b => TX, RX interrupt disable
	//  0011b => TX, RX interrupt enable	
	
	SCISetBaud(BAUD_RATE);
	//SCIHBAUD = 0x00;
	//SCILBAUD = BAUD_SELECT(BAUD_RATE);
	//BRR = BAUD_SELECT(BAUD_RATE); 
		
	SCICTL1 = 0x23; 
}   


// SCI 葛碘阑 檬扁拳 且 锭 荤侩茄促.					            
// 府悸阑 窍搁 SCI俊 包访等 敲贰弊啊 促澜苞 鞍篮 蔼栏肺 汲沥等促.	
// TXRDY(1), TX EMPTY(1), RXWAKE(0), PE(0), OE(0), FE(0), BRKDT(0), 
// RXRDY(0), RX ERROR(0). 						                    
// 窜 敲贰弊父 檬扁拳且 挥捞瘤, 傈价 加档唱 扁鸥 促弗 汲沥俊绰 		
// 康氢阑 固摹瘤 臼绰促. 						                    
void SCIReset( void )
{
	int k;
	CLEAR(SCICTL1, SW_RESET);	    // SW reset bit甫 0栏肺 汲沥
	for(k=0;k<2000;k++)   NOP;		// 泪矫 delay			
	SET(SCICTL1, SW_RESET);	        // SW reset bit甫 1肺 汲沥	
}



/* ----------------------------------------------------------------------------	*/
/* Interrupt 包访 何盒 				          			                        */
/* ---------------------------------------------------------------------------- */

// 荐脚 牢磐反飘甫 劝己拳 肚绰 厚劝己拳茄促.
void SCISetRXINT( int enable )
{
	if(enable)   SET(SCICTL2,RX_INT_ENA);	// SCICTL2.1 => RX INT ENA 
	else   CLEAR(SCICTL2,RX_INT_ENA);	    // clear SCICTL2.1 
}

// 价脚 牢磐反飘甫 劝己拳 肚绰 厚劝己拳 茄促.
void SCISetTXINT( int enable)
{
	if(enable)   SET(SCICTL2,TX_INT_ENA);	// SCICTL2.0 => TX INT ENA 
	else   CLEAR(SCICTL2,TX_INT_ENA);	    // clear SCICTL2.0 
}

// SCI RX interrupt狼 快急 鉴困甫 官曹 锭 荤侩
void SCISetRXINTPriority( int priority )
{	
	// Notice!
	// 促弗 版快客 促福霸 high搁 clear甫 秦 林绢具 窍绊
	// low 捞搁 set阑 秦 林绢具 茄促.
	if(priority == HIGH)   CLEAR(SCIPRI, SCIRX_PRIORITY);	
	else SET(SCIPRI, SCIRX_PRIORITY);
}


// SCI TX interrupt狼 快急 鉴困甫 官曹 锭 荤侩
void SCISetTXINTPriority( int priority )
{	
	// Notice!
	// 促弗 版快客 促福霸 high搁 clear甫 秦 林绢具 窍绊
	// low 捞搁 set阑 秦 林绢具 茄促.
	if(priority == HIGH)   CLEAR(SCIPRI, SCITX_PRIORITY);	
	else SET(SCIPRI, SCITX_PRIORITY);
}

/* ----------------------------------------------------------------------------	*/
/* Polling 规侥狼 价荐脚 包访 何盒 		          			                    */
/* ---------------------------------------------------------------------------- */
// 茄 巩磊甫 弃傅 规侥栏肺 荐脚窍妨绊 且 锭 荤侩茄促.
// polling 规侥捞骨肺 巩磊啊 甸绢棵 锭鳖瘤 扁促赴促.
// output arguments: 荐脚茄 单捞磐(8 bit)甫 傈价茄促.
UCHAR SCIReceive( void )
{             
	UCHAR ch;
	
	while( !(SCIRXST & RXRDY) ) ;				
	ch = SCIRXBUF;
	
	return ch;
}

void SCISend( char data )
{                    
   	while( !(SCICTL2 & TXRDY) ) ;
	
	SCITXBUF = data;
}
	
void SCIPrintf( char *str )
{        
	while( *str != '\0' )
	{
		if( *str == '\n')
		{
		    SCISend(CR);
	        SCISend(LF);
	    }
	    else 
		    SCISend(*str);
		str++;
	}	
}
	

void SCIPrintHex(int iii)
{
	SCISend(num_str[(iii>>12) & 0x0F]);
	SCISend(num_str[(iii>>8)  & 0x0F]);
	SCISend(num_str[(iii>>4)  & 0x0F]);
	SCISend(num_str[(iii)     & 0x0F]);
}

⌨️ 快捷键说明

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