TI中文支持网
TI专业的中文技术问题搜集分享网站

菜鸟请教:SCI如何连续发送多个数据

各位,菜鸟初学SCI,想用SCI实现两个DSP的485通讯,有如下几个问题请教:

1、SCI的SCICCR寄存器中定义发送长度最大为8位,那如果想发送多个16位数如何发?是分成高8位和低8位吗?

2、因为我程序里还有其它实时性要求比较严格的模块,因此不想采用中断的方式进行SCI操作,不管接收还是发送都采用查询的方式,这样如果波特率是9600,则发送一个16位数需要约1.6ms,多个16位数的话时间就更长,有没有什么办法可以不要等到这1.6ms完成了才退出SCI的操作?

请各位针对我的问题指点一二,或者有相关的文档或例程推荐也可以,多谢

Hank Zhao:

1,是的,只能分成高八位,低八位分别发送。2,你可以使用SCI的FIFO模式发送,一次可以发送16个8-bit数据,controlsuite中提供有SCI fifo模式下的例程。

各位,菜鸟初学SCI,想用SCI实现两个DSP的485通讯,有如下几个问题请教:

1、SCI的SCICCR寄存器中定义发送长度最大为8位,那如果想发送多个16位数如何发?是分成高8位和低8位吗?

2、因为我程序里还有其它实时性要求比较严格的模块,因此不想采用中断的方式进行SCI操作,不管接收还是发送都采用查询的方式,这样如果波特率是9600,则发送一个16位数需要约1.6ms,多个16位数的话时间就更长,有没有什么办法可以不要等到这1.6ms完成了才退出SCI的操作?

请各位针对我的问题指点一二,或者有相关的文档或例程推荐也可以,多谢

Chen Long:

回复 Hank Zhao:

谢谢,你说的是Example_2833xSci_Echoback这个例程吧,我正在学习。

还有个问题,就是接收FIFO是10位宽的,是不是只能接收10位宽度,接收到了自己再组合,FIFO宽度本身不能调整为8位或其它的?

各位,菜鸟初学SCI,想用SCI实现两个DSP的485通讯,有如下几个问题请教:

1、SCI的SCICCR寄存器中定义发送长度最大为8位,那如果想发送多个16位数如何发?是分成高8位和低8位吗?

2、因为我程序里还有其它实时性要求比较严格的模块,因此不想采用中断的方式进行SCI操作,不管接收还是发送都采用查询的方式,这样如果波特率是9600,则发送一个16位数需要约1.6ms,多个16位数的话时间就更长,有没有什么办法可以不要等到这1.6ms完成了才退出SCI的操作?

请各位针对我的问题指点一二,或者有相关的文档或例程推荐也可以,多谢

Hank Zhao:

回复 Chen Long:

我说的是scia_loopback_interrupts这个例程,接收FIFO是10位宽,也就是说它可以接收1到10位的数据。

各位,菜鸟初学SCI,想用SCI实现两个DSP的485通讯,有如下几个问题请教:

1、SCI的SCICCR寄存器中定义发送长度最大为8位,那如果想发送多个16位数如何发?是分成高8位和低8位吗?

2、因为我程序里还有其它实时性要求比较严格的模块,因此不想采用中断的方式进行SCI操作,不管接收还是发送都采用查询的方式,这样如果波特率是9600,则发送一个16位数需要约1.6ms,多个16位数的话时间就更长,有没有什么办法可以不要等到这1.6ms完成了才退出SCI的操作?

请各位针对我的问题指点一二,或者有相关的文档或例程推荐也可以,多谢

Chen Long:

回复 Hank Zhao:

还有个485的通信问题,我的理解是这样的:就是一个主机多个从机用485通讯,都连在一条总线上,如果主机发送一条消息,其它从机是不是都能收到,但是由谁回复可以看主机里包含的地址也就是ID信息?也就是说从硬件上来说从机都能收到主机的信息,而回复不回复是由从机的软件也就是编程人员确定的,包含了我从机的ID我就回复,不包含就不回复,或者即使包含了我不回复也可以。这和CAN通讯的硬件仲裁不一样,CAN是必须和发送者的邮箱ID号一样才能收到,其它不一样的肯定收不到,而485是都能收到。我的理解对吗?

各位,菜鸟初学SCI,想用SCI实现两个DSP的485通讯,有如下几个问题请教:

1、SCI的SCICCR寄存器中定义发送长度最大为8位,那如果想发送多个16位数如何发?是分成高8位和低8位吗?

2、因为我程序里还有其它实时性要求比较严格的模块,因此不想采用中断的方式进行SCI操作,不管接收还是发送都采用查询的方式,这样如果波特率是9600,则发送一个16位数需要约1.6ms,多个16位数的话时间就更长,有没有什么办法可以不要等到这1.6ms完成了才退出SCI的操作?

请各位针对我的问题指点一二,或者有相关的文档或例程推荐也可以,多谢

Hank Zhao:

回复 Chen Long:

对的,你的理解是正确的。不过CAN也可以使用mask功能使所有邮箱都能接收到消息,CAN是多节点的网络通信,没有主从之分。

各位,菜鸟初学SCI,想用SCI实现两个DSP的485通讯,有如下几个问题请教:

1、SCI的SCICCR寄存器中定义发送长度最大为8位,那如果想发送多个16位数如何发?是分成高8位和低8位吗?

2、因为我程序里还有其它实时性要求比较严格的模块,因此不想采用中断的方式进行SCI操作,不管接收还是发送都采用查询的方式,这样如果波特率是9600,则发送一个16位数需要约1.6ms,多个16位数的话时间就更长,有没有什么办法可以不要等到这1.6ms完成了才退出SCI的操作?

请各位针对我的问题指点一二,或者有相关的文档或例程推荐也可以,多谢

Chen Long:

回复 Hank Zhao:

还有几个问题请教:

1、手册上说“With the FIFO enabled, TXSHF is directly loaded after an optional delay value (SCIFFCT), TXBUF is not used.”意思是使能发送FIFO之后,TXSHF直接装载数据而不使用TXBUF,是说从FIFO直接装载吗?这样的话TXBUF这个寄存器就用不到了,但是我看TI的例程里仍然把要发送的数据先放到SCITXBUF这个寄存器里,而FIFO里并没有一个专门用来装载要发送数据的地方,这是为什么?

2、发送FIFO和接收FIFO都是必须通过各自SCIFFTX和SCIFFRX寄存器中的RESET位才能将FIFO清0吗?有没有其它情况下会自动清0,比如发送FIFO当把FIFO内所有的数据都发送出去后会不会自动清0,接收FIFO在将FIFO中的数据全部读取后会不会自动清0?

3、接收FIFO有没有用来设置接收多少个字符后不再接收的地方?SCIFFRX中的RXFFIL位可以实现这个功能吗,还是只是用来产生中断的?那如果用查询方式来进行接收的话如何判定发来的数据已经全部接受完了可以进行读出操作了?如果一直没有将接收FIFO中的数据读出是不是就一直接收直到大于16级的深度而产生溢出?

各位,菜鸟初学SCI,想用SCI实现两个DSP的485通讯,有如下几个问题请教:

1、SCI的SCICCR寄存器中定义发送长度最大为8位,那如果想发送多个16位数如何发?是分成高8位和低8位吗?

2、因为我程序里还有其它实时性要求比较严格的模块,因此不想采用中断的方式进行SCI操作,不管接收还是发送都采用查询的方式,这样如果波特率是9600,则发送一个16位数需要约1.6ms,多个16位数的话时间就更长,有没有什么办法可以不要等到这1.6ms完成了才退出SCI的操作?

请各位针对我的问题指点一二,或者有相关的文档或例程推荐也可以,多谢

Hank Zhao:

回复 Chen Long:

1,FIFO的地址和TXBUF的地址是相同的,在FIFO模式下往SCITXBUF放数据就是往FIFO放数据。

各位,菜鸟初学SCI,想用SCI实现两个DSP的485通讯,有如下几个问题请教:

1、SCI的SCICCR寄存器中定义发送长度最大为8位,那如果想发送多个16位数如何发?是分成高8位和低8位吗?

2、因为我程序里还有其它实时性要求比较严格的模块,因此不想采用中断的方式进行SCI操作,不管接收还是发送都采用查询的方式,这样如果波特率是9600,则发送一个16位数需要约1.6ms,多个16位数的话时间就更长,有没有什么办法可以不要等到这1.6ms完成了才退出SCI的操作?

请各位针对我的问题指点一二,或者有相关的文档或例程推荐也可以,多谢

Hank Zhao:

回复 Chen Long:

2,SCIFFTX和SCIFFRX寄存器中的RESET位用于复位FIFO指针,并不是真的将FIFO清0。FIFO指针会随着数据的接收和发送相应的加一或减一。

各位,菜鸟初学SCI,想用SCI实现两个DSP的485通讯,有如下几个问题请教:

1、SCI的SCICCR寄存器中定义发送长度最大为8位,那如果想发送多个16位数如何发?是分成高8位和低8位吗?

2、因为我程序里还有其它实时性要求比较严格的模块,因此不想采用中断的方式进行SCI操作,不管接收还是发送都采用查询的方式,这样如果波特率是9600,则发送一个16位数需要约1.6ms,多个16位数的话时间就更长,有没有什么办法可以不要等到这1.6ms完成了才退出SCI的操作?

请各位针对我的问题指点一二,或者有相关的文档或例程推荐也可以,多谢

Hank Zhao:

回复 Chen Long:

3,FIFO可以接收设置中断,在接收到一定数目的字符后去读FIFO中的数据。SCIFFRX中的RXFFIL就是用来设置接收中断的。如果一直接收会发生接收溢出,最早接收到的数据会丢失。

各位,菜鸟初学SCI,想用SCI实现两个DSP的485通讯,有如下几个问题请教:

1、SCI的SCICCR寄存器中定义发送长度最大为8位,那如果想发送多个16位数如何发?是分成高8位和低8位吗?

2、因为我程序里还有其它实时性要求比较严格的模块,因此不想采用中断的方式进行SCI操作,不管接收还是发送都采用查询的方式,这样如果波特率是9600,则发送一个16位数需要约1.6ms,多个16位数的话时间就更长,有没有什么办法可以不要等到这1.6ms完成了才退出SCI的操作?

请各位针对我的问题指点一二,或者有相关的文档或例程推荐也可以,多谢

Chen Long:

回复 Hank Zhao:

谢谢楼上的回复,我现在用FIFO的接收中断,设置接收字符大于等于6个时产生中断,发现有这样的问题:即发送过来的数据是ABCDEF这6个数,并且每隔500ms发一次,接收这边第一次接收到的是对的,我将接收FIFO中的数依次读出放到一个数组里,然后继续接收,再往后接收到的数就可能成了FABCDE这样的顺序了,或者F这个位置上是一个其它的数,比如255或者一个很大的数

请问对于接收顺序不正确和其中一个数变成255这两个个问题可能是什么原因导致的?是发送过来的数就不对吗?但是我同时用串口调试助手观察发送方的数据是正确的,而且基本上FABCDE这6个数里,就F不对,其它的都正确

interrupt void SciBRxFifoIsr(void){    Uint16 i;

    for(i=0;i<6;i++)    {        u16RxBuff[i]=ScibRegs.SCIRXBUF.all;    }

    u16RxOverFlag = 1;  //Rx finish flag

    //ScibRegs.SCIFFRX.bit.RXFIFORESET = 0; //Reset RXFIFO

    ScibRegs.SCIFFRX.bit.RXFFOVRCLR = 1; // Clear Overflow flag    ScibRegs.SCIFFRX.bit.RXFFINTCLR = 1; // Clear Interrupt flag    PieCtrlRegs.PIEACK.bit.ACK9 = 1; // Issue PIE ack}

赞(0)
未经允许不得转载:TI中文支持网 » 菜鸟请教:SCI如何连续发送多个数据
分享到: 更多 (0)