我们从2011年坚守至今,只想做纯粹的技术论坛,请不要发布和技术无关的话题。  本站有两万多份高大上的PCB和原理图下载,每日更新中,欢迎常回来看看

 找回密码
 立即注册
搜索
查看: 1855|回复: 7

[PCB封装] spi通信内容详细讲解

[复制链接]

1

主题

3

回帖

4

积分

一级逆天

积分
4

终身成就奖

QQ
发表于 2017-7-10 16:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区

您需要 登录 才可以下载或查看,没有账号?立即注册

×
1.简介
这里介绍STM32通过SPI实现对外部SPIFlash的读写功能,其中,SPI作为主设备,SPIFlash作为从设备。为了验证SPIFlash收到的数据是否是STM32通过SPI发送给它的数据,我们将SPIFlash读取的数据显示在屏幕上(TFTLCD)。
1.1 SPI简介
SPI就是串行外围设备接口,它是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,这四根线的定义分别是:
MISO:主设备数据输入,从设备数据输出;
MOSI:主设备数据输出,从设备数据输入;
SCLK:时钟信号,由主设备产生;
CS:从设备片选信号,由主设备控制;
SPI为了和外设进行数据交换,根据外设工作要求,其输出串行同步时钟极性和相位可以进行配置,时钟极性(CPOL)对传输协议没有重大的影响。如果CPOL=0,串行同步时钟的空闲状态为低电平;如果CPOL=1,串行同步时钟的空闲状态为高电平。时钟相位(CPHA)能够配置用于选择两种不同的传输协议之一进行数据传输。如果CPHA=0,在串行同步时钟的第一个跳变沿(上升或下降)数据被采样;如果CPHA=1,在串行同步时钟的第二个跳变沿(上升或下降)数据被采样。SPI总线数据传输时序图如下图:

                               
登录/注册后可看大图

数据传输过程如下:SCK的第一个时钟周期在时钟的前沿采样数据(上升沿,第一个时钟沿钟沿),在时钟的后沿输出数据(下降沿,第二个时钟沿)。首先来看主器件,主器件的输出口MOSI输出的数据,在时钟的前沿被从器件采样,那主器件是在何时刻输出数据的呢?数据的输出时刻实际上在SCK信号有效以前,比SCK的上升沿还要早半个时钟周期。数据的输出时刻与SSEL信号没有关系。再来看从器件,主器件的输入口MISO同样是在时钟的前沿采样从器件输出的数据,那从器件又是在何时刻输出数据的呢?从器件是在SSEL信号有效后,立即输出数据,尽管此时SCK信号还没有起效。
1.2 SPI Flash简介
SPIFlash以W25Q64为例进行介绍,W25Q64将8M的容量分为128个块(Block),每个块大小为64K字节,每个块又分为16个扇区(Sector),每个扇区4K个字节。W25Q64的最少擦除单位为一个扇区,也就是每次必须擦除4K个字节。这样我们需要给W25Q64 开辟一个至少4K的缓存区。
SPIFlash的写入数据基本过程是:先获得首地址(WriteAddr)所在的扇区,并计算在扇区内的偏移,然后判断要写入的数据长度是否超过本扇区所剩下的长度,如果不超过,再先看看是否要擦除,如果不要,则直接写入数据即可,如果要则读出整个扇区,在偏移处开始写入指定长度的数据,然后擦除这个扇区,再一次性写入。当所需要写入的数据长度超过一个扇区的长度的时候,我们先按照前面的步骤把扇区剩余部分写完,再在新扇区内执行同样的操作,如此循环,直到写入结束。
2. 硬件设计
我们利用STM32自带的SPI和SPIFlash通信,通信过程中SPI是主设备,SPIFlash是从设备,硬件设计如下图所示:

                               
登录/注册后可看大图


3. 软件设计
3.1 SPI软件设计
(1)使能SPI时钟,且定义相关引脚的复用功能;
使能SPI时钟,且配置SPI占用的几个GPIO引脚的功能为复用功能;SPI和STM32共用一个时钟,可以对SPI频率进行设置,SPI时钟通过APB2进行分频,分频系数可以是2、4、8等,最低是256分频。
(2)设置SPI工作参数
主要对SPI以下几个工作参数进行设置:
设置SPI的通信方式,可以是全双工、半双工等方式;
设置SPI的主从模式;
设置SPI传输方式:8位传输还是16位传输;
设置SPI的时钟极性;
设置SPI的时钟相位;
设置SPI的分频系数;
设置SPI的CRC校验多项式;
(3)使能SPI外设;
(4)SPI发送接收数据;
(5)查看SPI传输状态;
3.2 SPI Flash软件设计
(1)SPIFlash读出数据;读取数据过程:由于W25Q64 支持以任意地址(但是不能超过W25Q64的地址范围)开始读取数据,在发送24 位地址之后,程序就可以开始循环读数据了,其地址会自动增加的,不过要注意,不能读的数据超过了W25Q64的地址范围。
(2)SPIFlash写入数据;写入数据基本过程:先获得首地址(WriteAddr)所在的扇区,并计算在扇区内的偏移,然后判断要写入的数据长度是否超过本扇区所剩下的长度,如果不超过,再先看看是否要擦除,如果不要,则直接写入数据即可,如果要则读出整个扇区,在偏移处开始写入指定长度的数据,然后擦除这个扇区,再一次性写入。当所需要写入的数据长度超过一个扇区的长度的时候,我们先按照前面的步骤把扇区剩余部分写完,再在新扇区内执行同样的操作,如此循环,直到写入结束。

11

主题

854

回帖

730

积分

二级逆天

积分
730

社区居民终身成就奖优秀斑竹奖

QQ
发表于 2017-7-10 18:59 | 显示全部楼层
回复

使用道具 举报

  • 打卡等级:初入少年
  • 打卡总天数:1
  • 打卡月天数:0
  • 打卡总奖励:2
  • 最近打卡:2025-03-06 18:53:10

3

主题

2904

回帖

4861

积分

二级逆天

积分
4861

社区居民忠实会员最爱沙发终身成就奖优秀斑竹奖

QQ
发表于 2017-7-10 19:59 | 显示全部楼层
回复

使用道具 举报

  • 打卡等级:以坛为家I
  • 打卡总天数:78
  • 打卡月天数:0
  • 打卡总奖励:262
  • 最近打卡:2026-04-21 17:03:37

6

主题

3753

回帖

3815

积分

二级逆天

积分
3815

终身成就奖社区居民优秀斑竹奖

QQ
发表于 2017-7-10 20:37 | 显示全部楼层
谢谢分享spi通信内容详细讲解
回复

使用道具 举报

2

主题

1785

回帖

4266

积分

二级逆天

积分
4266

社区居民终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖

QQ
发表于 2017-7-11 06:46 | 显示全部楼层
回复

使用道具 举报

2

主题

4633

回帖

1万

积分

三级逆天

-

积分
13162

忠实会员社区居民社区劳模原创达人最爱沙发终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖金点子奖

QQ
发表于 2017-7-11 08:19 | 显示全部楼层
不错的资料,图文并茂。
-
回复

使用道具 举报

0

主题

121

回帖

256

积分

二级逆天

积分
256

终身成就奖

QQ
发表于 2017-7-11 09:00 | 显示全部楼层
回复

使用道具 举报

27

主题

237

回帖

887

积分

PADS-170802高级班

积分
887

终身成就奖

QQ
发表于 2017-7-11 09:09 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则

Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请举报投诉

本站所有资料仅限参考学习交流,PCB原理图源码等所有资料不保证准确没问题,请不要用作生产。否则后果自负。

闽公网安备35062302000276号 | 闽ICP备2024076463号-1 | 论坛技术支持QQ群171867948 | 论坛问题,充值问题请联系QQ1308068381

平平安安
TOP
快速回复 返回顶部 返回列表