OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5462|回复: 5

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

[复制链接]

26

主题

280

帖子

1

精华

高级会员

Rank: 4

积分
908
金钱
908
注册时间
2013-8-2
在线时间
279 小时
发表于 2013-10-11 11:13:24 | 显示全部楼层 |阅读模式

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

博客:http://blog.csdn.net/feilusia
CC2541群(127442605);CC2640群(557278427);
Android群(541462902);STM8/STM32群(164311667);
Linux群(512598061);职场交流群(450154342);
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

26

主题

280

帖子

1

精华

高级会员

Rank: 4

积分
908
金钱
908
注册时间
2013-8-2
在线时间
279 小时
 楼主| 发表于 2013-10-11 11:20:30 | 显示全部楼层

转换函数中配置几乎与初始化时一致。
函数如下:
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设备使能 
}

博客:http://blog.csdn.net/feilusia
CC2541群(127442605);CC2640群(557278427);
Android群(541462902);STM8/STM32群(164311667);
Linux群(512598061);职场交流群(450154342);
回复 支持 反对

使用道具 举报

26

主题

280

帖子

1

精华

高级会员

Rank: 4

积分
908
金钱
908
注册时间
2013-8-2
在线时间
279 小时
 楼主| 发表于 2013-10-11 16:06:12 | 显示全部楼层
正确的初始化函数如下:
void SPI2_Configuration( SPI2Status spi2_mode )
{
RCC->APB2ENR |= 1<<3  ;        //PORTB时钟使能   
RCC->APB1ENR |= 1<<14 ;        //SPI2时钟使能 
RCC->APB2ENR |= 1<<0 ;         //复用功能时钟使能 
GPIOB->CRH &= 0X000FFFFF ;  //复用推挽输出
GPIOB->CRH |= 0XBBB00000 ;       
GPIOB->ODR |= 7<<13 ;           //PB13、14、15上拉

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设备使能  
}
博客:http://blog.csdn.net/feilusia
CC2541群(127442605);CC2640群(557278427);
Android群(541462902);STM8/STM32群(164311667);
Linux群(512598061);职场交流群(450154342);
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-10-11 17:01:12 | 显示全部楼层
建议仿真看看切换后的设置,和默认设置,寄存器状态是否完全一样?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

26

主题

280

帖子

1

精华

高级会员

Rank: 4

积分
908
金钱
908
注册时间
2013-8-2
在线时间
279 小时
 楼主| 发表于 2013-10-11 17:24:15 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
运行完这一句,另一个SPI就进入中断了:SPI2->CR1 |= 1<<2  ; //配置为主设备
好像是一瞬间电平不稳定,但我已经加了上拉。
博客:http://blog.csdn.net/feilusia
CC2541群(127442605);CC2640群(557278427);
Android群(541462902);STM8/STM32群(164311667);
Linux群(512598061);职场交流群(450154342);
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-10-11 18:22:44 | 显示全部楼层
这个第一次进中断,貌似是不受控的...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-11 10:14

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表