CH559L的UART1的SER1_FCR的問題?

在一個(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)的問題:

  1. uart1_init()初始化后,? 讀SER1_FCR為 0xC1,? 顯示bFCR_FIFO_EN,? 這個(gè)是對的,? 但收了幾次數(shù)據(jù)(未開啟UART1中斷)后, SER1_FCR變?yōu)榱?0xC4;? ? 這是什么原因,?有什么影響呢;

  2. 開啟uart1_EnRxd后,? 從UART1中斷接收數(shù)據(jù),? ?經(jīng)常會(huì)跑飛(程序死機(jī)).? ?外部main函數(shù)是根據(jù)FLAG_RecFull? ?和? ?FLAG_RecHalf標(biāo)志位,? ?判斷長度是否滿足總數(shù)據(jù)長度15位,? ?再讀取進(jìn)行判斷.?

  3. 關(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));?

  4. 這個(gè)是我這個(gè)函數(shù)有問題嗎? 有沒有完善一點(diǎn)的UART1接收函數(shù)例程呢, 多謝了

  5. 帖子修改之后,?空格?會(huì)被識(shí)別成"?",?這個(gè)問題...




熱門產(chǎn)品 : USB3.0 HUB控制器:CH634

SER1_IER;SER1_IIR;SER1_FCR;SER1_LCR;SER1_MCR;SER1_LSR;SER1_MSR; 這些寄存器,剛初始化是 "21 C4 C4 03 08 63 00";?發(fā)送幾次數(shù)據(jù)之后(UART1會(huì)收到返回值,?但因沒開啟中斷,?所以不會(huì)響應(yīng)數(shù)據(jù))的值是 "21 C1 C1 03 08 60 00"


引用一個(gè)外鏈吧:https://blog.csdn.net/havc_W/article/details/122345259?spm=1001.2014.3001.5501

不要過分糾結(jié)寄存器的變化,而應(yīng)該關(guān)注示例代碼本身的處理思想。


跑飛常規(guī)思路檢查是否有RAM訪問越界,尤其是你定義的UART1_RecBuff



只有登錄才能回復(fù),可以選擇微信賬號(hào)登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频