标题:
DSP28335 SCI通信问题总结以及问题总结
[打印本页]
作者:
yuchengze
时间:
2016-7-1 15:10
标题:
DSP28335 SCI通信问题总结以及问题总结
最近几天一直在学习
SCI
通信
,自己以为应该不难,以前有
51
的串口经验。但是事实上,并没有想象中的那么容易。
1
、首先是非
FIFO
模式的中断设置服务程序,不能直接进入发送中断;需要先发送一个字节的数据才能进入中断;
按照
51
的模式,发送数据的时候,直接
TI = 1
,直接进入串口数据发送中断服务程序,接着在中断函数中将
TI = 0
;
void TXD_ISR() interrupt 4
{
if(TI)
{
TI = 0 ;
SBUF = xxx;
}
}
但是
28335
没有这个标志位,不知道这个算不算
ScibRegs.SCICTL2.bit.TXRDY
,
datasheet
上怎么写
if(ScibRegs.SCICTL2.bit.TXRDY == 1) ScibRegs.SCITXBUF = msg[x];
会自动清零的;并且
SCI
复位的时候这位始终为
1
;按照常理,如果只要中断寄存器配置好,按照
51
的模式可以直接进入中断,但是事实是,这不能进入中断,调试事实数据发现:
PieCtrlRegs.PIEIFR9.bit.INTx4 = 0
这个没有置一,也就不能发生中段;
我是遇到这样的问题,不知道大家有没有发现这个问题;如果有谁想到解决办法也可以在提出来,互相学习;有的可能会说,有
FIFO
干嘛不用呀,可以减少
CPU
负担。也是呀,我但是也想对呀,于是也写了一个
FIFO
中断程序,但是按照
开发板
上的例程,我也遇到如下问题;就是问题
2
啦!
2
、利用
FIFO
中断数据发送不完全,
FIFO
配置如下:
void scic_fifo_init()
{
ScicRegs.SCIFFTX.all=0xE060;
ScicRegs.SCIFFRX.all=0x206f;
ScicRegs.SCIFFCT.all=0x0;
}
中断服务函数
interrupt void SCIb_TX_FIFO_ISR()
{
unsigned char i;
if(TX_Len != 0)
{
if(TX_Len > 16)
{
for(i =0; i < 16;i++)
{
ScibRegs.SCITXBUF = msg[txdataindex1++];
}
TX_Len -=16;
}
else
{
for(i =0;i < TX_Len;i++)
{
ScibRegs.SCITXBUF = msg[txdataindex1++];
}
ScibRegs.SCICTL1.bit.TXENA= 0;
ScibRegs.SCICTL1.bit.RXENA = 1;
txdataindex1 = 0;
receivefinishflag = 0x00;
}
}
ScibRegs.SCIFFTX.bit.TXFFINTCLR = 1;
PieCtrlRegs.PIEACK.bit.ACK9 = 1;
}
但是出现一个问题;当
TX_Len > 16
的时候发送的数据时,发送的数据的个数是 :暂时标记为
n = TX_Len % 16;
举个例子:
msg ={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20}
若
TX_Len = 10
;发送的数据为
0,1,2,3,4,5,6,7,8,9
若
TX_Len = 10
;发送的数据为
0,1,2,3
为啥会出现这种情况呢,
for(i = 0; i < 16;i++)
{
ScibRegs.SCITXBUF =msg[txdataindex1++];//
这句也执行了,但是却没有相应
}
TX_Len -= 16;//=
执行了这句
我觉得肯定是哪里的寄存器设置有问题,但是也说不出来,在网上也找了很多资料也没有找见,偶尔我看到一个
论坛
上说,万一不行就用
TI
自带的例程,里面有中断模式的例程,
TI
的例程寄存器设置为:
void scib_fifo_init()
{
ScibRegs.SCICCR.all =0x0007; // 1 stopbit, No loopback
// No parity,8 char bits,
// async mode, idle-line protocol
ScibRegs.SCICTL1.all =0x0003; // enable TX, RX,internal SCICLK,
// Disable RX ERR, SLEEP, TXWAKE
ScibRegs.SCICTL2.bit.TXINTENA =1;
ScibRegs.SCICTL2.bit.RXBKINTENA =1;
ScibRegs.SCIHBAUD =0x0000;
ScibRegs.SCILBAUD =SCI_PRD;
ScibRegs.SCICCR.bit.LOOPBKENA =1; // Enable loop back
ScibRegs.SCIFFTX.all=0xC028;
ScibRegs.SCIFFRX.all=0x0028;
ScibRegs.SCIFFCT.all=0x00;
ScibRegs.SCICTL1.all =0x0023; //Relinquish SCI from Reset
ScibRegs.SCIFFTX.bit.TXFIFOXRESET=1;
ScibRegs.SCIFFRX.bit.RXFIFORESET=1;
}
比较
FIFO
设置你会发现主要的区别在哪里嘛,当然中断数据比较不算哈;
其实主要区别就在,我的
FIFO
初始化的将
ScibRegs.SCICTL2.bit.TXRDY
清零;
ScibRegs.SCIFFTX.bit.TXFFINTCLR= 1;
而
TI
的标准例程是没有清零的;
按照
ti
标准重新设置;运行一切
OK
;
经验教训:作为初学者,我建议尽量参照
ti
例程走,开发板配套的很多例程也是从这上面修改来的,并且大多数例程没有给中断模式的,只有查询模式;
3
、
SCI
的
FIFO
模式确实有很多优点,但是我想到一个问题;当用
FIFO
接收数据的时候,也采用中断模式;怎么设置
RXFFIL4 -0 ,
也就是接收中断比较值;
比如我设为
16
,只有当接收数据大于等于
16
的时候才能发生中断,但是有一个问题是我接收到的数据很可能小于
16
个那不是一直进不了接收中断啦,
,
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0