1、中断方式:
接收数据时,MCU转入中断服务程序,再处理接收到的数据;
CMT2300A接收数据的中断:
????????检测RX_FIFO_TH 中断,一旦有效表示FIFO 已经被填入预设的数据长度,就可以开始读取,这样适合数据包长度不等于FIFO 深度,并且用户要做接收完整数据包之后,才读取FIFO 的情况。
2、查询方式:
查询MCU状态寄存器中的接收缓冲器状态位,再对数据进行处理;
//SPI驱动CMT2300A发送数据:
//使能写FIFO
CMT2300A_EnableWriteFifo();
//把【pBuf+sendlen】写到CMT2300的FIFO中,一次写64byte
CMT2300A_WriteFifo(pBuf+sendlen, 64);
//进入发送状态
CMT2300A_GoTx();
delay = 1000;
while(1)
{
//cmt2300a_寄存器中查询到发送完成标识:TX_DONE
if(CMT2300A_MASK_TX_DONE_FLG & CMT2300A_ReadReg(CMT2300A_CUS_INT_CLR1))
{
break;
}
}
3、中断和查询方式的区别:
????????中断方式,MCU可以执行别的任务,而查询方式只能进行接收查询,在此期间不能执行其他任务,在实现的区别当然是:是否把接收中断使能位置为有效。
4、串口通讯中的查询方式和中断方式:
查询方式:? ?发送数据——先发后查;?
???????????????????? 接收数据——先查后收。
中断方式:? ?发送数据——发送、等待中断、中断中发送;
? ? ? ? ? ? ? ? ? ? ?接收数据——等待中断、在中断中接收。
//先发送数据
CMT2300A_GoTx();?
//再查询状态寄存器
?if(CMT2300A_MASK_TX_DONE_FLG &CMT2300A_ReadReg(CMT2300A_CUS_INT_CLR1))?
?? ?{?? ??? ??? ??? ??? ?
?? ????break;?? ??? ??? ??? ?
?? ?}??
//先查询寄存器的标志位:完整接收到一包数据,再接收
if(CMT2300A_MASK_PKT_OK_FLG & CMT2300A_ReadReg(CMT2300A_CUS_INT_FLAG))
{
//CMT2300A_GoStby();
//读FIFO中的数据,接收到的数据先存储在FIFO中
CMT2300A_ReadFifo(pBuf,len);
CMT2300A_ClearRxFifo();
CMT2300A_ClearInterruptFlags();
CMT2300A_EnableReadFifo();
//进入接收状态
CMT2300A_GoRx();
return 1;
}
|