SH32F9001的SPI介绍与应用

描述

一、SH32F9001 SPI简介

SPI(Serial peripheral interface)即串行外围设备接口,是由Motorola首先在其MC68HCxx系列单片机上定义的,基于高速全双工总线的通讯协议。被广泛应用于LCD、闪存芯片等设备与MCU之间通讯。SH32F9001包含2个独立的串行外设接口SPI0/1,主从机可选,10个可编程主时钟频率,极性相位可编程,数字位宽8/16位可选,支持DMA通信,带MCU中断的主模式故障出错标志,写入冲突标志保护,可选择LSB或MSB传输。

二、 SPI的物理层与协议层简介

1、SPI物理层

SPI通讯需要使用4条线:3条总线(SCK、MOSI、MISO)和1条片选(nSS)。

SPI

Master与Slave连接示意图(只需要连接4条线)

SCK(Serial Clock):时钟信号线,通讯数据同步用,由主机产生,决定了SPI的通讯速率。

MOSI(Master Output Slave Input):主机输出数据/从设备输入数据线,即这条数据线上传输主机发给从机的数据。

MISO(Master Input Slave Output):主机输入数据/从设备输出数据线,即这条数据线上传输从机发给主机的数据。

nSS(Slave Select):片选信号线,主要用于选中对应的SPI从设备,低电平有效。每个从设备独立拥有一条nSS信号线,占据主机的一个引脚。设备的其它三根总线是并联到SPI主机的,即无论多少个从设备,都共同使用这3条线。当从设备上的nSS引脚被拉低时说明该从设备被主机选中,可以与主机进行通讯。

SPI

一个Master与多个Slave连接示意图

(2)SPI 协议层

SPI

如上图为SH32F9001芯片SPI的一种通讯模式(CPOL=1,CPHA=0)时序图,nSS、SCK、MOSI信号均由Master产生,MISO信号由从机产生。在nSS为低电平的前提下,MOSI和MISO信号才有效,在每个时钟周期MOSI和MISO传输一位数据。

SPI通讯也需要通讯的起始/结束信号,有效数据和同步时钟。途中nSS信号由高电平变为低电平即为SPI的起始信号,nSS信号由低电平变为高电平即为SPI通讯的结束信号。当从机检测到nSS引脚被拉低时就知道自己被主机选中,准备和主机进行通讯。

SPI通讯的数据采集是个相对复杂的环节且有多种模式,现在只以上图(CPOL=1,CPHA=0)情形为例进行简单讲解。途中Capture Point行箭头指示的地方即为有效数据被采集的时间点。SCK、MOSI、MISO线上的数据在每个SCK时钟周期传输一位数据,数据的输入/输出是可以同时进行的。由上图可知,在SCK为奇数边沿,即SCK下降沿时,数据得到有效采样,也就是说,在这个时刻,MISO和MOSI的数据有效,高电平表示1,低电平表示数据0,在其它时刻数据并无效,可以理解为为下一次MISO和MOSI的数据传输做准备,在非采样时刻MOSI和MISO上的信号才能切换。

数据传输中,先传送高位还是低位,SPI并无明确规定,但是数据要在主从机中正确传输,首先要约定好先传高还是低,一般是高位在先的方式传输。

三、 SPI的时钟极性(CPOL)和时钟相位(CPHA)

时钟极性(CPOL)指通讯设备处于空闲状态时,SCK的状态,即空闲时SCK是高电平还是低电平。时钟相位(CPHA)指数据采样时刻位于SCK的偶数边沿采样还是奇数边沿采样。

CPOL=0时SCK在空闲时为低电平;CPOL=1时SCK在空闲时为高电平;CPHA=0时,在SCK的计数边沿采样;CPHA=1时,在SCK的偶数边沿采样。所以SPI的采样时刻并非由上升沿/下降沿决定的,而是由CPOL与CPHA所组合的工作模式决定。所以SPI有4种工作模式。

工作模式 CPOL CPHA 空闲时SCK时钟 采样时钟边沿
1 0 0 奇数边沿
2 0 1 偶数边沿
3 1 0 奇数边沿
4 1 1 偶数边沿

注意:在配置主机和从机的工作模式时,需要配置为相同的工作模式,只有模式相同才能进行正确通讯。

四、 SH32F9001与闪存W25Q128通讯示例

1、W25Q128简介

W25Q128芯片是串行闪存,可以通过四线SPI控制,管脚如下图所示。使用SPI控制时,DO管脚为MISO,DI管脚为MOSI,/CS为片选NSS,CLK为时钟信号线。

SPI

W25Q128通过命令操作,这里简单介绍几条接下来示例中与32F9001通讯的指令,其它指令详情可以参考其数据手册。

(1)读制造商/设备ID指令:0x90

该指令通常在调试程序时候用到,判断SPI通信是否正常。SH32F9001做主机拉低/CS片选使能器件开始传输,首先通过DI脚即MOSI线传送”90H”指令,接着传输“000000H”的24位地址,之后W25Q128会通过DO脚即MISO脚传送制造商ID(EFH)和设备ID(17H)。

(2)写使能指令:0x06

SH32F9001向FLASH发送0x06写使能指令即可开启写使能,该指令先拉低/CS引脚电平,接着传输“06H”指令。

(3)读数据指令:0x03

读数据指令可以从存储器依次一个或多个读取数据字节,该指令通过主器件拉低/CS电平能设备开始传输,然后传输“03H”指令,接着通过DI管脚传输24位地址,W25Q128器件得到地址后,寻址存储器中的数据通过DO引脚即MISO传输给SH32F9001。

(4)页编程指令:0x02

页编程指令可以在擦除的存储单元中写入256个字节。该指令先拉低/CS引脚,接着传输“02H”指令和24位地址。后面接着传输至少一个字节数据,最多256字节。

2、SH32F9001与W25Q128硬件连接示意图:

SPI

SH32F9001与W25Q128进行SPI通信只需要对应连接4条线就可以,将SH32F9001的PC6配置为nSS脚,PC7配置为MISO,PC8配置为MOSI,PC9配置为SCK。

3、SH32F9001与W25Q128通讯程序。

void SPI_GPIO_Config(void)//GPIO初始化

{

  RCC->RCCLOCK= 0x33CC;         //打开时钟配置锁定寄存器

  RCC->AHBENR.BIT.IOCLKEN= 1;    //使能IO时钟

  RCC->RCCLOCK= 0;                  //关闭时钟配置锁定寄存器

  GPIOC_CFG->LCKR.BIT.LOCK=0X5AA5;   //解锁GPIOA配置锁

  GPIOC_CFG->LCKR.BIT.LCK=0;    

  GPIOC->MODER =0X0340;         //设置PC6/C8/C9口为输出模式PC7输入模式

  GPIOC_CFG->OTYPER=0X0;        //设置PC6/C8/C9口输出方式为推挽输出

  GPIOC_CFG->PUPDR.BIT.PHDR9=1;     //PC9开上拉

GPIOC_CFG->AFRL.BIT.AFR6=0X03;//设置PC6口为SPI0-SCK脚模式

GPIOC_CFG->AFRL.BIT.AFR7=0X03;//设置PC7口为SPI0-MISO脚模式

GPIOC_CFG->AFRH.BIT.AFR8=0X03;//设置PC8口为SPI0-MOSI脚模式

GPIOC_CFG->AFRH.BIT.AFR9=0X01;//PC9口为nSS脚

  GPIOC_CFG->LCKR.BIT.LOCK=0;        //关闭GPIOC配置锁

  GPIOC_CFG->LCKR.BIT.LCK=0XFFFF;

}

voidSPI0Init(void) //SPI0初始化

{

GPIOC->BSRR.V32=0x0200;// SPI0 flash不选中

RCC->RCCLOCK = 0x33CC;        //打开时钟配置锁定寄存器

RCC->APB1ENR.BIT.SPI0EN =1;    //使能SPI0时钟

RCC->RCCLOCK = 0;          //关闭时钟配置锁定寄存器

 SPI0->CR.BIT.SPR=0X04;        //SPI0时钟为PCLK1/32分频

 SPI0->CR.BIT.SSDIS=0;            //打开NSS引脚

SPI0->CR.BIT.CPOL=1;            //在空闲模式SCK处于高电平

SPI0->CR.BIT.CPHA=1;            //SCK周期的第二沿采集数据

SPI0->CR.BIT.MSTR=1;            //配置SPI0为主机模式

SPI0->CR.BIT.DIR  =0;           //MSB优先发送

SPI0->CR.BIT.SPDATL =0;         //SPI0每次发送8Bit数据

 SPI0->CR.BIT.SPIEN=1;            //使能SPI

}

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分