资源预览内容
第1页 / 共42页
第2页 / 共42页
第3页 / 共42页
第4页 / 共42页
第5页 / 共42页
第6页 / 共42页
第7页 / 共42页
第8页 / 共42页
第9页 / 共42页
第10页 / 共42页
亲,该文档总共42页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第二节 通讯及总线 -SPI总线,复 习,总结uart 1、两根线:发送和接收 2、发送器:TE使能,发送一个空闲帧+一个下降沿,表明开始传输 3、接收器:如果辨认出序列1 1 1 0 X 0 X 0 X 0 0 0 0,那么就认为侦测到一个起始位,开始接收。 4、一帧数据包括起始位,数据位和停止位(或者包括奇偶校验位),根据事先的配置或约定,SPI总线协议,SPI,是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。是Motorola首先在其MC68HCXX 系列处理器上定义的。,SPI总线系统是一种同步串行外设接口通信以交换信息。外围设置FLASH,RAM、网络控制器、LCD显示驱动器、A/D转换器和MCU等。,接口包括以下四种信号:,(1)MOSI 主器件数据输出,从器件数据输入 (主发从收) (2)MISO 主器件数据输入,从器件数据输出 (主收从发) (3)SCLK 时钟信号,由主器件产生 (时钟线) (4)CS 从器件使能信号,由主器件控制 (片选线),SPI通信以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以(用于单向传输时,也就是半双工方式)。,从选择(NSS)脚管理 有2种NSS模式: 软件NSS模式:设置SPI_CR1寄存器的SSM位来使能这种模式。在这种模式下NSS引脚可以用作它用,而内部NSS信号电平可以通过写SPI_CR1的SSI位来驱动,从选择(NSS)脚管理 硬件NSS模式,分两种情况: NSS输出被使能:当STM32为主SPI,并且NSS输出已经通过SPI_CR2寄存器的SSOE位使能,这时NSS引脚被拉低,所有NSS引脚与这个主SPI的NSS引脚相连并配置为硬件NSS的SPI设备,将自动变成从SPI设备。 当一个SPI设备需要发送广播数据,它必须拉低NSS信号,以通知所有其它的设备它是主设备;如果它不能拉低NSS,这意味着总线上有另外一个主设备在通信,这时将产生一个硬件失败错误(Hard Fault)。 NSS输出被关闭:允许操作于多主环境。 SPI通讯至少两个设备,一个作为主设备,一个作为从设备。通过配置CR1决定主从设备,通过NSS(CS)管理其他从设备,如何实现通讯? 除去NSS管脚,还剩3根线。MISO,MOSI,SCK。,SCK,SPI接口实际上是两个简单的移位寄存器,传输的数据为8位,在主器件产生的从器件使能信号和移位脉冲下,按位传输,高位在前,低位在后。 上升沿发送,下降沿接收。(有的器件是上升沿接收,下降沿发送),D7 . . . . D0,D0 . . . . D7,SPI相当于一个环形移位寄存器,脉冲 主机sbuff 从机sbuff sdi sdo 0 10101010 01010101 0 0 1上 0101010x 1010101x 0 1 1下 01010100 10101011 0 1 2上 1010100x 0101011x 1 0 2下 10101001 01010110 1 0 3上 0101001x 1010110x 0 1 3下 01010010 10101101 0 1,如果要正常发送和接收,则: 如果主设备MO上升沿改变数据,则高电平保持线上数据,低电平总线空闲;从设备SI下降沿接收数据; 同时,SO上升沿改变数据,高电平保持线上数据,主设备MI下降沿接收数据 如果主设备MO下降沿改变数据,则低电平保持线上数据,高电平总线空闲;从设备SI上升沿接收数据;,两个概念: 时钟极性(CPOL): 0: 空闲状态时,SCK保持低电平; 1: 空闲状态时,SCK保持高电平。 时钟相位(CPHA) 0: 数据采样从第一个时钟边沿开始; 1: 数据采样从第二个时钟边沿开始。,四种组合模式 选择不同组合的依据是什么? 一般主设备是MCU,可通过编程改变 从设备为SPI外设,具有固定的通讯模式 因此,主设备(STM32)选择何种模式基于从设备的通讯模式 比如:M25P64,64M flash存储器,支持SPI访问,允许的SPI模式为: CPOL=0, CPHA=0 CPOL=1, CPHA=1 如何配置及访问SPI设备?,Stm32之SPI配置,Step 1:使能时钟,因此,要使能的时钟包括: PA口,AFIO口,SPI口,Stm32之SPI配置,Step 1:使能时钟,根据参考手册,以上端口隶属于APB2总线,因此使能的库函数可以为:,RCC-APB2ENR |= RCC_APB2Periph_GPIOA; RCC-APB2ENR |= RCC_APB2Periph_AFIO; RCC-APB2ENR |= RCC_APB2Periph_SPI1,Stm32之SPI配置,Step 2:管脚配置,PA5-PA7 配置为复用功能 PA4配置为输出功能,GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, ,GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOA, ,Stm32之SPI配置,Step 3:spi参数配置 根据SPI原理,可将器件配置为主设备和从设备。 以基于SPI的flash访问为例,将STM32配置为主设备,外部存储器flash型号为:M25P64,Stm32之SPI配置,有关M25P64,64 Mbit of Flash memory 2.7 V to 3.6 V single supply voltage SPI bus compatible serial interface 75 MHz clock rate (maximum) More than 100 000 Erase/Program More than 20-year data retention,组织结构包括: 8388608 字节 128 扇区 32768 页,Stm32之SPI配置,有关M25P64 支持的SPI模式: CPOL=0, CPHA=0 CPOL=1, CPHA=1,所以,总是上升沿改变数据,下降沿采集数据,问题: 如何去操作M25P64,包括读,写,擦除 通过SPI总线,向器件写操作指令,Stm32之SPI配置,Step 3:spi参数配置 所以,需要将stm32配置为主设备,配置步骤 1. 通过SPI_CR1寄存器的BR2:0位定义串行时钟波特率。 2. 选择CPOL和CPHA位,定义数据传输和串行时钟间的相位关系 3. 定义8位或16位数据帧格式。 4. 配置SPI_CR1寄存器的LSBFIRST位定义帧格式。 5. 如果需要NSS引脚工作在输入模式。硬件模式下,在整个数据帧传输期间应把NSS脚连接到高电平;在软件模式下,需设置SPI_CR1寄存器的SSM位和SSI位。如果NSS引脚工作在输出模式,则只需设置SSOE位。 6. 设置MSTR位和SPE位。,Stm32之SPI配置,配置步骤 1. 通过SPI_CR1寄存器的BR2:0位定义串行时钟波特率。,SPI控制寄存器1(SPI_CR1),Stm32支持18M Hz 波特率,M25P64支持最高75M Hz 所以,若PCLK=72M Hz,则SPI1-CR1 |=0x0008,Stm32之SPI配置,配置步骤 2. 设置CPOL和CPHA位,确定极性和相位关系,SPI控制寄存器1(SPI_CR1),根据M25P64要求,只能为: 0x00h,或0x03h,Stm32之SPI配置,配置步骤 3. 定义8位或16位数据帧格式。 4. 配置SPI_CR1寄存器的LSBFIRST位定义帧格式。,SPI控制寄存器1(SPI_CR1),Stm32之SPI配置,配置步骤 5. 如果需要NSS引脚工作在输入模式。硬件模式下,在整个数据帧传输期间应把NSS脚连接到高电平;在软件模式下,需设置SPI_CR1寄存器的SSM位和SSI位。如果NSS引脚工作在输出模式,则只需设置SSOE位。 两种选择:硬件:固定主从关系 软件:可改变,Stm32之SPI配置,配置步骤 5. 如果需要NSS引脚工作在输入模式。硬件模式下,在整个数据帧传输期间应把NSS脚连接到高电平;在软件模式下,需设置SPI_CR1寄存器的SSM位和SSI位。如果NSS引脚工作在输出模式,则只需设置SSOE位。 若NSS引脚工作在输出模式,此时,该设备不能工作于多主设备的网络中,只能作为单一主设备进行工作,SPI控制寄存器2(SPI_CR2),Stm32之SPI配置,配置步骤 6. 设置MSTR位和SPE位。,SPI控制寄存器1(SPI_CR1),Stm32之SPI配置,完整配置代码: unsigned short temp=0; temp |= 0x0008;/定义波特率为18M Hz temp |= 0x0003;/定义极性及相位关系,为11 temp ,接下来的问题:数据如何发送和接收,Stm32之SPI配置,首先确定连接方式。,1、硬件连线确定 2、软件配置确定,Stm32之SPI配置,首先确定连接方式。,1、BIDIMODE=0 BIDIOE=x RXONLY=0 双线双向,即全双工,2、BIDIMODE=0 BIDIOE=x RXONLY=1 用于多个从设备时,禁止未被访问的设备发送数据,Stm32之SPI配置,首先确定连接方式。,4、BIDIMODE=1 BIDIOE=x RXONLY=0 双向,只发送,3、BIDIMODE=1 BIDIOE=x RXONLY=1 双向,此时只接收,5、BIDIMODE=0 BIDIOE=x RXONLY=1 单向,只接收,Stm32之SPI配置,全双工模式(BIDIMODE=0并且RXONLY=0) 当写入数据到SPI_DR寄存器(发送缓冲器)后,传输开始; 在传送第一位数据的同时,数据被并行地从发送缓冲器传送到8位的移位寄存器中,然后按顺序被串行地移位送到MOSI引脚上; 与此同时,在MISO引脚上接收到的数据,按顺序被串行地移位进入8位的移位寄存器中,然后被并行地传送到SPI_DR寄存器(接收缓冲器)中。,对于发送器: MSB在先还是LSB在先,取决于SPI_CR1寄存器中的LSBFIRST位的设置。 数据从发送缓冲器传输到移位寄存器时TXE标志将被置位,如果设置了SPI_CR1寄存器中的TXEIE位,将产生中断。,对于接收器来说,当数据传输完成时: 传送移位寄存器里的数据到接收缓冲器,并且RXNE标志被置位。 如果设置了SPI_CR2寄存器中的RXNEIE位,则产生中断。,Stm32之SPI配置,SPI 数据寄存器(SPI_DR),Stm32之SPI配置,完整配置代码: unsigned short temp=0; temp |= 0x0008;/定义波特率为18M Hz temp |= 0x0003;/定义极性及相位关系,为11 temp /配置为主模式,并启动SPI,接下来,即向SPI1-DR寄存器中写或读数即可,实现发送和接收,Stm32之SPI读写,SPI_FLASH_SendByte(0x9F);,SPI1-DR = 0x9F;,Temp0 = SPI_FLASH_SendByte(Dummy_Byte); Temp1 = SPI_FLASH_SendByte(
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号