打印

SPI双机通信,如何在程序运行中将从机模式改为主机模式?

[复制链接]
4867|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
feilusia|  楼主 | 2013-10-11 10:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 feilusia 于 2013-10-11 16:16 编辑

根据项目需要,两机初始化都得是从机模式,需要发送数据时才转换为主机进行发送数据。
若初始化时将两机定为一主一丛,程序可正常通信。
但程序运行中将从机转换为主机,发送数据就会不正确,接收到的数据为0.


沙发
feilusia|  楼主 | 2013-10-11 10:27 | 只看该作者
本帖最后由 feilusia 于 2013-10-11 16:16 编辑

转换函数中配置几乎与初始化时一致。
函数如下:
void SPI2_Change_Mode( SPI2Status spi2_mode )
{
SPI2->CR1 &= ~(1<<6)  ;         //SPI设备失能
SPI2->CR2 &= ~(1<<1)  ;        //发送缓冲区DMA失能
SPI2->CR2 &= ~(1<<0)  ;        //接收缓冲区DMA失能  
SPI2->CR2 &= ~(1<<6)  ;         //SPI接收中断失能

SPI2->CR1 = 0x0000 ;           //SPI2->CR1复位
SPI2->CR1 |= 1<<9  ;           //nss软件管理
SPI2->CR1 |= 0<<11 ;           //数据格式:8bit
SPI2->CR1 |= 1<<1  ;           //CPOL=1:空闲模式下SCK为高电平
SPI2->CR1 |= 1<<0  ;           //CPHA=1:数据采样从第二个时钟沿开始  
SPI2->CR1 |= 2<<3  ;           //Fsck=Fcpu/8=36/8=4.5M
SPI2->CR1 |= 0<<7  ;           //MSBfirst
if(spi2_mode==spi2_mode_master) //若为从机转主机模式
{
  SPI2->CR1 |= 0<<10 ;          //RXONLY:全双工模式
  SPI2->CR1 |= 0<<15 ;          //BIDIMODE:双线双向
  SPI2->CR1 |= 1<<8  ;     //nss高电平
  SPI2->CR1 |= 1<<2  ;     //SPI主机
  SPI2->CR2 |= 1<<1  ;        //发送缓冲区DMA使能
}
else if(spi2_mode==spi2_mode_slave) //若为主机转从机模式
{
  SPI2->CR1 |= 1<<10 ;          //RXONLY:只接收模式
  SPI2->CR1 |= 0<<15 ;          //BIDIMODE:双线双向
  SPI2->CR1 &= ~(1<<8)  ;      //nss低电平
  SPI2->CR1 &= ~(1<<2)  ;      //SPI从机
  SPI2->CR2 |= 1<<0  ;        //接收缓冲区DMA使能  
  SPI2->CR2 |= 1<<6  ;          //SPI接收中断使能  
}
SPI2->CR1 |= 1<<6  ;           //SPI设备使能
}


使用特权

评论回复
板凳
feilusia|  楼主 | 2013-10-11 16:17 | 只看该作者
有没有人懂这块的

使用特权

评论回复
地板
airwill| | 2013-10-11 16:29 | 只看该作者
呵呵, 估计是主机竞争造成的问题.
想办法解决竞争问题. 有个办法, 通过一个 IO 口来相互确认谁占领了主机.
成为主机前, 要询问对方, 另外主机完成后,立即返回从机.

使用特权

评论回复
5
feilusia|  楼主 | 2013-10-11 16:45 | 只看该作者
airwill 发表于 2013-10-11 16:29
呵呵, 估计是主机竞争造成的问题.
想办法解决竞争问题. 有个办法, 通过一个 IO 口来相互确认谁占领了主机.
...

另一个SPI目前一直都是从机,只这个SPI由从机变为主机。
我发现执行完这一句另一个SPI就进中断了:               
SPI2->CR1 |= 1<<2  ;        //SPI主机
我用示波器测了,SPI从机转主机时,MOSI电平不稳定,我加了上拉一样不稳定。这样是不是就不能用这种从机主机来回变换的方式去做项目了?

使用特权

评论回复
6
airwill| | 2013-10-11 16:53 | 只看该作者
建议先关闭 SPI 模块, 再切换主从方式

使用特权

评论回复
7
feilusia|  楼主 | 2013-10-11 16:57 | 只看该作者
airwill 发表于 2013-10-11 16:53
建议先关闭 SPI 模块, 再切换主从方式

我在切换之前就关闭了:
SPI2->CR1 &= ~(1<<6)  ;         //SPI设备失能
SPI2->CR2 &= ~(1<<1)  ;        //发送缓冲区DMA失能
SPI2->CR2 &= ~(1<<0)  ;        //接收缓冲区DMA失能  
SPI2->CR2 &= ~(1<<6)  ;         //SPI接收中断失能

难道要两边的SPI都关闭么

使用特权

评论回复
8
airwill| | 2013-10-11 17:18 | 只看该作者
试试吧。
这不是什么困难的问题,就是个配合硬件的问题罢了。

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
zeluo + 3 很给力!
9
feilusia|  楼主 | 2013-10-11 17:25 | 只看该作者
airwill 发表于 2013-10-11 17:18
试试吧。
这不是什么困难的问题,就是个配合硬件的问题罢了。

好的,我先试试,谢谢版主的热情回复。

使用特权

评论回复
10
zeluo| | 2013-10-11 20:26 | 只看该作者
版主确实很给力   确实很尽职   版主   超顶你一个

使用特权

评论回复
11
yidu01| | 2013-10-12 10:41 | 只看该作者

使用特权

评论回复
12
feilusia|  楼主 | 2013-10-12 10:49 | 只看该作者
yidu01 发表于 2013-10-12 10:41

问题简而言之就是:SPI的从机转主机的瞬间,电平会不稳定,造成误读。

使用特权

评论回复
13
airwill| | 2013-10-17 12:09 | 只看该作者
feilusia 发表于 2013-10-12 10:49
问题简而言之就是:SPI的从机转主机的瞬间,电平会不稳定,造成误读。

这个解释有点牵强哦.
SPI的从机转主机的瞬间,MOSI 电平会不稳定, 不过 spi 是严格主从方式的. 等 SCK 驱动信号的时候, MOSI 应该已经稳定下来.
另外 SCK 信号也会出现不稳定, 可能有多余的脉冲发生, 导致通信错误. 但不应该收到全0.

使用特权

评论回复
14
feilusia|  楼主 | 2013-10-17 13:54 | 只看该作者
airwill 发表于 2013-10-17 12:09
这个解释有点牵强哦.
SPI的从机转主机的瞬间,MOSI 电平会不稳定, 不过 spi 是严格主从方式的. 等 SCK 驱 ...

现象是转换瞬间两台机子都会进入接收中断。
我有怀疑过那个时序配置,所以我把平时空闲时设置为高电平,三根线也都拉高,但还是会出错。

后来项目时间比较紧张,现在改变方式了,还是定死主从机,主机通过发送数据来读从机。

使用特权

评论回复
15
lj9010| | 2017-12-16 09:32 | 只看该作者
没后续了吗?不知道楼主解决从机切换主机的问题了没有  我也遇到这种问题

使用特权

评论回复
16
threetigher| | 2019-3-13 15:12 | 只看该作者
lj9010 发表于 2017-12-16 09:32
没后续了吗?不知道楼主解决从机切换主机的问题了没有  我也遇到这种问题 ...

对于双方都可能发起双向通信的情况下,是否可以主从关系定死?
当从机需要发起通信时,通过一个IO口给主机一个中断,主机开始主控,这种方式如何?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:1、博客:http://blog.csdn.net/feilusia 2、QQ群:STM8/STM32群(164311667);职场交流群(450154342);CC2640R2F群(557278427) 3、淘宝店:https://shop217632629.taobao.com/?spm=2013.1.1000126.d21.hd2o8i

135

主题

1957

帖子

94

粉丝