📄 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 + -