语文教学网 加入收藏  -  设为首页
您的位置:语文教学网 > 故事 > 正文
请问2812型DSP的SCI模块中,接收和发送数据都是16级的FIFO深度是什么意思?对这个16级深度的FIFO不太理解
请问2812型DSP的SCI模块中,接收和发送数据都是16级的FIFO深度是什么意思?对这个16级深度的FIFO不太理解
提示:

请问2812型DSP的SCI模块中,接收和发送数据都是16级的FIFO深度是什么意思?对这个16级深度的FIFO不太理解

所谓的FIFO就是先进先出的意思。SCI工作在FIFO模式下一般是因为所传输的信息并不是以一个帧为单位,而是以多个帧组成的一个包为信息单位的。比如说我的一个数据包由5个帧组成,第一个为控制字节,后四个字节共同组成一个浮点数。这时你可以设置FIFO接收中断为5个字节时产生中断。
设置以后,每接收到5个字节后才会产生一次中断,而不是每接收一次产生一次中断。这样可以大幅减小CPU的开销。而先进先出的意思就是:在中断中,你读FIFO接收寄存器读到的数据是首先接收到的数据,再读一次的话读到的是接收到的第二个数据。而16深度的话就是最多能保存最近的16个接收数据,如果接收数据超过16个的话会产生相应的溢出,可以软件编程对溢出进行处理。

对于发送FIFO也是一样,你可以一次将多个数据放到发送FIFO中,然后DSP按先后顺序依次发送数据。
不过我个人一般不使用FIFO功能,基本都是工作在正常模式。对于多字节的数据传输往往采用can通讯的方式,can通讯一帧数据最多可以发送8个字节。FIFO队列接收有一个缺点就是,接收的数据包格式的帧数不能改变,如果是5个字节就必须都是5个字节。如果一会是5个字节,一会是3个字节。那3个字节的数据包会和下一个数据包的前两个字节产生一次中断,由于不同数据包的信息不同这样软件不易处理。can通讯就不一样,不管数据有几个字节,接收完一个帧就可以产生一次中断,能解决这个问题。

请教关于SCI 发送FIFO Buffer的问题
提示:

请教关于SCI 发送FIFO Buffer的问题

interrupt void sciaTxFifoIsr(void)
{
Uint16 i;
for(i=0; i< 8; i++)
{
SciaRegs.SCITXBUF=sdataA[i]; // Send data
}

for(i=0; i< 8; i++) //Increment send data for next cycle
{
sdataA[i] = (sdataA[i]+1) & 0x00FF;
}

SciaRegs.SCIFFTX.bit.TXINTCLR=1; // Clear SCI Interrupt flag
PieCtrlRegs.PIEACK.all|=0x100; // Issue PIE ACK
}
其中发送中断级别为8,对这个例程不太理解。当发送中断程序执行完后,FIFO中的数不一定全部发完了,而此时由于FIFO中的未发送数小于发送中断级别,FIFO又会响应中断,而此时下一次要发送的8个数据就会将上一次未发送完的数据覆盖掉。