OpenEdv-开源电子网

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

有没有人研究STM32的SPI啊???

[复制链接]

6

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2013-7-28
在线时间
0 小时
发表于 2013-8-10 16:43:22 | 显示全部楼层 |阅读模式

1、STM32怎么配置单工通信啊?参考手册上写配置SPI的单工通信。可是库函数里面只有这四个选项啊!a.双线全双工  b.双线单向接收 c.单线双向接收 d.单线双向发送 

 

2、 1条时钟和1条单向数据线(BIDIMODE=0) 
在这个模式下,SPI模块可以或者作为只发送,或者作为只接收。
● 只发送模式类似于全双工模式(BIDIMODE=0,RXONLY=0):数据在发送引脚(主模式时是
MOSI、从模式时是MISO)上传输,而接收引脚(主模式时是MISO、从模式时是MOSI)可以
作为通用的I/O使用。此时,软件不必理会接收缓冲器中的数据(如果读出数据寄存器,它不
包含任何接收数据)。
● 在只接收模式,可以通过设置SPI_CR2寄存器的RXONLY位而关闭SPI的输出功能;此时,
发送引脚(主模式时是MOSI、从模式时是MISO)被释放,可以作为其它功能使用。
配置并使能SPI模块为只接收模式的方式是:
● 在主模式时,一旦使能SPI,通信立即启动,当清除SPE位时立即停止当前的接收。在此模
式下,不必读取BSY标志,在SPI通信期间这个标志始终为’1’。
● 在从模式时,只要NSS被拉低(或在NSS软件模式时,SSI位为’0’)同时SCK有时钟脉冲,
SPI就一直在接收

 

这个觉得更加难理解,这个到底怎么连线的。就能实现数据在发送引脚(主模式时是
MOSI、从模式时是MISO)上传输,而接收引脚(主模式时是MISO、从模式时是MOSI)可以
作为通用的I/O使用。


这个功能了?


3、SPI总线不是收发同时进行的吗?那如何实现主模式下只接收呢?这样的话,从机的时钟信号哪里来?如果是主设备给的,那主设备应该会发送数据给从何设备啊,这还叫主模式下只接收吗?


4、主模式下开始传输
● 全双工模式(BIDIMODE=0并且RXONLY=0)
─ 当写入数据到SPI_DR寄存器(发送缓冲器)后,传输开始;
─ 在传送第一位数据的同时,数据被并行地从发送缓冲器传送到8位的移位寄存器中,
然后按顺序被串行地移位送到MOSI引脚上;
─ 与此同时,在MISO引脚上接收到的数据,按顺序被串行地移位进入8位的移位寄存器
中,然后被并行地传送到SPI_DR寄存器(接收缓冲器)中。
● 单向的只接收模式(BIDIMODE=0并且RXONLY=1)
─SPE=1时,传输开始;
─ 只有接收器被激活,在MISO引脚上接收到的数据,按顺序被串行地移位进入8位的移
位寄存器中,然后被并行地传送到SPI_DR寄存器(接收缓冲器)中。
● 双向模式,发送时(BIDIMODE=1并且BIDIOE=1)
─ 当写入数据到SPI_DR寄存器(发送缓冲器)后,传输开始;
─ 在传送第一位数据的同时,数据被并行地从发送缓冲器传送到8位的移位寄存器中,
然后按顺序被串行地移位送到MOSI引脚上;
─ 不接收数据。
● 双向模式,接收时(BIDIMODE=1并且BIDIOE=0)
─SPE=1并且BIDIOE=0时,传输开始;
─ 在MOSI引脚上接收到的数据,按顺序被串行地移位进入8位的移位寄存器中,然后被
并行地传送到SPI_DR寄存器(接收缓冲器)中。
─ 不激活发送器,没有数据被串行地送到MOSI引脚上


这个主模式下的这些各种模式,是不是指主设备下的这些各种模式?就是说 主模式=主设备?手册后面的那个从模式是不是也是这样的啊?

从模式下开始传输
● 全双工模式(BIDIMODE=0并且RXONLY=0)
─ 当从设备接收到时钟信号并且第一个数据位出现在它的MOSI时,数据传输开始,随
后的数据位依次移动进入移位寄存器;
─ 与此同时,在传输第一个数据位时,发送缓冲器中的数据被并行地传送到8位的移位
寄存器,随后被串行地发送到MISO引脚上。软件必须保证在SPI主设备开始数据传
输之前在发送寄存器中写入要发送的数据。
● 单向的只接收模式(BIDIMODE=0并且RXONLY=1)
─ 当从设备接收到时钟信号并且第一个数据位出现在它的MOSI时,数据传输开始,随
后数据位依次移动进入移位寄存器;
─ 不启动发送器,没有数据被串行地传送到MISO引脚上。
● 双向模式,发送时(BIDIMODE=1并且BIDIOE=1)
─ 当从设备接收到时钟信号并且发送缓冲器中的第一个数据位被传送到MISO引脚上的
时候,数据传输开始;
─ 在第一个数据位被传送到MISO引脚上的同时,发送缓冲器中要发送的数据被平行地
传送到8位的移位寄存器中,随后被串行地发送到MISO引脚上。软件必须保证在SPI
主设备开始数据传输之前在发送寄存器中写入要发送的数据;
─ 不接收数据。
● 双向模式,接收时(BIDIMODE=1并且BIDIOE=0)
─ 当从设备接收到时钟信号并且第一个数据位出现在它的MOSI时,数据传输开始;
─ 从MISO引脚上接收到的数据被串行地传送到8位的移位寄存器中,然后被平行地传送
到SPI_DR寄存器(接收缓冲器);
─ 不启动发送器,没有数据被串行地传送到MISO引脚上。


5、主或从模式下(BIDIMODE=0并且RXONLY=0)全双工发送和接收过程模式  这个配置的寄存器,是不是主设备和从设备都是配置一样的值呢?

 

6、手册465页和后面两页上说的 主或从模式下(BIDIMODE=0并且RXONLY=0)全双工发送和接收过程模式 只发送过程(BIDIMODE=0并且RXONLY=0)  这两个寄存器的值配置都一样的怎么区别是哪种模式啊? 不止这里,前面的好几个模式都是,寄存器的值一样的,可是模式怎么就不一样呢?  

 

我想好几天了,还没明白,所以就上来问各位高手 大虾的,非伸手党和不经过思考就问的! 我想,理解了这些,后面写程序应该比较顺。所以蒙教各位赐教了!!

 

原子哥,你怎么看???

 

本人新手,有什么不妥之处,望各位大虾见谅!!谢谢了!!

 


 

STM32学习交流群 295023494
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2013-7-28
在线时间
0 小时
 楼主| 发表于 2013-8-10 17:15:21 | 显示全部楼层
奉上linux学习资料:;http://pan.baidu.com/share/link?shareid=1209050304&uk=3221341572#dir/path=%2F%E5%AD%A6%E4%B9%A0%2Flinux%E5%AD%A6%E4%B9%A0
STM32学习交流群 295023494
回复 支持 反对

使用道具 举报

6

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2013-7-28
在线时间
0 小时
 楼主| 发表于 2013-8-10 17:23:27 | 显示全部楼层
资料

文件系统讲解.pdf

1.47 MB, 下载次数: 706

Linux应用开发班答疑汇总.pdf

476.84 KB, 下载次数: 641

ARM系统进阶班答疑汇总.pdf

438.63 KB, 下载次数: 638

回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2013-8-10 18:06:40 | 显示全部楼层
1,STM32确实支持单工通信,配置在STM32参考手册,其实都已经给出了,如下图:

至于库函数怎么设置,我就不清楚了,呵呵.用寄存器是很好设置了.


2,我不知道你要什么样的效果.

3,看了第一个的图,就知道了,所谓的单工通信也是要2根线的,不是一根线!!!2根线,一根产生时钟,一根用来传输数据.

4,主模式从模式都是以STM32自己为中心来说的,比如主模式,那么就是说STM32作为主机,外设做从机.从模式就是stm32做从机,外设做主机.

5,你外设接什么东西?外设一般不需要你去配置啊...除非你是2个MCU互相通信.

6,这两个配置是一样,只是具体操作有点区别,手册也说了操作上的区别.  这个你可以自己实际去测试下吧.













我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

6

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2013-7-28
在线时间
0 小时
 楼主| 发表于 2013-8-10 20:37:11 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------

1、这个配置寄存器应该能实现。

2、我想实现主模式只接收或者主模式只发送,硬件应该怎么连接呢?比如说,我想实现主模式只发送,是不是我的主机的MOSI就和从机的MISO连接在一起呢,数据只能从主机发送到从机,而不能从机发到主机?主机的MISO和从机的MOSI就可以当普通的IO口使用了。???

3、我就是不太明白,数据传输和时钟传输是不是独立的。我在网上看到的资料说,只有当主机向从机发送数据时,时钟信号才产生,如果主机不向从机发送数据,从机就没有时钟信号。不知道是不是??所以导致很多问题了!!按你的说法,数据传输和时钟信号线是独立的,对吧?

4、这个问题解决了!


5、我们现在讨论的就假设都是两个MCU之间的通信吧!

6、这个还得实际操作才知道。待定吧!!


非常感谢原子哥!!谢谢!!!@—@!!
STM32学习交流群 295023494
回复 支持 反对

使用道具 举报

6

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2013-7-28
在线时间
0 小时
 楼主| 发表于 2013-8-10 20:46:38 | 显示全部楼层
这资料在上面的网址上都有的!要的同志也一到那里下。网盘地址的!

【批量下载】SDK-MOTION等.zip

31.58 MB, 下载次数: 298

【批量下载】Linux C编程一站式学习等.zip

5.84 MB, 下载次数: 246

【批量下载】SDK-MP3等.zip

41.63 MB, 下载次数: 306

【批量下载】SDK-H264等.zip

19.84 MB, 下载次数: 237

STM32学习交流群 295023494
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2013-8-10 21:42:53 | 显示全部楼层
回复【5楼】1874548238:
---------------------------------
2,应该是你说的那样.自己写代码测试吧,我没测试过,呵呵.
3,是的,所有的通信都是由主机发起的,所以主机必须提供时钟.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

6

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2013-7-28
在线时间
0 小时
 楼主| 发表于 2013-8-10 21:53:46 | 显示全部楼层
回复【7楼】正点原子:
-------------------------
恩恩 谢谢原子哥了!!!后面积累一些经验后  应该会比较好理解的。多测试看看吧!!非常感谢!!
STM32学习交流群 295023494
回复 支持 反对

使用道具 举报

4

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2013-7-28
在线时间
0 小时
发表于 2013-11-4 22:06:30 | 显示全部楼层
回复【8楼】1874548238:

回复【7楼】正点原子:
-------------------------
恩恩 谢谢原子哥了!!!后面积累一些经验后  应该会比较好理解的。多测试看看吧!!非常感谢!!

---------------------------------
楼主,你测试成功没有啊,我能做到单线双工模式主机SP1给从机SPI2发送数据,但是当spi2给spi1发的时候数据就是乱的了。当然如果用全双工模式,互相发数据是没有问题的
回复 支持 反对

使用道具 举报

6

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2013-7-28
在线时间
0 小时
 楼主| 发表于 2013-11-8 15:18:51 | 显示全部楼层
回复【9楼】yang4469:
---------------------------------
这个问题我也困绕着啊 兄弟
STM32学习交流群 295023494
回复 支持 反对

使用道具 举报

4

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2013-7-28
在线时间
0 小时
发表于 2013-11-19 14:57:37 | 显示全部楼层
回复【10楼】1874548238:

回复【9楼】yang4469:
---------------------------------
这个问题我也困绕着啊 兄弟

---------------------------------
我已经解决了,你现在是什么问题嘛,我是速度过快,通信线上数据过冲的问题,加了个电阻,问题解决了
回复 支持 反对

使用道具 举报

25

主题

139

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-5-10
在线时间
0 小时
发表于 2014-5-28 15:55:16 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
原子哥,所有的通信都是由主机发起的,所以主机必须提供时钟.我知道是主机提供时钟,可是时钟线和数据线是两根啊,时钟线一直由主机在产生吧,主机不发送数据,时钟线一直有信号吧?我测试时候,先是从机发送数据,然后才主机发送数据,结果是好使的。是意外还是我上面理解的那样呢?谢谢哥
愈挫愈勇
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2014-5-28 23:22:36 | 显示全部楼层
回复【12楼】非常完美:
---------------------------------
主机不发数据,时钟线是没波形的...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

25

主题

139

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-5-10
在线时间
0 小时
发表于 2014-5-28 23:53:07 | 显示全部楼层
回复【13楼】正点原子:
---------------------------------

/* 设置 SPI2 为主机*/
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_Init(SPI2 , &SPI_InitStructure);
SPI_NSSInternalSoftwareConfig(SPI2,SPI_NSSInternalSoft_Set);
 
/* 设置 SPI1 为从机*/
SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;
SPI_Init(SPI1 , &SPI_InitStructure);
// SPI_NSSInternalSoftwareConfig(SPI1,SPI_NSSInternalSoft_Reset);


while(Tx_Idx < BufferSize)

/* 等待 SPI2 发送缓冲空 */ 
while(SPI_I2S_GetFlagStatus(SPI2 , SPI_I2S_FLAG_TXE) == RESET);
/* SPI1 发送数据 */ 
SPI_I2S_SendData(SPI1 , SPI1_Buffer_Tx[Tx_Idx]);
/* SPI2 发送数据 */ 
SPI_I2S_SendData(SPI2 , SPI2_Buffer_Tx[Tx_Idx++]);
}
然后是好使的
愈挫愈勇
回复 支持 反对

使用道具 举报

25

主题

139

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2014-5-10
在线时间
0 小时
发表于 2014-7-8 22:47:42 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
原子哥,我按照双向单工的配置了,结果接收错误。就是SPI1的MOSI----SPI2的MISO
然后我用SPI1的MOSI-----SPI2的MOSI,可以实现双向单工。跟参考手册不一样了, 是上面翻译错了吗
愈挫愈勇
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2014-7-8 22:57:45 | 显示全部楼层
回复【15楼】非常完美:
---------------------------------
这个不太清楚.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

8

主题

193

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
303
金钱
303
注册时间
2012-12-19
在线时间
16 小时
发表于 2014-9-5 14:55:45 | 显示全部楼层
从机数据写到寄存器后实际上数据是不发送的,因为他没有时钟;
他等待主机时钟,等主机发送数据的时候从机的数据才能发出去。
回复 支持 反对

使用道具 举报

1

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2014-8-6
在线时间
1 小时
发表于 2015-2-5 11:44:18 | 显示全部楼层
回复【11楼】yang4469:
---------------------------------
哥们,你在哪跟线上加的电阻啊?加的电阻有什么要求吗?
回复 支持 反对

使用道具 举报

20

主题

118

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
304
金钱
304
注册时间
2014-3-23
在线时间
22 小时
发表于 2016-3-15 20:49:25 | 显示全部楼层
非常完美 发表于 2014-7-8 22:47
回复【4楼】正点原子:
---------------------------------
原子哥,我按照双向单工的配置了,结果接收错误 ...

我想问一下片选CS就不个用管了呗
回复 支持 反对

使用道具 举报

3

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2016-8-22
在线时间
11 小时
发表于 2016-10-11 22:14:42 | 显示全部楼层
在主模式下启动通信序列  单向只接收模式( BIDIMODE=0 且 RXONLY=1)和单向只接收模式下( BIDIMODE=0 且 RXONLY=1)到底有什么区别呢?
回复 支持 反对

使用道具 举报

119

主题

439

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1185
金钱
1185
注册时间
2015-9-18
在线时间
422 小时
发表于 2016-10-11 23:24:25 | 显示全部楼层
单看你把问题描述的这么详细,还这么工整,就值得很多人学习~
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-24 02:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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