一、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)。
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引脚被拉低时说明该从设备被主机选中,可以与主机进行通讯。
一个Master与多个Slave连接示意图
(2)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为时钟信号线。
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硬件连接示意图:
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
}
-
单片机
+关注
关注
6037文章
44564浏览量
635839 -
接口
+关注
关注
33文章
8612浏览量
151287 -
SPI
+关注
关注
17文章
1707浏览量
91665 -
物理层
+关注
关注
1文章
151浏览量
34393 -
通讯协议
+关注
关注
10文章
275浏览量
20361
原文标题:SH32F9001的SPI介绍与应用
文章出处:【微信号:SINO_25181447,微信公众号:中颖电子】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论