社区
驱动开发/核心开发
帖子详情
求助:430单片机与ARM的SPI通信方案
gucasboy
2010-05-10 05:54:41
430单片机从外界获取了传感器的信息,要通过SPI接口把数据发送给ARM9,ARM9中跑的Linux系统。请教各位达人,两者之间的通信该怎么设计好?应该哪一个作为主机?
...全文
432
19
打赏
收藏
求助:430单片机与ARM的SPI通信方案
430单片机从外界获取了传感器的信息,要通过SPI接口把数据发送给ARM9,ARM9中跑的Linux系统。请教各位达人,两者之间的通信该怎么设计好?应该哪一个作为主机?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
19 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
Peasant_Lee
2010-05-22
打赏
举报
回复
那为什么会停在移位寄存器上呢?除非你传输的数据达不到它的宽度,,,一旦传满8bit,它自动会移到数据寄存器的。
ymhsss
2010-05-22
打赏
举报
回复
430是数据的生产者,所以430做主机和ARM的连接是最简单的。
430和arm的SPI时序已经由各自的SPI模块实现好了。你在程序需要做的只是操作SPI的相关寄存器即可。
gucasboy
2010-05-20
打赏
举报
回复
[Quote=引用 15 楼 peasant_lee 的回复:]
不知道430,有没有关SPI模块电源的寄存器设置,将SPI关闭,再启动,或者重新初始化下SPI。,好像有些mcu的spi,当你读一次数据寄存器的时候,它会自动清空这个寄存器的值。你可以看看有没有这个功能,假如有,你每次需要清空的时候,读下,丢弃,就OK了。
[/Quote]
有个问题,我觉得数据是停在移位寄存器里了,还不到8位,这时数据还没打接收寄存器,读了也没用。只能初始化。
曹大夯
2010-05-18
打赏
举报
回复
Peasant_Lee显然是行家丫!赞。
没用过SPI,看着看着,也明白不少SPI相关知识了!
Peasant_Lee
2010-05-18
打赏
举报
回复
不知道430,有没有关SPI模块电源的寄存器设置,将SPI关闭,再启动,或者重新初始化下SPI。,好像有些mcu的spi,当你读一次数据寄存器的时候,它会自动清空这个寄存器的值。你可以看看有没有这个功能,假如有,你每次需要清空的时候,读下,丢弃,就OK了。
gucasboy
2010-05-18
打赏
举报
回复
[Quote=引用 13 楼 peasant_lee 的回复:]
那,当你的发射板断电后,你可以复位一下SPI,或者清空一下SPI的数据寄存器,,,
[/Quote]
我就是这么做的,但是我觉得我的做法有点笨,有点浪费。你有什么好办法对SPI复位或者清空SPI的数据寄存器?我采用的是发射板初始化时发生一个脉冲给接收板,接收板进入中断对SPI复位。
Peasant_Lee
2010-05-17
打赏
举报
回复
那,当你的发射板断电后,你可以复位一下SPI,或者清空一下SPI的数据寄存器,,,
gucasboy
2010-05-17
打赏
举报
回复
我确信我的想法,就是因为主机的时钟停了以后,从机的移位寄存器有残留数据。我现在想了一个办法把残留数据清除以后就没有这种现象了。
gucasboy
2010-05-14
打赏
举报
回复
我修改过时钟了,还是有那样的问题。开始接收是正常的,但是一旦将发射板断电,再次上电时接收就有移位。复位以后再接收又正常了。我怀疑是发送突然停止了,从机的接收移位寄存器中只移了几位,不到8位,当再次接收时会把这次接收的继续移到移位寄存器里,满8位以后给接收缓冲寄存器,这样读到的数据就相当于移位了。我觉得这种可能性很大。我的想法是每次接收时对接收缓冲寄存器清零,但好像不能这样处理。谁有好办法?谢谢了!
Peasant_Lee
2010-05-13
打赏
举报
回复
假如你的两边都不是用IO口来模拟SPI的话,肯定是你初始化SPI错了,或许,配置了接收第二个时钟才有效,或许你的时钟配多了一个沿,反正是时钟配置的可能性超大。
SPI接收不是按字节接收的吗?怎么我接收到的字节内部都循环移位了?从硬件来讲,SPI本来就是两个封闭的移位寄存器。。。
gucasboy
2010-05-13
打赏
举报
回复
我现在先用两块MSP430F5419来模拟SPI的通信,但是有个问题始终搞不定。
我用单片机A作为主机,单片机B作为从机。当A想向B发送数据时,通过IO口P9.1发送一个上升沿给从机B。B进入中断等待接收,这时主机A开始发送数据。发送的数据正常,但是接收到的数据老是错误,会出现移位的情况。比如我发送的是0XABCD,但是接收到的是0xD5E6,向右循环移了一位。有时正常,有时不只一位。这是什么原因,怎么保证每次接收是正确的啊?
SPI接收不是按字节接收的吗?怎么我接收到的字节内部都循环移位了?应该只是字节之间的位置颠倒啊。我单字节收发也是这样的问题,我采用中断接收也是这个问题。都要崩溃了,调了一天了。
Peasant_Lee
2010-05-11
打赏
举报
回复
[Quote=引用 4 楼 gucasboy 的回复:]
430单片机只获取一个传感器的数据,对数据简单封装以后发送给ARM9。我自己觉得430作为主机好理解一些。请各位大侠给点最终的意见吧。谢谢了
[/Quote]
同意你自己的想法,实话说,这个SPI通讯,主机,有没有操作系统都一样,因为时钟不是你自己模拟的,而是配置好之后,spi接口自动发出的。按照你现在的项目,假如你对实时性要求不高的话,ARM9做主机,需要数据的时候,给个中断430,可是430不知道读到数据了没有,然后又重来,何不让430主动呢,让他有更新数据了,再给ARM9.当然,要求实时性很高,那就选ARM9做主机吧。而且你的430,最好时时刻刻准备好已更新的数据。
总的来说,谁做主机都一样,开始我就说,没多大关系,看楼主的习惯,至于无论谁做主机,时序都一样,不外乎时钟谁发出而已。你又不是模拟spi,时序的东西,说直点,根本不用管。SPI数据寄存器有数据就读,发数据就去写寄存器,启动发送,完了。。。。
老人参
2010-05-11
打赏
举报
回复
同意......
gucasboy
2010-05-11
打赏
举报
回复
[Quote=引用 2 楼 heaven_redsky 的回复:]
建议arm9做主机 好歹有个操作系统不是
是否可以从单片机上连一个中断信号到ARM上,这样单片机收到信号之后可以给ARM个中断,实时性应该能保证。
[/Quote]
你说的这种方式我想过。当单片机有数据时给ARM一个中断,然后ARM以主机的模式读取数据。但是我有一点不明白,ARM读数据时430怎么处理,它的数据怎么发送?这整个时序该是怎样的?
gucasboy
2010-05-11
打赏
举报
回复
430单片机只获取一个传感器的数据,对数据简单封装以后发送给ARM9。我自己觉得430作为主机好理解一些。请各位大侠给点最终的意见吧。谢谢了
Heaven_Redsky
2010-05-11
打赏
举报
回复
[Quote=引用 7 楼 peasant_lee 的回复:]
引用 4 楼 gucasboy 的回复:
430单片机只获取一个传感器的数据,对数据简单封装以后发送给ARM9。我自己觉得430作为主机好理解一些。请各位大侠给点最终的意见吧。谢谢了
同意你自己的想法,实话说,这个SPI通讯,主机,有没有操作系统都一样,因为时钟不是你自己模拟的,而是配置好之后,spi接口自动发出的。按照你现在的项目,假如你对实时性要求不高的话,ARM9做主机,需要数据……
[/Quote]
透彻。顶。。。
老人参
2010-05-10
打赏
举报
回复
看看数据量大小,
看多少个传感器,
主要是看你的整体结构来决定
Heaven_Redsky
2010-05-10
打赏
举报
回复
建议arm9做主机 好歹有个操作系统不是
是否可以从单片机上连一个中断信号到ARM上,这样单片机收到信号之后可以给ARM个中断,实时性应该能保证。
Peasant_Lee
2010-05-10
打赏
举报
回复
反正不是用IO口模拟的,软件实现的难度和所占资源都一样,哪个作为主机都无所谓的。不过为了习惯我们的常规思维,看你的项目是谁主动的,是430得到了传感器的数据,再发送给arm9,还是arm9需要数据的时候,就去查询430所读到的传感器数据。假如是前者,就430做主机吧,假如是后者,就arm9做主机咯,呵呵,个人愚见!
普中STM32-PZ6806L开发板全套源代码程序,小白的
ARM
单片机
工程师入门教程实战篇.zip
普中STM32-PZ6806L开发板全套源代码程序,小白的
ARM
单片机
工程师入门教程实战篇.zip
如何学习
单片机
编程
单片机
是一门实用技术,我们学习它已经不是为了应付考试了,我给大家总结了
单片机
的学习方法是:一个要领,四个步骤。
基于STM32F103X系列
单片机
的智能游客寻呼系统.zip
基于STM32F103X系列
单片机
的智能游客寻呼系统
基于STM32的LCD12881显示屏驱动.zip
适用工作项目、毕业设计,课程设计,项目源码均经过助教老师测试,运行无误,轻松复刻,欢迎下载 -------- 下载后请首先打开README.md文件(如有),仅供学习参考。
单片机
无线
通信
技术教程
无线
通信
技术允许在没有物理连接的情况下传输信息,通过电磁波在空间中传播实现。电磁波的频率范围广泛,从低频的无线电波到高频的光波,每种频率都有其特定的应用场景。蓝牙模块是一种实现蓝牙无线
通信
的硬件设备,它基于蓝牙协议,能够使设备在短距离内进行无线数据交换。蓝牙模块通常包含一个微控制器、射频收发器、天线以及必要的外围电路。在
单片机
系统中,蓝牙模块可以作为独立的
通信
模块,通过串行接口(如UART)与
单片机
连接,实现无线数据传输。
驱动开发/核心开发
21,618
社区成员
21,708
社区内容
发帖
与我相关
我的任务
驱动开发/核心开发
硬件/嵌入开发 驱动开发/核心开发
复制链接
扫一扫
分享
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章