CH03-07-STM32F40x的SPI通信模块原理.pptx

上传人:春哥&#****71; 文档编号:96596033 上传时间:2024-01-16 格式:PPTX 页数:38 大小:5.99MB
返回 下载 相关 举报
CH03-07-STM32F40x的SPI通信模块原理.pptx_第1页
第1页 / 共38页
CH03-07-STM32F40x的SPI通信模块原理.pptx_第2页
第2页 / 共38页
点击查看更多>>
资源描述

《CH03-07-STM32F40x的SPI通信模块原理.pptx》由会员分享,可在线阅读,更多相关《CH03-07-STM32F40x的SPI通信模块原理.pptx(38页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、嵌入式系统原理与开发教程STM32F40 x的SPI通信模块原理主讲人:赖树明东莞理工学院01SPI总线概述02STM32F40 x的SPI控制器框架03SPI通信模块核心寄存器分析04SPI总线通信示例(W25Q64)0101SPI总线介绍 总线概述总线物理拓扑结构总线通信原理总线特征SPI总线与I2C比较SPI总线介绍 SPI总线概述01SPI(Serial Peripheral Interface)是由Motorola公司开发的串行外围设备接口,是一种高速、全双工、同步的通信总线。标准SPI接口是四线制接口,分别是MOSI(主出从入)、MISO(主入从出)、SCK(时钟线)、CS(片选线

2、),这种接口支持全双工通信。简介主要应用在大容量的EEPROM、串行Flash存储芯片、RTC实时时钟、高速A/D转换器、触摸屏控制器,串行LCD显示屏、数字信号处理器和数字信号解码器等器件。应用SPI总线介绍 SPI总线物理拓扑结构01硬件拓普结构SPI总线支持连接多个从机,通信总是由主机发起,主机通过的CS信号拉低来选择通信的从机进行。相对于I2C通过地址寻找从机,SPI总线依靠片选线去区分从机,因此每增加一个从机,硬件上就会增加多一个I/O口。选中从机后后,主机操作时钟线CLK,每个时钟周期在 MOSI、MISO上传输一位数据,通信完毕后,主机把CS电平拉高,释放与从机的通信。SPI 总

3、线在时序上有四种时序,通过 CPOL(时钟极性)和CPHA(相位)两个要素来决定配置具体某一种时序,后面会进行四种时序特点的介绍。SPI总线介绍 SPI总线通信时序01模式0第一种SPI模式0:CPOL=0,CPHA=0,表示CLK在空闲状态时为低电平,数据在时钟的上升沿采样,在下降沿移位,上图就以MOSI为0XB5,MISO为0XE5为例,采用模式0时数据的传输过程,传输过程如上图所示传输说明SPI总线介绍 SPI总线通信原理01模式1SPI模式1:CPOL=0,CPHA=1,表示CLK在空闲状态时为低电平,数据在时钟的下降沿采样,在上升沿移位,上图就以MOSI为0XB5,MISO为0XE5

4、为例,采用模式1时数据的传输过程,传输过程如上图所示。传输说明SPI总线介绍 SPI总线通信原理01模式2SPI模式2:CPOL=1,CPHA=1,表示CLK在空闲状态时为高电平,数据在时钟的下降沿采样,在上升沿移位,上图以MOSI为0XB5,MISO为0XE5为例,采用模式2时数据的传输过程,传输过程如上图所示。传输说明SPI总线介绍 SPI总线通信原理01模式3SPI模式3:CPOL=1,CPHA=0,表示CLK在空闲状态时为高电平,数据在时钟的上升沿采样,在下降沿移位。上图以MOSI为0XB5,MISO为0XE5为例,采用模式3时数据的传输过程,传输过程如上图所示。传输说明SPI总线介绍

5、 SPI总线特征总结 01SPI 总线硬件拓扑结构是一主多从结构,通过CS信号来决定通信的从机对象。SPI总线数据传输速率:STM32F40 x系列传输速度高达42M/bps(即fPCLK/2);数据传输可以是8位或16位为单位进行数据传输,默认是先发送高位,再发送低位,STM32F40 x 的SPI是可以配置传输的顺序的。主机采哪一种时序模式由从机的时序要求决定,主机通过CPOL(时钟极性)和CPHA(相位)两个要素来配置。SPI接口的CS线是一个普通GPIO功能,对于主机是输出功能,对于从机是输入功能,主机总线上每增加一个从机,CS片选线就增加一根。通过过程:主机通过拉低CS线来选择从机,

6、然后通过CLK时钟线输出时钟信号,每个时钟MOSI线发送1个二进制位,同时MISO线接收1个二进制位。重要特征SPI总线介绍 SPI总线与I2C比较01特征对比SPI总线与总线与I2C总线比较总线比较功能说明SPI总线I2C总线主从设备片选设备地址数据格式数据格式不固定起始条件、数据位、应答位、停止条件总线接口MOSI、MISO、SCK、CS、GNDSDA、SCL、GND通信方式同步串行全双工同步串行半双工通信速度一般25M以上100K、400K、3.4M0202STM32F40 x的SPI控制器框架控制器框架STM32F40 x的SPI控制器框架02移位寄存器中的数据是直接从发送缓冲区来的,

7、同时,移位寄存器接收到新的数据后会直接送到接收缓冲区。发送缓冲区和接收缓冲区公用同一个数据寄存器,数据寄存器分发送缓冲区和接收缓冲区。从框架图可知道使用SPI模块关键是配置CR1,CR2寄存器,并且通过SR状态寄存器来获利实时工作状态SPI通信模块核心寄存器分析02位15BIDIMODE:双向通信数据模式使能:0:双线单向通信数据模式(全双工);1:单线双向通信数据模式(半双工)。位11DFF:数据帧格式:0:为发送/接收选择8位数据帧格式;1:为发送/接收选择16位数据帧格式。位10RXONLY:只接收模式:0:全双工(发送和接收)1:关闭输出(只接收模式)。位7LSBFIRST:帧格式,0

8、:先发送MSB;1:先发送LSB。位6SPE:SPI使能,0:关闭外设;1:使能外设。位5:3BR2:0:波特率控制 000:fPCLK/2;001:fPCLK/4;010:fPCLK/8;011:fPCLK/16;100:fPCLK/32;101:fPCLK/64;110:fPCLK/128;111:fPCLK/256。位2MSTR:主模式选择 0:从配置1:主配置位1CPOL:时钟极性:0:空闲状态时,SCK保持低电平;1:空闲状态时,SCK保持高电平。位0CPHA:时钟相位:0:从第一个时钟边沿开始采样数据;1:从第二个时钟边沿开始采样数据。注意:为保证通信可靠性正在通信时不应更改该寄存

9、器的值。n nSPISPI控制寄存器控制寄存器1(SPI_CR1)1(SPI_CR1)SPI通信模块核心寄存器分析02位4FRF:帧格式0:SPI Motorola模式 1:SPI TI模式。位2SSOE:SS输出使能0:在主模式下禁止SS输出,可在多主模式配置下工作;1:在主模式下使能SS输出,不能在多主模式环境下工作。注意:不适用于I2S模式和SPI TI模式n nSPISPI控制寄存器控制寄存器2(SPI_CR2)2(SPI_CR2)SPI通信模块核心寄存器分析02位1TXE:发送缓冲区为空0:发送缓冲区非空;1:发送缓冲区为空。位0RXNE:接收缓冲区非空0:接收缓冲区为空;1:接收缓

10、冲区非空。n nSPISPI状态寄存器状态寄存器(SPI_SR)(SPI_SR)SPI通信模块核心寄存器分析02位15:0DR15:0:数据寄存器数据寄存器就是存放已接收或者要发送的数据,数据寄存器分为2个缓冲区,一个用于写入(发送缓冲区),一个用于读取(接收缓冲区),也就是说对数据寄存器执行写操作时,数据将写入发送缓冲区,对从数据寄存器执行读取操作时,将返回接收缓冲区中的值。n nSPISPI数据寄存器数据寄存器(SPI_DR)(SPI_DR)0303SPI通信模块示例SPI Flash W25Q64介绍W25Q64芯片的工作原理W25Q64芯片的操作时序 硬件原理图分析软件设计思路SPI通

11、信模块示例 W25Q64简介03W25Q64是华邦公司生产的一款Flash芯片,它的容量是8MB,硬件接口采用SPI通信总线,页大小为256B,并且不能跨页写数据,在正常模式下,通信速度最快支持80MHz,最小的擦除单位为一个扇区4KB,可擦除数据达10万次,数据可保存20年。W25Q64写数据时与AT24C02不一样,其中W25Q64写数据时只会写0,不会写1,W25Q64进行擦除时会将擦除的区域全部写成了1,所以在保存数据之前必须要将存储位置中的数据擦除,否则会造成存储在里面的数据不正常。W25Q64介绍/CS输入片选DO(IO1)输入输出 数据输出(数据输入输出1*)/WP(IO2)输入

12、输出 写保护输入(数据输入输出2*)GND无接地DI(IO0)输入输出 数据输入(数据输入输出0*)CLK输入串行时钟输入/HOLD(IO3)输入输出 保持输入(数据输入输出3*)VCC无电源供应 W25Q64引脚说明在编写驱动程序时,需要通过读取状态寄存器来获利W25Q64的状态,从而决定如何操作下一步。在状态寄存器1中,S0表现忙信号,当为0时表示不忙,当为1时表示忙。这里只关注S0位,其他位含义想了解的可以阅读W25Q64数据手册。状态寄存器SPI通信模块示例 W25Q64芯片的工作原理03W25Q64状态寄存器1W25Q64状态寄存器2W25Q64是诸多SPI Flash芯片之前,有很

13、厂家都可以生产类似功能的芯片,同时,同一厂家也会有不同容量的芯片,在操作时序上会有区别,因此芯片内部会固化厂家ID和和容量信息,如右边表格是华邦生产的W25Q64芯片的ID信息表,有了这些信息后,编写驱动程序就可以做到兼容性和通用性更强。芯片ID制造商ID芯片制造商编码华邦串行FLASHEFh设备ID(ID7-ID0)表示容量(ID15-ID0)表示内存类型指令ABh,90h9FhW25Q64BV16h4017h芯片制造商和设备标识芯片制造商和设备标识SPI通信模块示例 W25Q64芯片的工作原理03对W25Q64 读、擦除、写操作需要使用特定的流程,这些流程是通过能芯片发送命令和参数来实现的

14、,本节学习常用的命令操作。表表3.9 W25Q64芯片指令集表芯片指令集表指令名字1字节(命令)2字节3字节4字节5字节写使能06h 读状态寄存器105h(S7-S0)页编程02hA23-A16A15-A8A7-A0(D7-D0).扇区擦除(4KB)20hA23-A16A15-A8A7-A0 读数据03hA23-A16A15-A8A7-A0(D7-D0).操作命令写使能:只需要发送0 x06 给芯片即可读状态寄存器1:先0 x05 给芯片,然后读取芯片返回的1字节状态数据页编程:先0 x02 给芯片,然后发送24位目标地址给芯片字节数据,接着连续发送要写写入Flash中的数据(注意不结束地址限

15、定在页内地址)扇区擦除:先0 x20 给芯片,然后发送24位目标地址给芯片字节数据,接着读取状态寄存器状态,等待擦除完成。读数据:先0 x03 给芯片,然后发送24位目标地址给芯片字节数据,接着连续读取芯片发送出来的数据。相关操作主机拉低CS片选信号,主机向从机发送0 x05/0 x35命令,接着主机向从机W25Q64发送0 x88(这个值不一定是0 x88,可以随便写,没有实质意义,只是为了产生CLK信号,如果使用模拟时序可以只操作时钟线产生CLK信号,接收芯片发出来的的数据即可),最后主机拉高片选信号,结束读状态通信过程。SPI通信模块示例 W25Q64芯片的操作时序03W25Q64读状态

16、相关操作主机拉低CS片选信号,主机向从机发送0 x03命令,然后发送要读取的数据对应的24位目标起始地址(高字节到低字节的顺序发送),接着连续接收DO线上的输出数据,最后主机拉高CS片选信号,结束读数据通信过程。注意:如果是硬件SPI,要读取两字节ID也需要发送两个字任意数据,以提供CLK时钟信号给芯片,如果模拟SPI主机,发送数据可选的,只需要手动给CLK时钟信号即可。SPI通信模块示例 W25Q64芯片的操作时序03W25Q64读数据相关操作主机拉低CS片选信号,主机向从机发送0 x01命令,然后发送要写入的24位目标起始地址(高字节到低字节的顺序发送),接着把待写入的数据连续发送出去(注

17、意最后地址不能跨页写),最后主机拉高CS片选信号,结束写数据通信过程。SPI通信模块示例 W25Q64芯片的操作时序03W25Q64写数据相关操作主机拉低CS片选信号,主机向从机发送0 x20命令,然后发送要写入的24位扇区地址(高字节到低字节的顺序发送),接着读取状态寄存器,等待芯片擦除完成,最后主机拉高CS片选信号,结束扇区擦除过程。SPI通信模块示例 W25Q64芯片的操作时序03W25Q64扇区擦除相关操作主机拉低CS片选信号,主机向从机发送0 x52命令,然后发送要写入的24位块地址(高字节到低字节的顺序发送),接着读取状态寄存器,等待芯片擦除完成,最后主机拉高CS片选信号,结束块擦

18、除过程,块擦除要比扇区擦除耗时的时间要长一些,因为跨越的空间大。SPI通信模块示例 W25Q64芯片的操作时序03W25Q64块擦除(32K)相关操作主机拉低CS片选信号,主机向从机发送0 x90命令,然后发送要写入的24位块地址0 x000000,接着可以在DO引脚上接收到芯片的ID分别是厂家ID和设备ID,最后主机拉高CS片选信号。注意:如果是硬件SPI,要读取两字节ID也需要发送两个字任意数据,以提供CLK时钟信号给芯片,如果模拟SPI主机,发送数据可选的,只需要手动给CLK时钟信号即可。SPI通信模块示例 W25Q64芯片硬件实验原理分析03W25Q64读取芯片ID原理图分析查询STM

19、32F407数据手册可知道PB3、PB4、PB5是SPI1/3的功能接口,其中、PB14在原理图中设计为片选线,该信号是一个普通的输出功能引脚即可。PB3、PB4、PB5是是SPI1和SPI3共用的引脚,需要复用为SPI1还是SPI3通过软件配置来决定。SPI通信模块示例实验硬件原理分析03编程思路GPIO的配置:首先开时钟,PB14配置为输出模式,P3P4P5配置为SPI1复用功能,PB14的类型配置为推挽,P3P4P5类型配置为开漏,速度配置为50MHz。初始化STM32F407 SPI1控制器:配置为全双工模式0或模式3编写发送字节和接收字节的函数。编写W25Q64操作函数。SPI通信模

20、块示例软件设计思路03void spi_init(void)RCC-AHB1ENR|=1 MODER&=(0X3F MODER|=(0X2A OTYPER&=(0X5 OTYPER|=(0X1 OSPEEDR&=(0X3F OSPEEDR|=(0X2A AFR0&=(0XFFF AFR0|=(0X555 MODER&=(0X3 MODER|=(0X1 OTYPER&=(0X1 OSPEEDR&=(0X3 OSPEEDR|=(0X2 APB2ENR|=1 CR1=0;SPI1-CR1|=0X3 CR1|=0X1 CR2=0;SPI1-CR1|=0X1 SR&(0X1 DR=send_data;w

21、hile(SPI1-SR&(0X1 DR;return recv_data;SPI收发函数n读取芯片ID,只需要根据前面学习的读取ID的时序图,调用上面实现的SPI收发函数即可实现,具体代码流程如右边所示:SPI通信模块示例软件设计思路03#define SPI_CS_H()GPIOB-BSRRL=1BSRRH=114/片选低u16 w25q64_device_id(void)u16 device_id=0;SPI_CS_L();/片选 spi_send_recive_byte(0 x90);/发送命令 spi_send_ recive _byte(0 x00);/发送24位地址 spi_se

22、nd_ recive _byte(0 x00);spi_send_ recive _byte(0 x00);device_id=spi_send_recive_byte(0 x88);device_id=8;device_id|=spi_send_recive_byte(0 x88);SPI_CS_H();/取消片选 return device_id;SPI读取芯片ID函数n写数据前需要对芯片目标空间进行擦除才可以正确写入,可以有扇区擦除,块擦除,整片擦除,这里实现扇区擦除操作,只需要根据前面学习的读取扇区擦除的时序图,调用上面实现的SPI收发函数即可实现,具体代码流程如右边所示:SPI通信模

23、块示例软件设计思路03/*函数形参:扇区首地址word_addr*备注:一次擦除4KB,扇区首地址:4096的倍数。*/void w25q64_sector_erase(u32 word_addr)u8*addr_p=(u8*)&word_addr;/取指针 w25q64_write_enable();/写数据必须先写使能 SPI_CS_L();spi_send_recv_byte(0 x20);spi_send_recv_byte(*(addr_p+2);/分3次发24位地址过去 spi_send_recv_byte(*(addr_p+1);spi_send_recv_byte(*(addr

24、_p+0);SPI_CS_H();SPI读扇区擦除函数n把数据写入到W25Q64中保存起来,只需要按前面写时序图,调用上面实现的SPI收发函数,最后查询写状态即可,具体代码流程如下所示:SPI通信模块示例软件设计思路03 spi_send_recive_byte(*(addr_p+2);/分3次发8位地址数据 spi_send_recv_byte(*(addr_p+1);spi_send_recv_byte(*(addr_p+0);for(vari=0;vari data_num;vari+)spi_send_recv_byte(*(data_buf+vari);SPI_CS_H();whil

25、e(1)/等待不忙 status=w25q64_read_status();if(status&(0 x1 0)=0)break;/总线不忙了 SPI页写函数参数:word_addr 起始地址;data_num:要写的字节数量;data_buf:数据缓冲区首地址;void w25q64_write_data_bytes(u32 word_addr,u16 data_num,u8*data_buf)u8*addr_p=(u8*)&word_addr;u16 vari=0,status=0;w25q64_write_enable();/写数据必须先写使能 SPI_CS_L();spi_send_r

26、ecive_byte(0 x02);/02写命令n从W25Q64指定地址开始读取数据,只需要按前面读时序图,调用上面实现的SPI收发函数,具体代码流程如下所示:SPI通信模块示例软件设计思路03 spi_send_recive_byte(0 x03);/发03读命令 /分3次发,每次位8位,共24位地址数据。spi_send_recv_byte(*(addr_p+2);spi_send_recv_byte(*(addr_p+1);spi_send_recv_byte(*(addr_p+0);for(vari=0;vari data_num;vari+)data_bufvari=spi_send

27、_recive_byte(0 x88);SPI_CS_H();SPI页读函数参数:word_addr:起始地址;data_num:要读取的字节数量;data_buf:数据缓冲区首地址;void w25q64_read_data_bytes(u32 word_addr,u16 data_num,u8*data_buf)u8*addr_p=(u8*)&word_addr;u16 vari=0;SPI_CS_L();n从W25Q64指定地址开始读取数据,只需要按前面读时序图,调用上面实现的SPI收发函数,具体代码流程如下所示:SPI通信模块示例软件设计思路03 spi_send_recive_byt

28、e(0 x03);/发03读命令 /分3次发,每次位8位,共24位地址数据。spi_send_recv_byte(*(addr_p+2);spi_send_recv_byte(*(addr_p+1);spi_send_recv_byte(*(addr_p+0);for(vari=0;vari data_num;vari+)data_bufvari=spi_send_recive_byte(0 x88);SPI_CS_H();W26Q64 main函数参数:word_addr:起始地址;data_num:要读取的字节数量;data_buf:数据缓冲区首地址;void w25q64_read_da

29、ta_bytes(u32 word_addr,u16 data_num,u8*data_buf)u8*addr_p=(u8*)&word_addr;u16 vari=0;SPI_CS_L();n当前已经实现W25Q64所有的功能函数,现在我们把前面实现的功能函数组装到main函数中即可对SPI进行擦除,写,读取测试了,代码如下:SPI通信模块示例软件设计思路03 w25q64_id=w25q64_device_id();printf(w25q64_id=%#xrn,w25q64_id);w25q64_sector_erase(0);Delay_ms(100);/擦除后不能马上写 w25q64_

30、write_data_bytes(0,len,(u8*)data);Delay_ms(10);/读写切换最好有一个延时时间 w25q64_read_data_bytes(0,len,(u8*)rd_buffer);printf(读取到的数据:rn%srn,rd_buffer);while(1);SPI页读函数 char rd_buffer512=0;/接收缓存 int main(void)u16 w25q64_id=0;u16 len=strlen(data);Delay_Init(168);/延时初始化 uart2_init(UART_BDR);/初始化USART2 spi_init();/初始化SPI04致谢ACKNOWLEDGEMENTS感谢聆听,如有不足之处敬请指出,欢迎提出您的宝贵建议!致谢

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁