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

TMS320F28062: 关于在既定周期运行的程序中使用SPI通讯的疑问

Part Number:TMS320F28062

首先 , 我的程序使用了CPUtimer定义了一个1ms的运行周期 , 整个程序顺序执行然后等待主中断再循环执行。其中主机还有一个更高优先级的中断是进行高频次的计算,从机则没有这个中断,只有1ms中断。

在此基础之上由于单片资源不足现在需要用到SPI进行两块芯片间的通讯,主从之间会有大概30个16位数据进行交互,期望效果是30个数据每个周期都可以收发一次。我对SPI接收使用了中断且有FIFO,而发送则没有使用中断而是每个周期30个数据采用循环方式发送一组一次,因为我认为发送如果也使用中断一是不能量化一组数据发送的间隔另一个担心会增加中断嵌套的风险。

按照我的理解,接收端BUFF里的数据是发送端强制填充进去的,按照数据手册的说法,在RXBUFF被填充满一个16位数据后会生成一个中断,表明数据接收完毕,中断服务函数则将BUFF里面的数据转移到其他地方并清除标志位,等待下一次填充。所以我的理解是接收端是在等待数据的填充,若没有数据的填充则不进行接收数据的转移,在发送端发起数据发送后,随着数据的填充每隔16位一次中断再把数据转移走,这样依次执行直到我30个数据全部发送完毕。

那么问题就来了:

1、我在查看论坛的时候看到文章指出,1M频率下SPI的CLK时钟都在1us,即每收发一位需要1us,一个16位数据就要16us,我发送30个数据所占用的时间就要达到将近500us,这对于一个周期1ms的系统来说是致命的,想要周期性运行这个系统,要么放大周期值要么减少发送的数量。那么在保证1ms前提下有没有什么办法实现我这样的发送需求。

2、由于主机程序内不只一个中断:1ms定时周期中断、高频次计算中断、SPI接收中断。另外两个中断的优先级都高于SPI的中断,那么在从机进行发送期间就会出现这样的情况:

     2·1在SPI接收期间,1ms中断或者高频次计算中断产生,若还未接收全16位数据,SPI是会延迟执行抢占的中断等待一个16位数据接收完毕后再去执行抢占还是立即执行抢占?

     2·2由于打断了SPI的接收,但是发送端并不知道接收端的接收被打断,发送端持续发送,RXBUFF中的数据是保留已经填充的数据还是呗新的数据替换?

     2·3由于高频次计算的中断在执行期间还要消耗一定的时间去进行一些数据的计算,SPI恢复接收将被大大延后,可否在进入中断期间停止CLK信号的产生来让发送端停止发送数据,待抢占中断执行完毕后恢复CLK再继续数据的传输

     2·4还是1ms周期的问题,一旦SPI接收被抢占,那么必然无法保证1个1ms周期内30个数据全部收发一次。

综上所述,有没有大佬做过类似的程序,帮我解答一下,助我实现这个功能?

Green Deng:

1、抱歉内容太多,没太看明白你的意思。能否简要描述一下你需要实现的具体要求?不需要结合你的应用,只是描述需要完成的任务。

2、C2000的中断机制是,当有中断在执行时,全局中断的标志位会被挂起,其他中断就进不来了(不考虑中断嵌套的情况)。直到执行完当前中断之后标志位才会被释放,其他中断才能响应。所以,SPI的接收中断不会被打断。

也由此,当SPI在执行接收中断的时候,其他的两个中断会无法响应,直到SPI接收完成跳出中断。这点也是需要注意的,如果实时性跟高的中断,可能会有问题。

,

pengxiang wang:

就是在一个周期性运行的程序里实现SPI双机通讯,接收使用中断发送不使用,如何操作才能保证周期稳定不影响其他功能与实时性的前提下实现30个16位数据的收发。并且发送也要保证相同的周期性。

,

Green Deng:

你好,总的来说为了最大限度地减少执行 SPI 接收和发送操作所需的 CPU 负载,可以利用设备的 DMA 在内存和 SPI 缓冲区之间进行数据移动。最初设置 DMA 只需要几个周期。

还应该配置 SPI 的速度,以便在所需的时间范围内完成30个16位数据传输。此外你配置的SPI的4级发送/接收 FIFO也有助于减少SPI 所需的时间。

,

pengxiang wang:

就是我对这个有一些疑问哈, 28062的DMA是如何做到周期性的或者如何获知RXBUFF里面已经填充了完整的字的?定时器?可是定时周期该如何匹配?当DMA对BUFF查询并转移的时候, BUFF里面并没有完整的一个字该如何? FIFO确实可以设置为接收4个字再进行传输, 当接收完完整的四个字后FIFORxState呗置一, 如果此时BUFF内的数据没有及时的呗DMA拿走, 而发送依旧在继续, 后面的数据不就丢步了吗?

,

pengxiang wang:

还有一点, DMA在传输完毕后也是发生中断, 这个中断的频次肯定会相对较低的, 那么SPI的接收中断还会存在吗?说的通俗一点就是我现在不知道如何快速的吧数据从BUFF里面拿走而不会造成拥堵, SPI的缓冲区最多存储4个字, 也就是FIFO接收在4works后跳转到接收完毕状态, 当传输的数据大于4个字后就会有拥堵的风险, 我想要一种自动的获知一个字或者4个字接收完毕, 然后自动将数据转移到定义好的数组或者结构体内, 而不用CPU付出更多的监控

,

pengxiang wang:

我看了一下28062的DMA例程, 所以按照我的程序的需求, DMA的源指针应该是指向SPI的RXBUFF, 目的指针要指向定义好的结构体, 那么如果我设置FIFO的4Word模式, 我改如何知道源指针此时指向了第几个字?也就是说我要在什么时刻下对源指针复位

第二个疑问点是例程使用CPUTimer0开启了DMA, 但是我的程序中使用Timer0做1ms主循环的中断, Timer1与Timer2作为主循环占用率计算和高频次计算中断占用率的计算, 那么对于DMA来讲是不是可以挂靠在已经定义好的Timer0上, 当Timer0启动后给DMA一个Oneshote开启DMA?

不过我还是没能明白DMA是怎么主动从RXBUFF里面取值的, 我就担心当DMA取值的时候BUFF里面没有值, 呢么呗取走的就会是错误的值, 还是说SPI的接收中断还要保留, Rx完毕中断后DMA在介入?不明白

,

pengxiang wang:

还有一个疑问点 , SPIRXBUFF这里是一个字的, 那怎么能做到收四个字啊

,

pengxiang wang:

FIFO的BUFF寄存器在那里定义的呀?我该如何索引到?另外我看SPI的RXBUFF只是一个16位的寄存器, 是怎么做到4words模式的?当RXBUFF有一个字的数据时他是怎么被传递的?

赞(0)
未经允许不得转载:TI中文支持网 » TMS320F28062: 关于在既定周期运行的程序中使用SPI通讯的疑问
分享到: 更多 (0)