发新帖我要提问
12
返回列表
打印
[STM32F0]

STM32F030 Nucleo

[复制链接]
楼主: 初级工程渣
手机看帖
扫描二维码
随时随地手机跟帖
21
初级工程渣|  楼主 | 2022-3-31 17:09 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
SPI主机-从机单工通信:

在参考手册中有如下图的一段话:


使用特权

评论回复
22
初级工程渣|  楼主 | 2022-3-31 17:09 | 只看该作者
讲述了SPI可以工作在单工模式下雨设备通信!和它的配置!那么说明时候用到这种配置的通信呢??不知道各位有木有用过74HC595,74HC573等等这些锁存器呢或者是SPILCD/OLED呢?没错!对于这些设备或者芯片,单片机没有什么数据要从他们那里读取的!只需要向他们写数据就好!所以在这种情况下就需要单工SPI通信了!

使用特权

评论回复
23
初级工程渣|  楼主 | 2022-3-31 17:10 | 只看该作者
看下图:


接口就如上了!嘿嘿!但是!但是一定要看下面的标注1、2、3和Note啊,别傻乎乎的出问题了。

使用特权

评论回复
24
初级工程渣|  楼主 | 2022-3-31 17:11 | 只看该作者
SPI主机-多从机通信:

看见上图没?知道NSS是干啥的了吧?SPI的多机通信就是这样了!特别注意粉色框的NSS的接法和用法!很重要哦!其他的一切都是按照SPI标准协议来通信的!就不多废话了。嘿嘿!

OK!SPI的基本的协议!就是这样了!哈哈!在参考手册上还分别对CLK、NSS、RxFIFO/TxFIFO、DMA等等的用法!这个就自己去看了!基本的协议将清楚了!那就应该做做实验,谢谢代码了。嘿嘿!

还有一点解释就是,为毛不讲解寄存器呢??嘿嘿!我将反问道,为毛样讲寄存器呢?难道我会将的有手册的好,有手册的权威??这是不可能的!而且,学到了这一步,对怎么看寄存器资料介绍和操作寄存器应该是没问题了的!嘿嘿!

我刚好有64M的SPIFlash,嘿嘿!这个可不能浪费喽!哈哈!那咱就先玩Flash吧!用它来体验一下SPI通信!嘿嘿!

Flash型号:W25Q64 华邦公司的产品喽!

Flash大小:64M Bit == 8M Byte,空间可是好大哦!有8M Byte

主控MCU:STM32F030R8T6

咱就通过MCU的硬件SPI资源与SPIFlash进行通信,实现数据的存储和读取。

使用特权

评论回复
25
初级工程渣|  楼主 | 2022-3-31 17:13 | 只看该作者
要干下面这么几件事:

1.查阅W25Q64 数据手册Datasheet,获取其SPI的时钟相位和极性。这可是通信的关键哦!



看见没!SPIFlash支持两种SPI标准通信模式,分别是

SPI0:CPOL=0,CPHA=0

SPI3:CPOL=1,CPHA=1

OK!想要的信息得到了!

使用特权

评论回复
26
初级工程渣|  楼主 | 2022-3-31 17:14 | 只看该作者
2.选择和配置MCU SPI资源,在这里咱就用SPI1了!如下图:


有的选择!这是好事啊!意味着有备胎哇!哈哈哈!那么我们到底该用哪一组呢?查看了一下Nucleo板卡的原理图,得知PA5引脚是用来驱动发光二极管LD2的,那就意味着如果咱选用第1组,那么LD2就没得玩了!这样就不好玩了!所以咋还是选择第二组吧!嘿嘿!记住资源选择的思路哦!!!一切都要考虑到!

咦!是不是感觉有哪里不对??第二组为毛没有硬件NSS资源呢??这个咋玩啊??嘿嘿!其实那,在这里咱是和SPIFlash通信,那么就是以为着STM32F030是作为主机Master来使用的,所以,嘿嘿!NSS任意选择一个GPIO口即可。哈哈!在这里咱根据Nucleo板卡的布局和考虑到功能的复用等等,选择了GPIOA10口作为NSS了。

使用特权

评论回复
27
初级工程渣|  楼主 | 2022-3-31 17:14 | 只看该作者
3.硬件连接,如下图:


下面就该贴程序了!嘿嘿!

使用特权

评论回复
28
初级工程渣|  楼主 | 2022-3-31 17:15 | 只看该作者
SPI的初始化配置:

使用特权

评论回复
29
初级工程渣|  楼主 | 2022-3-31 17:16 | 只看该作者

使用特权

评论回复
30
初级工程渣|  楼主 | 2022-3-31 17:16 | 只看该作者
解释:

1.打开SPI1的时钟喽!不理解为毛是APB2的话,没关系,两种方法(1)看时钟树(2)查看stm32f10x_rcc.c文件!找到RCC_APB2Periph_SPI1即可!嘿嘿!

使用特权

评论回复
31
初级工程渣|  楼主 | 2022-3-31 17:17 | 只看该作者
2.打开GPIO端口的复用功能,这个从函数源码来讲应该是很好理解的!函数源码参数说明如下:

使用特权

评论回复
32
初级工程渣|  楼主 | 2022-3-31 17:17 | 只看该作者
问题就来了!你咋知道我们所用的资源对应的到时是哪一个GPIO_AF_x?比日说SPI1从函数说明来说可能是GPIO_AF_0也可能是GPIO_AF_1,这个咋玩呢??还是一句话,在参考手册或者数据手册Datasheet上找,肯定能找到。没错,就是在Datasheet上找到了!如下图:

看见了没??对应的是AF0啊啊啊啊啊啊!所以就是GPIO_AF_0。嘿嘿!多么简单的领悟哇!

使用特权

评论回复
33
初级工程渣|  楼主 | 2022-3-31 17:18 | 只看该作者
3.就是硬件SPI的基本配置了,嘿嘿!不管他!反正,咱只要配置成:全双工通信(主要参数宏的2Lines(两线)是指两根数据线)、数据长度8Bit、CPOL=1,CPHA=1(用模式3)、NSS由软件控制、波特率预分频值为4分频(关于速率也要参看SPIFlash手册,这样才能正确通信)、指定数据传输从MSB位开始(这个一定要参看参考手册)、指定CRC多项式计算因子为7(这个在参考手册中也有详细说明)、最后指定SPI为Master主模式。这样就完成配置了!嘿嘿!

使用特权

评论回复
34
初级工程渣|  楼主 | 2022-3-31 17:19 | 只看该作者
4.启动NSS为软件管理模式,配置FIFO的接收阀值为事件生成的1/4,最后就使能SPI1控制器了。

哈哈!配置过程就这样完了!

使用特权

评论回复
35
初级工程渣|  楼主 | 2022-3-31 17:19 | 只看该作者
既然配置完成了!咱就发送和接收数据喽!这才是最终的目标嘛!哈哈!那就往下看喽!


上面就是读写函数了!四句话解决!是不是很简洁?嘿嘿!肯定是下班等待发送标志空闲,然后再SPI_SendData8()发送数据啦!因为是全双工的嘛,所以每发送出去1bit数据,MCU也会接收到1bit的数据,只是这些事咱不用考虑,因为MCU的SPI控制器已经给咱们干了。哈哈!所以发送了之后,就要该读取了!但是总得等待接收标志位空闲吧!然后读取就返回了!所以,对于SPI的通信,发送数据和读取数据就是同一个函数实现喽!但是,有一点要注意哦,SPI通信接收的数据是上一次的数据,啥意思呢??比如,咱发送一个命令(0x08),spi_data = SPI_SendData8(SPI1,0x08);这是返回的spi_data不是命令0x08所返回的结果数据,所以想要获取命令0x08的返回数据,就要紧接着spi_data = SPI_SendData8(SPI1,0xff);这次才是命令0x08所返回的数据,这一点尤其要注意。

使用特权

评论回复
36
初级工程渣|  楼主 | 2022-3-31 17:20 | 只看该作者
OK!既然配置好了!也可以发送和接收数据了!那SPI的讲解也就完了!嘿嘿!至于其他部分的关于SPIFlash的代码,这就没什么好说的了!见我附的例程吧!具体的实现就要参考SPIFlash的datasheet了。

解释:在这里虽然与SPIFlash通信,但是对SPIFlash的讲解并不大!其实呢,对于SPIFlash的讲解又是一大堆!而且我觉得没必要!因为这与SPI通信无关了,而且SPIFlash的Datasheet将的非常权威了,我们只需要知道SPIFlash是存储数据的存储器,我们用它的目的就是为了存储数据或者存放Demo。这就够 ,至于它的指令,等等每一种SPIFlash都是不尽相同的!没法讲。

使用特权

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

本版积分规则