OpenEdv-开源电子网

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

SPI 两个STM32单向通讯

[复制链接]

35

主题

152

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
312
金钱
312
注册时间
2013-6-26
在线时间
0 小时
发表于 2013-8-21 12:29:36 | 显示全部楼层 |阅读模式
我有两块一模一样的开发板,想练习SPI通讯。我知道SPI有单向只读模式(BIDIMODE=0并且RXONLY=1) ,我想能不能按图那样,让其中一个STM32只写(作为主机),另一个只读呢(作为从机)?如果可以,那么我觉得:从机的配置就按库函数上的那样写,问题是主机的配置,因为没有单向只写模式可选,所以我就想,是不是直接选择双线双工模式就好了?
上图:




不知道有没有朋友做过类似的尝试,即使没有也希望大家给点意见。做来纯属练习
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

35

主题

152

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
312
金钱
312
注册时间
2013-6-26
在线时间
0 小时
 楼主| 发表于 2013-8-21 15:50:51 | 显示全部楼层
我知道这个帖子快要沉了,所以来悼念一下。我的想法很简单,主机板上检测按键,看看那个按键被按下过,使用IO中断,得到一个数字后,传送给从机(这一切都发生在IO中断里面),然后从机通过得到的值,点亮对应的灯。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-21 16:07:39 | 显示全部楼层
没试过,楼主可以自己试试嘛,有结果了,分享给大家。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

26

主题

280

帖子

1

精华

高级会员

Rank: 4

积分
908
金钱
908
注册时间
2013-8-2
在线时间
279 小时
发表于 2013-8-21 16:22:25 | 显示全部楼层
给你参考下我之前写的。主从都是调用这个函数,可随时变更主从关系。
下面这句放头文件里。
typedef enum {spi1_mode_slave = 0, spi1_mode_master = !spi1_mode_slave} SPI1Status;
/*******************************************************************************
* Function Name: SPI1_Configuration
* Description : SPI模块包括相关IO口的配置
* Input       : spi1_mode:spi1_mode_master(主机),spi1_mode_slave(从机)
* Output      : None
* Return      : None
*******************************************************************************/
void SPI1_Configuration( SPI1Status spi1_mode )
{
RCC->APB2ENR |= 1<<2  ;        //PORTA时钟使能   
RCC->APB2ENR |= 1<<12 ;        //SPI1时钟使能 
RCC->APB2ENR |= 1<<0 ;         //复用功能时钟使能 
GPIOA->CRL &= 0X000FFFFF ; 
GPIOA->CRL |= 0XBBB00000 ;    //一定要用推挽加上拉电阻,否则数据会有错!   
GPIOA->ODR |= 7<<5 ;           //PA567上拉

SPI1->CR1 = 0x0000 ;           //SPI1->CR1复位
SPI1->CR1 |= 1<<9  ;           //nss软件管理
SPI1->CR1 |= 0<<11 ;           //数据格式:8bit
SPI1->CR1 |= 1<<1  ;           //CPOL=1:空闲模式下SCK为高电平 
SPI1->CR1 |= 1<<0  ;           //CPHA=1:数据采样从第二个时钟沿开始  
SPI1->CR1 |= 2<<3  ;           //Fsck=Fcpu/8
SPI1->CR1 |= 0<<7  ;           //MSBfirst 
if(spi1_mode==spi1_mode_master) //若为主机模式
{
SPI1->CR1 |= 0<<10 ;          //RXONLY:全双工模式
SPI1->CR1 |= 0<<15 ;          //BIDIMODE:双线双向
SPI1->CR1 |= 1<<8  ; //nss高电平 
SPI1->CR1 |= 1<<2  ; //SPI主机
SPI1->CR2 |= 1<<1  ;        //发送缓冲区DMA使能
}
else if(spi1_mode==spi1_mode_slave) //从机模式
{
SPI1->CR1 |= 1<<10 ;          //RXONLY:只接收模式
SPI1->CR1 |= 0<<15 ;          //BIDIMODE:双线双向
SPI1->CR1 &= ~(1<<8)  ;      //nss低电平 
SPI1->CR1 &= ~(1<<2)  ;      //SPI从机
SPI1->CR2 |= 1<<0  ;       //接收缓冲区DMA使能
SPI1->CR2 |= 1<<6  ;          //SPI接收中断使能
}
SPI1->CR1 |= 1<<6  ;           //SPI设备使能  
}
博客:http://blog.csdn.net/feilusia
CC2541群(127442605);CC2640群(557278427);
Android群(541462902);STM8/STM32群(164311667);
Linux群(512598061);职场交流群(450154342);
回复 支持 反对

使用道具 举报

35

主题

152

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
312
金钱
312
注册时间
2013-6-26
在线时间
0 小时
 楼主| 发表于 2013-8-21 16:34:30 | 显示全部楼层
回复【4楼】feilusia:
---------------------------------
我是库函数党,但是不管如何还是先谢谢
回复 支持 反对

使用道具 举报

35

主题

152

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
312
金钱
312
注册时间
2013-6-26
在线时间
0 小时
 楼主| 发表于 2013-8-21 16:49:01 | 显示全部楼层
楼主我现在把主从板断开了,先去看看主机板到底有没有发出什么东西来。通过示波器查看SCK和MOSI(事实上楼主已经连主从机全都设置为内部软件管理了(SPI_NSS_Soft),根据我对文档说明的理解,这时主从机都不需要外部NSS,完全由程序决定主从模式。所以实际上主从板的连接只有4条线:VCC  GND MOSI SCK。

言归正传,断开后,查看主机的MOSI SCK,通过示波器,至少能看到波形,尽管我必须多按几次按键才能在示波器上看到。波形分析与程序配置相符。附:CPOL可以决定SCK空闲时的状态,即高低电平,而从示波器波形得出个人结论,MOSI在空闲时状态与最后发送字节有关,如在:
 SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
 SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
下,当发送0x01,则MOSI最后电平为高,发0x02,则最后电平为低。尽管这个结论没什么用。。。。

问题是,再连上后,从机还是没反应。呵呵呵呵呵呵呵呵(哭了)
附从机配置:
 SPI_InitTypeDef SPI_InitStructure;
 SPI_InitStructure.SPI_Direction =SPI_Direction_2Lines_RxOnly;
 SPI_InitStructure.SPI_Mode =SPI_Mode_Slave ; 
 SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; 
 SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
 SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
 SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
 SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128; //据说这个没用,还是配成和主机一样 36M/128
 SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
 SPI_InitStructure.SPI_CRCPolynomial = 7;
 SPI_Init(SPI2, &SPI_InitStructure);
 
 SPI_CalculateCRC(SPI2,DISABLE);//顺便失能CRC
附主机配置:
 SPI_InitTypeDef SPI_InitStructure;
 SPI_InitStructure.SPI_Direction =SPI_Direction_2Lines_FullDuplex
 SPI_InitStructure.SPI_Mode =SPI_Mode_Master; 
 SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; 
 SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
 SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
 SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; 
 SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //72M/256
 SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
 SPI_InitStructure.SPI_CRCPolynomial = 7;
 SPI_Init(SPI1, &SPI_InitStructure);
回复 支持 反对

使用道具 举报

26

主题

280

帖子

1

精华

高级会员

Rank: 4

积分
908
金钱
908
注册时间
2013-8-2
在线时间
279 小时
发表于 2013-8-21 17:13:18 | 显示全部楼层
你把你的引脚都设置为复用推挽输出,然后每个都接10K上拉电阻,再试试。
博客:http://blog.csdn.net/feilusia
CC2541群(127442605);CC2640群(557278427);
Android群(541462902);STM8/STM32群(164311667);
Linux群(512598061);职场交流群(450154342);
回复 支持 反对

使用道具 举报

35

主题

152

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
312
金钱
312
注册时间
2013-6-26
在线时间
0 小时
 楼主| 发表于 2013-8-21 17:28:46 | 显示全部楼层
装逼被雷劈,我为什么非要是用什么SPI2呢?尽管还没有成功,我突然发现开发板上是没有SPI2的。。。呵呵呵呵呵呵呵呵呵呵
回复 支持 反对

使用道具 举报

35

主题

152

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
312
金钱
312
注册时间
2013-6-26
在线时间
0 小时
 楼主| 发表于 2013-8-21 17:42:25 | 显示全部楼层
表示轻松成功了
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-21 21:51:13 | 显示全部楼层
回复【9楼】烂泥桑:
---------------------------------
你用的什么开发板啊?
STM32随便哪个型号都有2个SPI吧...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

35

主题

152

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
312
金钱
312
注册时间
2013-6-26
在线时间
0 小时
 楼主| 发表于 2013-8-22 09:07:53 | 显示全部楼层
 


上图
回复 支持 反对

使用道具 举报

35

主题

152

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
312
金钱
312
注册时间
2013-6-26
在线时间
0 小时
 楼主| 发表于 2013-8-22 09:09:38 | 显示全部楼层
回复【10楼】正点原子:
---------------------------------
我刚好是第一列,我那个所谓的开发板不是买回来的,所以功能什么的完全没有照顾到学习。。。只能它有什么就利用什么来学。。。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-22 10:06:46 | 显示全部楼层
回复【12楼】烂泥桑:
---------------------------------
还真是,呵呵。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-17 01:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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