UART轮询与中断模式

使用轮询方式发送:

1、检查TxFIFO是否为空。等待直到TxFIFO为空。

2、向TxFIFO写数据。如果要发送的数据大于64字节,则先将64字节写入。

3、写入剩下的字节。有两种方法:a.检查TxFIFO是否为非满,如果为非满,则写入一个字节,直到写完要发送的数据。b.检查TxFIFO是否为空,如果为空,则跳到2,直到写完要发送的数据。

使用中断方式发送:

1、禁用TxFIFO空中断。

2、向TxFIFO写数据。如果要发送的数据大于64字节,则先将64字节写入。

3、检查TxFIFO是否为非满,如果为非满,则写入一个字节,继续检查,如果非满则继续写入,否则进行下一步。

4、允许TxFIFO空中断。

5、等待空中断。中断产生后跳到1。

使用轮询方式接收:

1、等待直到RxFIFO填充到某个程度,即trigger level,或者TIMEOUT。(TIMEOUT用于在一定时间内RxFIFO内数据少于trigger level时也能将数据读出)

2、从RxFIFO中读数据,直到RxFIFO空。

3、如果TIMEOUT中断状态置位,则清除该置位。

使用中断方式接收:

1、允许中断。

2、RxFIFO填充到trigger level或者TIMEOUT时触发中断。

3、从RxFIFO中读数据。

4、重复2、3直到RxFIFO空。

5、如果中断状态置位,则清除该置位。trigger level中断和TIMEOUT中断。

u32 XUartPs_Send(XUartPs *InstancePtr, u8 *BufferPtr, u32 NumBytes):

非阻塞发送,如果设备忙,将返回并指示发送了0个字节,该函数尽可能地填充FIFO并返回发送的字节数。

如果发送0字节,则会停止之前还未完成的发送,因为该函数开头有禁止中断的操作。

在轮询模式下,该函数只能发送FIFO能缓冲的字节数,想要发送更多字节,需要重复调用该函数。

在中断模式下,该函数会首先发送N个字节,接着中断句柄会发送剩余的字节直到发完。会有一个回调函数来指示发送的完成。

u32 XUartPs_Recv(XUartPs *InstancePtr, u8 *BufferPtr, u32 NumBytes):

非阻塞接收。

在轮询模式下,只接收FIFO中已经存在的数据,如果要接收所有数据,则需要重复调用该函数。

在中断模式下,先接收FIFO中已经存在的数据,如果没有接收完所有数据,则中断句柄会继续接收直到所有数据接收完。会有一个回调函数来指示接收的完成或错误的发生。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章