使用CH438Q接收,上電前幾次數(shù)據(jù)接收沒(méi)問(wèn)題,收了幾次后,中斷一直拉低,不會(huì)拉高了,查詢了SSR寄存器是01? IIR寄存器是04,用的是CH438Q串口0,這個(gè)問(wèn)題要怎么解決?
您好,CH438中斷輸出是低電平輸出,IIR寄存器為0x04根據(jù)手冊(cè)中可知為“接收數(shù)據(jù)可用”中斷,此時(shí)處于產(chǎn)生中斷狀態(tài),所以需要根據(jù)IIR寄存器所報(bào)中斷類型,根據(jù)清中斷方法來(lái)清除所有的中斷,才能撤銷實(shí)際的INT中斷電平
清中斷方法來(lái)清除所有的中斷,才能撤銷實(shí)際的INT中斷電平,具體怎么做啊?
讀取數(shù)據(jù)后,還要進(jìn)行什么寄存器的操作嗎?
?case INT_RCV_SUCCESS:? ? // 串口接收可用數(shù)據(jù)中斷
? if((Receive_Bit==20)|| (Receive_Bit==8))
{
Receive_Bit=8;
ET0 = 1;
Time_Count=0;
RcvNum = CH438Seril8Rcv(Data_Buf);
for(i=0;i
{
Uart_Data_Buf[Uart_Data_Length+i]=Data_Buf[i];
}
Uart_Data_Length=Uart_Data_Length+RcvNum;
}
? ? ? ? ? break;
在你的串口收到數(shù)據(jù)之后,只需要你在串口中斷的程序里面去讀取IIR寄存器,之后該中斷就會(huì)被清除,然后就是正常的在對(duì)應(yīng)的中斷里面做對(duì)應(yīng)的事情,例如Fifo觸發(fā)中斷或者超時(shí)中斷就去讀取RBR寄存器接收緩沖區(qū)里面的東西。具體可以看手冊(cè)這里。
中斷程序根據(jù)官方提供的例程編寫(xiě)的,有讀取了gInterruptStatus = RS485_ReadCH438Data( REG_SSR_ADDR ); SSR寄存器是01,之后
if( gInterruptStatus & 0x01? )? ? // 檢測(cè)串口0是否有中斷產(chǎn)生?
? {
InterruptStatus = RS485_ReadCH438Data( REG_IIR_ADDR ) & ( ~ CH438_IIR_FIFOS_ENABLED );? ? // 讀串口0的中斷狀態(tài)?
讀取了IIR寄存器了,這是運(yùn)行完中斷程序后,中斷引腳INT的電平應(yīng)該是恢復(fù)高電平,但是有時(shí)候運(yùn)行工作一段時(shí)間后,中斷引腳一直是低電平,這樣就進(jìn)不了中斷程序了,在主程序讀取IIR和SSR寄存器,也不會(huì)恢復(fù)成高電平,得重新斷電上電才正常,這如何解決呢?
出現(xiàn)這個(gè)情況,CH438Q串口發(fā)送數(shù)據(jù)正常,由于中斷引腳一直是低電平,沒(méi)法進(jìn)入中斷處理接收的數(shù)據(jù),所以接收不到數(shù)據(jù)。重啟后又正常了。
您好,如果CH438中斷腳為低電平的話說(shuō)明有中斷沒(méi)有處理完,都中斷寄存器看看。建議可以使用電平中斷或者定時(shí)查詢中斷狀態(tài)處理?;蛘咴诔鲋袛嗲霸俅尾樵冎袛嗵幚怼?/p>
中斷程序已經(jīng)處理完退出中斷函數(shù)了,剛發(fā)現(xiàn),就是接收數(shù)據(jù)處理的時(shí)候,發(fā)送數(shù)據(jù)就會(huì)出現(xiàn)這樣的情況
您好,假如在接收數(shù)據(jù)的時(shí)候,發(fā)送數(shù)據(jù),發(fā)送數(shù)據(jù)的時(shí)候回產(chǎn)生THR空中斷,建議接收用中斷,發(fā)送在主程序。