stm32寄存器版学习笔记10 SPI

  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

 1 //SPI口初始化
 2 //这里针是对SPI1的初始化
 3 void SPI1_Init(void)
 4 {
 5     RCC->APB2ENR|=1<<2;       //PORTA时钟使能
 6     RCC->APB2ENR|=1<<12;      //SPI1时钟使能
 7
 8     //这里只针对SPI口初始化
 9     GPIOA->CRL&=0X000FFFFF;
10     GPIOA->CRL|=0XBBB00000;//PA5.6.7复用
11     GPIOA->ODR|=0X7<<5;    //PA5.6.7上拉
12
13     SPI1->CR1|=0<<10;//全双工模式
14     SPI1->CR1|=1<<9; //软件nss管理
15     SPI1->CR1|=1<<8;
16
17     SPI1->CR1|=1<<2; //SPI主机
18     SPI1->CR1|=0<<11;//8bit数据格式
19     SPI1->CR1|=1<<1; //空闲模式下SCK为1 CPOL=1
20     SPI1->CR1|=1<<0; //数据采样从第二个时间边沿开始,CPHA=1
21     SPI1->CR1|=7<<3; //Fsck=Fcpu/256
22     SPI1->CR1|=0<<7; //MSBfirst
23     SPI1->CR1|=1<<6; //SPI设备使能
24     SPI1_ReadWriteByte(0xff);//启动传输(主要作用:维持MOSI为高)
25 }
26 //SPI1 速度设置函数
27 //SpeedSet:0~7
28 //SPI速度=fAPB2/2^(SpeedSet+1)
29 //APB2时钟一般为72Mhz
30 void SPI1_SetSpeed(u8 SpeedSet)
31 {
32     SpeedSet&=0X07;            //限制范围
33     SPI1->CR1&=0XFFC7;
34     SPI1->CR1|=SpeedSet<<3;    //设置SPI1速度
35     SPI1->CR1|=1<<6;         //SPI设备使能
36 }
37 //SPI1 读写一个字节
38 //TxData:要写入的字节
39 //返回值:读取到的字节
40 u8 SPI1_ReadWriteByte(u8 TxData)
41 {
42     u16 retry=0;
43     while((SPI1->SR&1<<1)==0)//等待发送区空
44     {
45         retry++;
46         if(retry>0XFFFE)return 0;
47     }
48     SPI1->DR=TxData;           //发送一个byte
49     retry=0;
50     while((SPI1->SR&1<<0)==0) //等待接收完一个byte
51     {
52         retry++;
53         if(retry>0XFFFE)return 0;
54     }
55     return SPI1->DR;          //返回收到的数据
56 }

spi.c

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

spi.h

时间: 2024-10-05 23:09:01

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

stm32寄存器版学习笔记07 ADC

STM32F103RCT有3个ADC,12位主逼近型模拟数字转换器,有18个通道,可测量16个外部和2个内部信号源.各通道的A/D转换可以单次.连续.扫描或间断模式执行. 1.通道选择 stm32把ADC转换分成2个通道组:规则通道组相当于正常运行的程序:注入通道组相当于中断.程序初始化阶段设置好不同的转换组,系统运行中不用变更循环转换的配置,从而达到任务互不干扰和快速切换. 有16个多路通道.可以把转换组织成两组:规则组和注入组.在任意多个通道上以任意顺序进行的一系列转换构成成组转换.例如,可

stm32寄存器版学习笔记05 PWM

STM32除TIM6和TIM7外都可以产生PWM输出.高级定时器TIM1和TIM8可以同时产生7路PWM,通用定时器可以产生4路PWM输出. 1.TIM1 CH1输出PWM配置步骤 ①开启TIM1时钟,配置PA8为复用输出 APB2外设时钟使能寄存器(RCC_APB2ENR) APB1外设复位寄存器 (RCC_APB1RSTR) 置1开启.清0关闭. Eg:RCC->APB2ENR|=1<<11; //使能TIM1时钟 配置I/O口: 参见stm32寄存器版学习笔记01 GPIO口的配置

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

STM32外部脉冲ETR引脚:TIM1-->PA12;TIMER2-->PA0:TIMER3-->PD2;TIMER4-->PE0… 1.TIM2 PA0计数 配置步骤 ①开启TIM2时钟,配置PA0输入 APB1外设复位寄存器 (RCC_APB1RSTR) APB2外设时钟使能寄存器(RCC_APB2ENR) 置1开启.清0关闭. Eg:RCC->APB1ENR|=1<<0; //使能TIM2时钟  RCC->APB2ENR|=1<<2;  

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

STM32的I/O口可以由软件配置成如下8种模式:输入浮空.输入上拉.输入下拉.模拟输入.开漏输出.推挽输出.推挽式复用功能及开漏复用功能.每个I/O口由7个寄存器来控制:配置模式的端口配置寄存器CRL和CRH(模式.速度):数据寄存器IDR和ODR:置位/复位寄存器BSRR:复位寄存器BRR:锁存寄存器LCKR. I/O口模式: GPIO的8种模式 通用输出 推挽输出(Puch-Pull) 可以输出高.低电平,连接数字器件   开漏输出(Open-Drain) 开漏引脚不连接外部的上拉电阻时,

stm32寄存器版学习笔记08 DMA

DMA(Direct Memory Access),直接存储器访问.DMA传输方式无需CPU直接控制传输,通过硬件为RAM与I/O设备开辟一条直接传送数据的通路,使CPU效率大大提高.stm32f103有2个DMA控制器,DMA1有7个通道,DMA2有5个通道,专门用来管理来自外设对存储器的访问请求,还有一个仲裁器来协调各个DMA请求的优先权. 1.DMA各通道请求 从外设产生的DMA请求通过逻辑"或"输入到DMA控制器,这就意味着同时只能有一个请求有效. 例如,串口1发送的DMA,就

stm32寄存器版学习笔记09 IIC

I²C(Inter-Integrated Circuit)总线是一种两线式串行总线,用于连接微控制器及其外设,是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据. IIC总线在传送数据过程中共有3种类型信号,分别是开始信号.结束信号和应答信号.   SCL SDA 开始信号 高电平 由高电平向低电平跳变,开始传送数据 结束信号 高电平 由低电平向高电平跳变,结束传送数据 应答信号 接收数据的IC在接收到8bit数据后向发送数据的IC发出特定的低电平脉冲,表示已经收到数据:CPU向受控单

C++Primer第5版学习笔记(三)

C++Primer第5版学习笔记(三) 第四/五章的重难点内容 你可以点击这里回顾第三章内容 因为第五章的内容比较少,因此和第四章的笔记内容合并.   第四章是和表达式有关的知识,表达式是C++的基础设施,本章由三部分组成:         1.表达式概念基础,包括表达式的基本概念,左值和右值的概念,优先级结合律,求值顺序.  2.各种运算符,主要包括算数\关系\逻辑\赋值\递增递减\成员访问\条件\位运算\sizeof\逗号运算符 这10种运算符.  3.类型转换,包括隐式和显式两种转换的规则

C++Primer第5版学习笔记(一)

C++Primer第5版学习笔记(一) 第一.二章的重难点内容 本篇文章主要记录了我在学习C++Primer(第5版,中文版)中遇到的重难点及其分析.因为第一.二章比较简单,因此这里合并这两章我遇到的问题.        第一章 开始 这一章在第一部分之前,是一个helloworld式的章节,包含基本的函数,io流以及类的介绍. 知识点1:P19,1.5,文件重定向 可以在windows下的cmd中或者mac,linux系统的终端窗口中用输入命令的形式执行程序并使它从一个文件中读入数据,再把标准

javascript权威指南第6版学习笔记

javascript权威指南第6版学习笔记 javascript数组.函数是特殊对象 看一点少一点. 3.1.4 hello.js内容是 var x=.3-.2;var y=.2-.1 console.log(x==y);console.log(x==.1);console.log(y==.1); 控制台输出结果: 3.1.5 var now = new Date();console.log(now); 3.2 文本 Javascript没有字符型,只有字符串. 16位怎么理解 3.10 变量作