关于28379的SCI以FIFO的收发中断进行数据传输,看了官方的英文手册也看了一些国内的其他资料,总觉得有些细节不太详细。
28379系列和28335系列芯片的SCI串口外设是一样的。经过测试,现将一些结论做一个总结。
首先,中断及引脚部分不细说了,SCI的配置:
ScibRegs.SCICCR.all = 0x0007;
ScibRegs.SCICTL1.all = 0x0003;
ScibRegs.SCICTL2.bit.TXINTENA = 1;
ScibRegs.SCICTL2.bit.RXBKINTENA = 1;
ScibRegs.SCIHBAUD.all = 0x0002;
ScibRegs.SCILBAUD.all = 0x008B; //运行在200MHz下的28379的baudrate = 9600
ScibRegs.SCIFFTX.all = 0xC028;//芯片初始化、使能FIFO及TXFIFO
ScibRegs.SCIFFRX.all = 0x0023;//使能RXFIFO,深度等级3
ScibRegs.SCIFFCT.all = 0x00;
ScibRegs.SCICTL1.all = 0x0023; //重启,重新使能SCI
ScibRegs.SCIFFTX.bit.TXFIFORESET = 1;
ScibRegs.SCIFFRX.bit.RXFIFORESET = 1;
ScibRegs.SCIFFCT.all=0;
接收中断函数 scibRxFifoIsr:
int ii=0;
int ii1 = 0;
static Uint16 i1 = 0;
if (i1 < 10)
{
temp[i1] = ScibRegs.SCIFFRX.bit.RXFFST;//记录FIFO的存储深度
i1++;
}
else
{
for (ii1 = 0; ii1 < 10; ii1++)
{
temp[ii1] = 0;
}
i1 = 0;
}
for( ii=0;ii<3;ii++)
{
rxdata[ii] = ScibRegs.SCIRXBUF.all;//将接收到的数据放进数组中存起来
}
ScibRegs.SCIFFRX.bit.RXFFOVRCLR=1; // Clear Overflow flag
ScibRegs.SCIFFRX.bit.RXFFINTCLR=1; // Clear Interrupt flag
PieCtrlRegs.PIEACK.all|=0x100; // Issue PIE ack
ScibRegs.SCIFFTX.bit.TXFFINTCLR=1;//一定准备好发送数据之前再清中断标志位,如果放在发送中断函数中会导致一直进中断!!!切记
发送中断函数scibTxFifoIsr:
Uint16 i = 0;
for(i=0; i< 3; i++)
{
ScibRegs.SCITXBUF.all=rxdata[i]; // Send data
}
mine1 = ScibRegs.SCIFFTX.bit.TXFFST;//记录发送FIFO的存储深度
mine2 ++;//发送中断进入的次数
PieCtrlRegs.PIEACK.all|=0x100;
将开发板通过串口连接电脑,并通过串口助手进行通讯测试,测试结果
发送——>12 34 56
返回——>12 34 56
2.
发送——>12 34
返回——>(空)
发送——>56 78
返回——>12 34 56
发送——>23 45
返回——>78 23 45
3.
发送——>12 34 56 78 91
返回——>12 34 56
发送——>13 14 15 16 17
返回——>78 91 13 14 15 16
发送——>23 24 25 26 27
返回——>17 23 24 25 26 27
发送——>34
返回——>(空)
发送——>35
返回——>(空)
发送——>36
返回——>34 35 36
测试结论
- 接收FIFO根据SCIFFRX.bit.RXFFIL配置的FIFO深度产生中断
如:本例中RXFFIL = 3;则RXFFST最大只能为3,而且每次只能向数组中写3个字节
即使将接收中断函数中的
for( ii=0;ii<3;ii++)
{
rxdata[ii] = ScibRegs.SCIRXBUF.all;
}
改为
for( ii=0;ii<4;ii++)
{
rxdata[ii] = ScibRegs.SCIRXBUF.all;//将接收到的数据放进数组中存起来
}
并且每次向串口写入4字节的数据。结果依然不变,接收数据都是以3字节为单位进行处理的
2. 在RXFFIL = 3中写入的字节数超过3时,比如5个字节(就像实验结果3中那样写入:12 34 56 78 91)
这5个字节依然能存入FIFO,不过5个字节只够触发一次中断,当三个字节被读取后,剩下的字节数只有2,不足以触发下一次接收中断,因此只能返回前三个字节12 34 56
在下入接下来的5个字节13 14 15 16 17时,FIFO中共有7个字节依次读取两次,每次读取两个字节,可以触发两次中断,因此发出78 91 13 14 15 16
至于这两次发出的数据为什么是在同一行当中显示,应该是硬件上的时序问题而被串口助手当成了同一组发出来的数据吧
后面依次类推,接收数据都是以3字节为单位进行处理的
3. 发送中断,很纳闷好像跟手册上介绍的不太一样,只要把中断标志位清掉,
ScibRegs.SCIFFTX.bit.TXFFINTCLR=1;
发送中断就可以进入,与TXFFIL似乎没有多大关系
4.发送中断
在中断函数中向寄存器中写数据
for(i=0; i< 3; i++)
{
ScibRegs.SCITXBUF.all=rxdata[i]; // Send data
}
数据并不会马上发出,而是存进了FIFO待发送中断函数执行完成以后,串口助手才会收到串口发出来的数据