DSP

DSP28335笔记--SCI篇

2019-07-13 10:36发布

        采用FIFO来实现数据的发送与接收,一般就是指采用FIFO中断。在标准SCI模式下通过中断方式来接收或者发送数据可以发现,每接收或者发送一个字符就要进一次中断,如果发送的字符比较多的话,很明显,CPU要不断地去响应接收或者发送中断,CPU的开销就大大增加了。FIFO就是为了解决这个问题的。
        当SCI的RXSHF将引脚SCIRXD上的数据装配好后,发送到接收FIFO中,此时FIFO并不通知CPU来读取数据,将接收到的数据可以继续写入FIFO。当FIFO中的数据个数等于预设的FIFO中断级位RXFFIL时,接收中断标志位RXFFINT被置位,在接收中断服务子程序中,CPU可以把这些数据全部读取,很明显,这样节省了CPU的开销,也提高了效率。
        FIFO模式下发送数据也是一样,CPU可以将需要发送的多个字符写入发送FIFO中,发送时,TXSHF直接从FIFO中取出数据,将其发送出去,无需CPU干涉。当发送FIFO中剩余的字符数与预设的发送中断级位TXFFIL相等时,发送FIFO中断标志位TXFFINT被置位,在发送中断服务子程序中,CPU可以继续向FIFO写入需要发送的多个字符。通常,发送中断级位的值设为0,即发送FIFO空时,进入发送中断。
        以FIFO接收数据为例:
int i;
for(i=0;i<8;i++)
{
buffer[i]=SciaRegs.SCIRXBUF.all;

}
         因为FIFO遵循的是先入先出的原则,则读取时第一个被读取的字符也是之前第一个被存入的字符,读取的字符顺序和存入时的完全一样。读上面代码有没有发现:不是从FIFO中读取数据吗?怎么还是使用的是SCIRXBUF呢?如下图所示,SCIRXBUF就像是SCI接收操作这一块的代言人一样,FIFO中的数据还是通过SCIRXBUF读取,只是每读取一次,接收FIFO的指针会向后移动一个单元。当读取操作完成,指针指向的是存放最后一个字符的单元,图中指向的是“p”,即RXFIFO_7。为了能在下一次进入接收中断时能继续正确读取数据,最后还需要复位FIFO的指针,使其指向RX FIFO_0。F28335之SCI笔记—FIFO实现数据发送与接收。