在一個(gè)項(xiàng)目中,?用CH559L的UART1進(jìn)行只發(fā)不收(1s發(fā)送100次左右的數(shù)據(jù)串),?和能發(fā)能收(60s使能一次);
#define? uart1_EnRxd? IE_UART1=?1? ? ? ? ? ?// 開啟 接收中斷, 這個(gè)60s使能一次
#define? uart1_UnRxd? IE_UART1=0? ? ? ? ?// 關(guān)閉 接收中斷, 收一次數(shù)據(jù)就關(guān)閉中斷
void uart1_init()
{
unsigned int x;
SER1_LCR |= bLCR_DLAB;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 停 設(shè)置屏蔽
SER1_DIV = 12;
x = 10 * 12000000 * 2 / 12 / 16 / 115200;? ? ? ? ? ? ? ? ? ? ? ? ? // 默認(rèn)時(shí)鐘, 12分頻, 115200bps
if ( x % 10 >= 5) x += 10;
x /= 10;
SER1_DLM = x >> 8;
SER1_DLL = x;
SER1_LCR &= ~bLCR_DLAB;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 啟 設(shè)置屏蔽
XBUS_AUX |= bALE_CLK_EN;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // UART 功能
SER1_LCR = bLCR_WORD_SZ1 | bLCR_WORD_SZ0;? ? ? ? ? ? ? // 8bit, NONE, 1stop
SER1_IER = bIER_PIN_MOD1 | bIER_RECV_RDY;? ? ? ? ? ? ? ? ? ? // P2.6, P2.7, RDY這個(gè)中斷是必須要使能嗎, 不使能好像都不能發(fā)送
SER1_FCR = MASK_U1_FIFO_TRIG | bFCR_T_FIFO_CLR | bFCR_R_FIFO_CLR | bFCR_FIFO_EN;? ? ? ? // SER1_FCR = 0xC7
SER1_MCR = bMCR_OUT2;
SER1_ADDR |= 0xff;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 點(diǎn)對點(diǎn)?
}
void UART1_Interrupt(void) interrupt INT_NO_UART1 using 1 ? ? ? ? ? ? ? ?//UART1中斷服務(wù)程序,使用寄存器組1
{
u8 _tmp = 0;
u8 _int = SER1_IIR & 0x0f; // SER1_IIR 低4位, 組成7個(gè)中斷標(biāo)志
switch(_int){
case U1_INT_RECV_RDY:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 數(shù)據(jù)可用 中斷
? ? _tmp = UART1_Rxd(&UART1_RecBuff[CNT_Rxd1]);? ? //? 7位 FIFO 數(shù)據(jù)
? ? CNT_Rxd1 += _tmp;
? ? FLAG_RecFull = 1;? ? ? ? ? ? ? ? ? ? ?
break;
case U1_INT_RECV_TOUT:? ? ? ?// 接收超時(shí) 中斷?
? ? _tmp = UART1_Rxd(&UART1_RecBuff[CNT_Rxd1]);? ? ?// 1~6 位 FIFO 數(shù)據(jù)
? ? CNT_Rxd1 += _tmp;
? ? FLAG_RecHalf = 1;
break;
case U1_INT_LINE_STAT://線路狀態(tài)中斷
break;
case U1_INT_SLV_ADDR://設(shè)備地址match中斷
break;
case U1_INT_NO_INTER://無中斷
break;
case U1_INT_MODEM_CHG:? ? //MODEM中斷
_tmp = SER1_MSR;? ? // 讀 SER1_MSR 清中斷
break;
case U1_INT_THR_EMPTY:? ? //發(fā)送空中斷,可以啟動(dòng)下次發(fā)送或者等待接收
break;
default:? ? break;
}
}
發(fā)現(xiàn)的問題:
uart1_init()初始化后,? 讀SER1_FCR為 0xC1,? 顯示bFCR_FIFO_EN,? 這個(gè)是對的,? 但收了幾次數(shù)據(jù)(未開啟UART1中斷)后, SER1_FCR變?yōu)榱?0xC4;? ? 這是什么原因,?有什么影響呢;
開啟uart1_EnRxd后,? 從UART1中斷接收數(shù)據(jù),? ?經(jīng)常會(huì)跑飛(程序死機(jī)).? ?外部main函數(shù)是根據(jù)FLAG_RecFull? ?和? ?FLAG_RecHalf標(biāo)志位,? ?判斷長度是否滿足總數(shù)據(jù)長度15位,? ?再讀取進(jìn)行判斷.?
關(guān)于U1_INT_RECV_TOUT,? ?接收超時(shí)中斷;? ? 如果接收的數(shù)據(jù)正好是7位(使能7位FIFO),? ?那這個(gè)時(shí)候響應(yīng)的應(yīng)該是U1_INT_RECV_RDY中斷還是U1_INT_RECV_TOUT中斷呢(或者是2個(gè)都響應(yīng));?
這個(gè)是我這個(gè)函數(shù)有問題嗎? 有沒有完善一點(diǎn)的UART1接收函數(shù)例程呢, 多謝了
帖子修改之后,?空格?會(huì)被識(shí)別成"?",?這個(gè)問題...