打印

关于SCI的FIFO的几点疑问

[复制链接]
10316|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tiger2010|  楼主 | 2010-4-12 08:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
FIFO功能是直接在BUF那加了一个16级深的队列(入SHF+BUF+FIFO;出FIFO+BUF+SHF),也就是原来只能存一个字节的BUF现在可以存1个字节+FIFO个数据。
1.如果发送的时候,在SCIFFENT=1 FIFO使能,我向BUF写入了10个字节数据,
for(temp=0;temp<10;temp++) SciaRegs.SCITXBUF = Sci_VarRx[temp];
如果不打开匹配中断TXFFIENA=0,这10个数据是不是就直接发送出去了?
如果不打开匹配中断TXFFIENA=0,TXFFIL皮配中断的设置也应该没用了吧。
如果在普通SCI模式下,这样写的问题是不是:10个数据只能发出最后一个,也就是增强型FIFO在这点上有优势。

2.在发送数据时,如果打开匹配中断TXFFIENA=1;中断匹配TXTFIL设为10,是不是当TXFFST小于等于10的时候产生发送中断?
也就是如果在SCIFFENT=1 FIFO使能的情况下,程序刚开始跑就会产生发送中断(复位后TXFFST应该为0吧)?
这里有点迷糊的是 中断怎么产生的?
同样在接收数据的时候也类似。
3.如果发送大量数据比如说发送400个字节的数据Sci_VarRx[400],FIFO功能的优越性体现在哪里?
我尝试过用
for(temp=0;temp<400;temp++)
{
SciaRegs.SCITXBUF = Sci_VarRx[temp];
while(SciaRegs.SCICTL2.bit.TXRDY != 1) {}
}
发送数据,是可行的无论改程序是在主程序的死循环内还是在接收数据中断内,都能实现数据的发送。
但是,如果不加while(SciaRegs.SCICTL2.bit.TXRDY != 1) {}的话PC只能收到17个字节的数据。
这样的FIFO在发送大量数据的时候与普通方式SCI比有什么优势?

弄了FIFO两三天了,这几点一直弄不清楚。还有一些问题正在尝试解决。
期待您的回答。

相关帖子

沙发
xiaoxin1986| | 2010-4-12 08:56 | 只看该作者
2.在发送数据时,如果打开匹配中断TXFFIENA=1;中断匹配TXTFIL设为10,是不是当TXFFST小于等于10的时候产生发送中断?
这一条你可以设断点做一下实验,期待你的结果哦

使用特权

评论回复
板凳
淡蓝的天空| | 2010-4-12 09:04 | 只看该作者
FIFO的优点就是尽量减少你的工作,你的那个等待的while循环不需要循环400次了

使用特权

评论回复
地板
tiger2010|  楼主 | 2010-4-12 09:10 | 只看该作者
3# 淡蓝的天空

不知道是不是我的程序有问题还是寄存器设置有问题,如果把那个等待的语句去掉的话,FIFO只能发送17个数据而不是我想要的好几百个。能给点建议么?
我看到有些是用的while (SciaRegs.SCIFFTX.bit.TXFFST  != 0) {}这也不是在等待么?这个与while(SciaRegs.SCICTL2.bit.TXRDY != 1) {}有多大区别?

寄存器设置:
    SciaRegs.SCIFFTX.all=0xC040;
    SciaRegs.SCIFFCT.all=0x00; //禁止串口自动检测波特率
    SciaRegs.SCIFFRX.all=0x6061;
    //SciaRegs.SCIFFTX.bit.TXFFIENA =0;//禁止FIFO发送  
        
   PieCtrl.PIEIER9.bit.INTx1 = 1;
  PieCtrl.PIEIER9.bit.INTx2 = 1;
  //SCIA的接收和发送中断分别位于GPIO第9组的第1和第2位,使能SCIA的PIE中断
  SciaRegs.SCICTL1.all = 0x23;//重启SCI

发送和接收中断:
interrupt void SCIRXINTA_ISR(void)
{
int S=0;
S = SciaRegs.SCIRXBUF.all;//接收的字符8位(1)
if (S==1)
{
//Send_Flag=1;
SciaRegs.SCIFFTX.bit.TXFIFOXRESET = 1;
SciaRegs.SCIFFTX.bit.TXFFIENA = 1;
}
SciaRegs.SCIFFRX.bit.RXFFINTCLR =1;//清除中断标志位
SciaRegs.SCIFFRX.bit.RXOVF_CLR =1;//清除溢出标志位

PieCtrl.PIEACK.bit.ACK9 = 1;
EINT;
}


interrupt void SCITXINTA_ISR(void)
{
int v=0;
for(v=0;v<100;v++)
{
SciaRegs.SCITXBUF = Sci_VarRx[v];//将 Sci_VarRx发送
// while(SciaRegs.SCIFFTX.bit.TXFFST != 0)
// {}
}
SciaRegs.SCIFFTX.bit.TXFFIENA = 0;// 禁止匹配中断
SciaRegs.SCIFFTX.bit.TXINTCLR=1;
PieCtrl.PIEACK.bit.ACK9 = 1;
EINT;

使用特权

评论回复
5
寂寞男孩| | 2010-4-12 09:12 | 只看该作者
使用fifo可以一次性地写入多个字节,比如你要发送160个字节,fifo使用16级,那么你只需要自己向fifo里面写入10次数据,每次16个字节就可以了。至于那个等待你也不需要,只要在终端里面将身下的数据发送到fifo就可以。

使用特权

评论回复
6
juventus9554| | 2010-4-12 19:45 | 只看该作者
使用fifo可以一次性地写入多个字节,比如你要发送160个字节,fifo使用16级,那么你只需要自己向fifo里面写入10次数据,每次16个字节就可以了。至于那个等待你也不需要,只要在终端里面将身下的数据发送到fifo就可以 ...
寂寞男孩 发表于 2010-4-12 09:12
替楼主问个问题
你的意思是进10次中断呢?还是进一次中断向BUF写10次呢?

使用特权

评论回复
7
juventus9554| | 2010-4-12 19:45 | 只看该作者
如果是第一种方法的话,应该没问题。但是一次中断写10次的话,在两次间隔的地方还是要加等待的,因为写数据很快,发送毕竟是慢的。

使用特权

评论回复
8
虎虎生威| | 2010-4-12 19:48 | 只看该作者
我觉得是第二种吧。FIFO只是在一定程度上减小这种延迟,和对于CPU的资源占用,并不能完全避免。如果你真的没有大量的数据要发送的话,直接使用DMA就好了,那个是可以一次写入任意数量的数据(只要比DMA的SRAM小就可以)。DMA其实在某种程度上相当于一个你自己可以设定深度的FIFO。

使用特权

评论回复
9
虎虎生威| | 2010-4-12 19:48 | 只看该作者
如果你真的要每次发送400个数据,而且有要求对于CPU占用很小的话,推荐你用带有DMA的DSP比如28335等等会比较好。

使用特权

评论回复
10
linhai2009| | 2010-4-13 15:52 | 只看该作者
:L:L:L:L:L

使用特权

评论回复
11
littleapple| | 2010-4-13 16:01 | 只看该作者
6# juventus9554

应该是进一次中断,写10次数据

使用特权

评论回复
12
thf2008| | 2010-4-13 18:44 | 只看该作者
如果采用FIFO的话,肯定是进一次中断写10次数据啊,要不然FIFO就没什么用了

使用特权

评论回复
13
tiger2010|  楼主 | 2010-4-13 18:58 | 只看该作者
6# juventus9554

正好问了我想问的问题,通道中人啊

使用特权

评论回复
14
tiger2010|  楼主 | 2010-4-13 19:00 | 只看该作者
谢谢大家的回答,我明白了

使用特权

评论回复
15
没水的壶| | 2010-4-13 19:51 | 只看该作者
进来学习了~~~

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

32

主题

338

帖子

0

粉丝