- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi,community
想问一下 spi 的 SPI_SpiIsBusBusy() 的这个API在 UART 中怎么实现,读取多个字节的时候该怎么判断 UART 的上一个字节已经读完了?
Solved! Go to Solution.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
可以这么操作,先把 RX buffer Size 改的比 N 稍大一些
然后把代码改成
cnt = UART_SpiUartGetRxBufferSize();
if(cnt >=N)
{
for(i=0; i<N; i++)
{
uartrev[i] = UART_UartGetByte();
}
}
这样就可以一次性读取到N个字节。
RX Buffer Size 设置成 >8 的数值以后,UART 组件就会自动在内存中按照指定长度设置一个数组 buffer, 并且使能 RX not empty 中断,当 RX FIFO 接受到数据以后,UART 会在后台中断中将数据移到 buffer 中,然后做数据累加器加1,所以 UART_SpiUartGetRxBufferSize 读取到的就是现在这个 buffer 有多少数据,然后读取之后就会在后台自动清除掉,这些动作都是组件在后台自动完成的,不需要用户参与,非常方便
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
如果在读 uart 数据之前没有一个延时,比如说我发两个字节 55 AA,那么buff会被赋值两次,结果为revbuff[0]=55,revbuff[1]=00\第二次赋值结果为revbuff[0]=AA,revbuff[1]=00。请问一下这是什么情况,这个延时函数实际上是在等待什么呢?是在CY8CKIT-042 上运行的,没有其它功能影响,只是想用uart接收数据
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
问题出在 if(UART_SpiUartGetRxBufferSize()!=0) 这个语句判断上,只要 RX FIFO 中有数据,那么这个条件就会满足,假设此时之传入了1个数据,但是进入 if 之后却对 FIFO 执行了两次快读,那么第二次得到的数据就是 00, 因为此时 FIFO 为空,你的第二个数据还没有传输到 FIFO 中
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi,vison
那么想要接受N个字节的时候,程序需要怎么写呢。if(UART_SpiUartGetRxBufferSize()==N)?
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
可以这么操作,先把 RX buffer Size 改的比 N 稍大一些
然后把代码改成
cnt = UART_SpiUartGetRxBufferSize();
if(cnt >=N)
{
for(i=0; i<N; i++)
{
uartrev[i] = UART_UartGetByte();
}
}
这样就可以一次性读取到N个字节。
RX Buffer Size 设置成 >8 的数值以后,UART 组件就会自动在内存中按照指定长度设置一个数组 buffer, 并且使能 RX not empty 中断,当 RX FIFO 接受到数据以后,UART 会在后台中断中将数据移到 buffer 中,然后做数据累加器加1,所以 UART_SpiUartGetRxBufferSize 读取到的就是现在这个 buffer 有多少数据,然后读取之后就会在后台自动清除掉,这些动作都是组件在后台自动完成的,不需要用户参与,非常方便
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi,Vison
非常感谢,这样可以正常工作。但还是存有疑问,必须使用中断,不能完全使用轮询的方式来完成 uart 接收么。
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
可以啊,但是需要你自己去定义一个 buffer, 然后发现 RX FIFO 中有数据就读出来放在 自己的 buffer 中,同时管理一下放置在 buffer 的哪个位置。