430单片机从外界获取了传感器的信息,要通过SPI接口把数据发送给ARM9,ARM9中跑的Linux系统。请教各位达人,两者之间的通信该怎么设计好?应该哪一个作为主机?
反正不是用IO口模拟的,软件实现的难度和所占资源都一样,哪个作为主机都无所谓的。不过为了习惯我们的常规思维,看你的项目是谁主动的,是430得到了传感器的数据,再发送给arm9,还是arm9需要数据的时候,就去查询430所读到的传感器数据。假如是前者,就430做主机吧,假如是后者,就arm9做主机咯,呵呵,个人愚见!
建议arm9做主机 好歹有个操作系统不是
是否可以从单片机上连一个中断信号到ARM上,这样单片机收到信号之后可以给ARM个中断,实时性应该能保证。
看看数据量大小,
看多少个传感器,
主要是看你的整体结构来决定
430单片机只获取一个传感器的数据,对数据简单封装以后发送给ARM9。我自己觉得430作为主机好理解一些。请各位大侠给点最终的意见吧。谢谢了
引用: 引用 2 楼 heaven_redsky 的回复:
建议arm9做主机 好歹有个操作系统不是
是否可以从单片机上连一个中断信号到ARM上,这样单片机收到信号之后可以给ARM个中断,实时性应该能保证。
你说的这种方式我想过。当单片机有数据时给ARM一个中断,然后ARM以主机的模式读取数据。但是我有一点不明白,ARM读数据时430怎么处理,它的数据怎么发送?这整个时序该是怎样的?
引用: 引用 4 楼 gucasboy 的回复:
430单片机只获取一个传感器的数据,对数据简单封装以后发送给ARM9。我自己觉得430作为主机好理解一些。请各位大侠给点最终的意见吧。谢谢了
同意你自己的想法,实话说,这个SPI通讯,主机,有没有操作系统都一样,因为时钟不是你自己模拟的,而是配置好之后,spi接口自动发出的。按照你现在的项目,假如你对实时性要求不高的话,ARM9做主机,需要数据的时候,给个中断430,可是430不知道读到数据了没有,然后又重来,何不让430主动呢,让他有更新数据了,再给ARM9.当然,要求实时性很高,那就选ARM9做主机吧。而且你的430,最好时时刻刻准备好已更新的数据。
总的来说,谁做主机都一样,开始我就说,没多大关系,看楼主的习惯,至于无论谁做主机,时序都一样,不外乎时钟谁发出而已。你又不是模拟spi,时序的东西,说直点,根本不用管。SPI数据寄存器有数据就读,发数据就去写寄存器,启动发送,完了。。。。
引用: 引用 7 楼 peasant_lee 的回复:
引用 4 楼 gucasboy 的回复:
430单片机只获取一个传感器的数据,对数据简单封装以后发送给ARM9。我自己觉得430作为主机好理解一些。请各位大侠给点最终的意见吧。谢谢了
同意你自己的想法,实话说,这个SPI通讯,主机,有没有操作系统都一样,因为时钟不是你自己模拟的,而是配置好之后,spi接口自动发出的。按照你现在的项目,假如你对实时性要求不高的话,ARM9做主机,需要数据……
透彻。顶。。。
我现在先用两块MSP430F5419来模拟SPI的通信,但是有个问题始终搞不定。
我用单片机A作为主机,单片机B作为从机。当A想向B发送数据时,通过IO口P9.1发送一个上升沿给从机B。B进入中断等待接收,这时主机A开始发送数据。发送的数据正常,但是接收到的数据老是错误,会出现移位的情况。比如我发送的是0XABCD,但是接收到的是0xD5E6,向右循环移了一位。有时正常,有时不只一位。这是什么原因,怎么保证每次接收是正确的啊?
SPI接收不是按字节接收的吗?怎么我接收到的字节内部都循环移位了?应该只是字节之间的位置颠倒啊。我单字节收发也是这样的问题,我采用中断接收也是这个问题。都要崩溃了,调了一天了。
假如你的两边都不是用IO口来模拟SPI的话,肯定是你初始化SPI错了,或许,配置了接收第二个时钟才有效,或许你的时钟配多了一个沿,反正是时钟配置的可能性超大。
SPI接收不是按字节接收的吗?怎么我接收到的字节内部都循环移位了?从硬件来讲,SPI本来就是两个封闭的移位寄存器。。。
我修改过时钟了,还是有那样的问题。开始接收是正常的,但是一旦将发射板断电,再次上电时接收就有移位。复位以后再接收又正常了。我怀疑是发送突然停止了,从机的接收移位寄存器中只移了几位,不到8位,当再次接收时会把这次接收的继续移到移位寄存器里,满8位以后给接收缓冲寄存器,这样读到的数据就相当于移位了。我觉得这种可能性很大。我的想法是每次接收时对接收缓冲寄存器清零,但好像不能这样处理。谁有好办法?谢谢了!
我确信我的想法,就是因为主机的时钟停了以后,从机的移位寄存器有残留数据。我现在想了一个办法把残留数据清除以后就没有这种现象了。
那,当你的发射板断电后,你可以复位一下SPI,或者清空一下SPI的数据寄存器,,,
引用: 引用 13 楼 peasant_lee 的回复:
那,当你的发射板断电后,你可以复位一下SPI,或者清空一下SPI的数据寄存器,,,
我就是这么做的,但是我觉得我的做法有点笨,有点浪费。你有什么好办法对SPI复位或者清空SPI的数据寄存器?我采用的是发射板初始化时发生一个脉冲给接收板,接收板进入中断对SPI复位。
不知道430,有没有关SPI模块电源的寄存器设置,将SPI关闭,再启动,或者重新初始化下SPI。,好像有些mcu的spi,当你读一次数据寄存器的时候,它会自动清空这个寄存器的值。你可以看看有没有这个功能,假如有,你每次需要清空的时候,读下,丢弃,就OK了。
Peasant_Lee显然是行家丫!赞。
没用过SPI,看着看着,也明白不少SPI相关知识了!
引用: 引用 15 楼 peasant_lee 的回复:
不知道430,有没有关SPI模块电源的寄存器设置,将SPI关闭,再启动,或者重新初始化下SPI。,好像有些mcu的spi,当你读一次数据寄存器的时候,它会自动清空这个寄存器的值。你可以看看有没有这个功能,假如有,你每次需要清空的时候,读下,丢弃,就OK了。
有个问题,我觉得数据是停在移位寄存器里了,还不到8位,这时数据还没打接收寄存器,读了也没用。只能初始化。
那为什么会停在移位寄存器上呢?除非你传输的数据达不到它的宽度,,,一旦传满8bit,它自动会移到数据寄存器的。
430是数据的生产者,所以430做主机和ARM的连接是最简单的。
430和arm的SPI时序已经由各自的SPI模块实现好了。你在程序需要做的只是操作SPI的相关寄存器即可。