SPI(Serial Peripheral Interface),串行外围设备接口。SPI是一种高速的、全双工、同步的通信总线。

SPI接口一般使用4条线通信:

  MISO 主设备数据输入,从设备数据输出

  MOSI 主设备数据输出,从设备数据输入

  SCLK 时钟信号,有主设备产生

  CS 从设备片选信号,有主设备控制

  SPI模块为了和外设进行数据交换,根据外设工作要求,其输出串行同步时钟极性和相位可以进行配置。SPI_CR寄存器的CPOL(时钟极性)位,控制在没有数据传输时时钟的空闲状态电平,此位对主模式和从模式下的设备都有效。CPOL=0,串行同步时钟的空闲状态为低电平;CPOL=1,串行同步时钟的空闲状态为高电平。SPI_CR寄存器的CPHA(时钟相位)位,能配置用于选择两种不同的传输协议之一进行数据传输。CPHA=0,在串行同步时钟的第一个跳变沿(上升或下降)数据被采样;CPHA=1,在串行同步时钟的第二个跳变沿(上升或下降)数据被采样。

1.SPI主模式配置步骤

①使能SPI时钟,配置PA口

  APB2外设时钟使能寄存器(RCC_APB2ENR)

  APB1外设复位寄存器 (RCC_APB1RSTR)

  Eg:RCC->APB2ENR|=1<<2; //PORTA时钟使能

     RCC->APB2ENR|=1<<12; //SPI1时钟使能
     //这里只针对SPI口初始化
       GPIOA->CRL&=0X000FFFFF;
     GPIOA->CRL|=0XBBB00000;//PA5.6.7复用
     GPIOA->ODR|=0X7<<5; //PA5.6.7上拉

②开全双工模式并软件管理NSS

  SPI控制寄存器1(SPI_CR1)(I2S模式下不使用)

  Eg:SPI1->CR1|=0<<10;//全双工模式
     SPI1->CR1|=1<<9; //软件nss管理
     SPI1->CR1|=1<<8;

③设置SPI为主机并设置数据帧格式

  Eg:SPI1->CR1|=1<<2; //SPI主机
     SPI1->CR1|=0<<11;//8bit数据格式

④设置时钟极性和相位极性

 

   Eg:SPI1->CR1|=1<<1; //空闲模式下SCK为1 CPOL=1
      SPI1->CR1|=1<<0; //数据采样从第二个时间边沿开始,CPHA=1

⑤传输速率和LSBFIRST帧格式设置

  Eg:SPI1->CR1|=7<<3; //Fsck=Fcpu/256
     SPI1->CR1|=0<<7; //MSBfirst

⑥使能SPI

  Eg:SPI1->CR1|=1<<6; //SPI设备使能

2.SPI

 //SPI口初始化
//这里针是对SPI1的初始化
void SPI1_Init(void)
{
RCC->APB2ENR|=<<; //PORTA时钟使能
RCC->APB2ENR|=<<; //SPI1时钟使能 //这里只针对SPI口初始化
GPIOA->CRL&=0X000FFFFF;
GPIOA->CRL|=0XBBB00000;//PA5.6.7复用
GPIOA->ODR|=0X7<<; //PA5.6.7上拉 SPI1->CR1|=<<;//全双工模式
SPI1->CR1|=<<; //软件nss管理
SPI1->CR1|=<<; SPI1->CR1|=<<; //SPI主机
SPI1->CR1|=<<;//8bit数据格式
SPI1->CR1|=<<; //空闲模式下SCK为1 CPOL=1
SPI1->CR1|=<<; //数据采样从第二个时间边沿开始,CPHA=1
SPI1->CR1|=<<; //Fsck=Fcpu/256
SPI1->CR1|=<<; //MSBfirst
SPI1->CR1|=<<; //SPI设备使能
SPI1_ReadWriteByte(0xff);//启动传输(主要作用:维持MOSI为高)
}
//SPI1 速度设置函数
//SpeedSet:0~7
//SPI速度=fAPB2/2^(SpeedSet+1)
//APB2时钟一般为72Mhz
void SPI1_SetSpeed(u8 SpeedSet)
{
SpeedSet&=0X07; //限制范围
SPI1->CR1&=0XFFC7;
SPI1->CR1|=SpeedSet<<; //设置SPI1速度
SPI1->CR1|=<<; //SPI设备使能
}
//SPI1 读写一个字节
//TxData:要写入的字节
//返回值:读取到的字节
u8 SPI1_ReadWriteByte(u8 TxData)
{
u16 retry=;
while((SPI1->SR&<<)==)//等待发送区空
{
retry++;
if(retry>0XFFFE)return ;
}
SPI1->DR=TxData; //发送一个byte
retry=;
while((SPI1->SR&<<)==) //等待接收完一个byte
{
retry++;
if(retry>0XFFFE)return ;
}
return SPI1->DR; //返回收到的数据
}

spi.c

 // SPI总线速度设置
#define SPI_SPEED_2 0
#define SPI_SPEED_4 1
#define SPI_SPEED_8 2
#define SPI_SPEED_16 3
#define SPI_SPEED_32 4
#define SPI_SPEED_64 5
#define SPI_SPEED_128 6
#define SPI_SPEED_256 7 void SPI1_Init(void); //初始化SPI口
void SPI1_SetSpeed(u8 SpeedSet); //设置SPI速度
u8 SPI1_ReadWriteByte(u8 TxData);//SPI总线读写一个字节 #endif

spi.h

stm32寄存器版学习笔记10 SPI的更多相关文章

  1. stm32寄存器版学习笔记07 ADC

    STM32F103RCT有3个ADC,12位主逼近型模拟数字转换器,有18个通道,可测量16个外部和2个内部信号源.各通道的A/D转换可以单次.连续.扫描或间断模式执行. 1.通道选择 stm32把A ...

  2. stm32寄存器版学习笔记06 输入捕获(ETR脉冲计数)

    STM32外部脉冲ETR引脚:TIM1-->PA12;TIMER2-->PA0:TIMER3-->PD2;TIMER4-->PE0… 1.TIM2 PA0计数 配置步骤 ①开启 ...

  3. stm32寄存器版学习笔记03 外部中断

    stm32的每个I/O口都可以作为中断输入,要把I/O口设置为外部中断输入,必须将I/O口设置为上拉/下拉输入 或 浮空输入(但浮空的时候外部一定要带上拉或下拉电阻,否则可能导致 中断不停的触发),干 ...

  4. stm32寄存器版学习笔记05 PWM

    STM32除TIM6和TIM7外都可以产生PWM输出.高级定时器TIM1和TIM8可以同时产生7路PWM,通用定时器可以产生4路PWM输出. 1.TIM1 CH1输出PWM配置步骤 ①开启TIM1时钟 ...

  5. stm32寄存器版学习笔记08 DMA

    DMA(Direct Memory Access),直接存储器访问.DMA传输方式无需CPU直接控制传输,通过硬件为RAM与I/O设备开辟一条直接传送数据的通路,使CPU效率大大提高.stm32f10 ...

  6. stm32寄存器版学习笔记04 定时计数器中断

    STM32共有8个定时计数器,其中TIME1和TIME8是高级定时器,TIME2~TIME5是通用定时器,TIME6和TIME7是基本定时器.以TIME3为例总结定时计数器的基本用法. 1.TIM3的 ...

  7. stm32寄存器版学习笔记02 串口通信

    stm32F103RCT6提供5路串口.串口的使用,只要开启串口时钟,设置相应的I/O口的模式,然后配置下波特率.数据位长度.奇偶校验等信息,即可使用. 1.串口的配置步骤 ①串口时钟使能 APB2外 ...

  8. stm32寄存器版学习笔记01 GPIO口的配置(LED、按键)

    STM32的I/O口可以由软件配置成如下8种模式:输入浮空.输入上拉.输入下拉.模拟输入.开漏输出.推挽输出.推挽式复用功能及开漏复用功能.每个I/O口由7个寄存器来控制:配置模式的端口配置寄存器CR ...

  9. stm32寄存器版学习笔记09 IIC

    I²C(Inter-Integrated Circuit)总线是一种两线式串行总线,用于连接微控制器及其外设,是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据. IIC总线在传送数据过程中 ...

随机推荐

  1. codeforce 35C fire again

    2017-08-25 17:04:07 writer:pprp 题目描述: • Codeforces 35C Fire Again• N*M的格子,最开始有K个点 (坐标给定) 开始着火• 每一秒着火 ...

  2. jquery实现全选/全不选

    //设置全选全不选$("#checkAll").click(function () { if ($("#checkAll").attr("checke ...

  3. python中的上下文管理器

    刚刚看了vamei大神的上下文管理器博客,理解如下: 其实我自己经常用到上下文管理器,尤其是在打开文件的时候,如果自己比较懒,不想手工打上f.close(),使用上下文管理器就ok拉. 上下文管理器就 ...

  4. nlp基本知识点(不断更新)

    1.精确率与召回率 召回率也称为查全率,指的是:你查询到的相关数目/(你查询到的相关的数目+你没有查询到的相关的数目). 精确率: A/A+B 召回率:A/A+C 再比如: 我 是 中国人 这里正确的 ...

  5. GTS--阿里巴巴分布式事务全新解决方案

    现代IT应用中,服务化SOA作为主流的技术架构被广泛应用到各种信息系统.原来一个系统被分拆成若干个服务的集合,产生了跨服务调用的分布式事务问题.随着Dubbo.SpringCloud等微服务框架的流行 ...

  6. python学习大纲目录(转自alex博客https://www.cnblogs.com/alex3714/)

    day01: 介绍.基本语法.流程控制 Python介绍 发展史 Python 2 or 3? 安装 Hello World程序 变量 用户输入 模块初识 .pyc是个什么鬼? 数据类型初识 数据运算 ...

  7. 1.SpringMVC设计理念与DispatcherServlet

    SpringMVC作为Struts2之后异军突起的一个表现层框架,正越来越流行,相信javaee的开发者们就算没使用过SpringMVC,也应该对其略有耳闻.我试图通过对SpringMVC的设计思想和 ...

  8. day17 Django学习三

    参考博客: http://www.cnblogs.com/wupeiqi/articles/5237704.html http://www.cnblogs.com/wupeiqi/articles/5 ...

  9. Personal Introduction

    专业:计算机科学与技术 我是博客园的新人,虽然接触编程世界只有一年,基础知识比较差,编程能力差,但对于这个专业,我还是充满兴趣,希望有一天能独当一面,从今天起,我将分享一些在学习web前端和其他方面的 ...

  10. RabbitMQ(5) 事务&生产者确认

    事务&生产者确认 一般情况下,生产者将消息发送后,继续进行别的业务逻辑处理.消息从生产者发送后,可能由于网络原因丢失,也可能因为RabbitMQ服务端奔溃未被处理...总之,对于 消息是否安全 ...