STM32-快速上手SPI

发布者:钱币之歌最新更新时间:2022-04-20 来源: eefocus关键字:STM32  SPI 手机看文章 扫描二维码
随时随地手机看文章

1 概述

基本的部分前文《STM32-SPI》已经介绍过了,这里只记怎么用。


1.1 引脚映射

STM32F103ZET6的三个SPI的引脚分别为


SPI1_SCK     PA5(21)

SPI1_MISO  PA6 (22)

SPI1_MOSI  PA7 (23)

SPI1_NSS    PA4(20)

SPI2_SCK   PB13(34)

SPI2_MISO  PB14(35)

SPI2_MOSI  PB15(36)

SPI2_NSS   PB12(33)

SPI3_SCK   PB3(55)

SPI3_MISO  PB4(56)

SPI3_MOSI  PB5(57)

SPI3_NSS   PA15(50)

 1.2 时钟源

SPI1在APB1时钟下,SPI2和SPI3在APB2时钟下。


2 常用库函数

void SPI_I2S_DeInit(SPI_TypeDef* SPIx);

void SPI_Init(SPI_TypeDef* SPIx, SPI_InitTypeDef* SPI_InitStruct);

void I2S_Init(SPI_TypeDef* SPIx, I2S_InitTypeDef* I2S_InitStruct);

void SPI_StructInit(SPI_InitTypeDef* SPI_InitStruct);

void I2S_StructInit(I2S_InitTypeDef* I2S_InitStruct);

void SPI_Cmd(SPI_TypeDef* SPIx, FunctionalState NewState);

void I2S_Cmd(SPI_TypeDef* SPIx, FunctionalState NewState);

void SPI_I2S_ITConfig(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT, FunctionalState NewState);

void SPI_I2S_DMACmd(SPI_TypeDef* SPIx, uint16_t SPI_I2S_DMAReq, FunctionalState NewState);

void SPI_I2S_SendData(SPI_TypeDef* SPIx, uint16_t Data);

uint16_t SPI_I2S_ReceiveData(SPI_TypeDef* SPIx);

void SPI_NSSInternalSoftwareConfig(SPI_TypeDef* SPIx, uint16_t SPI_NSSInternalSoft);

void SPI_SSOutputCmd(SPI_TypeDef* SPIx, FunctionalState NewState);

void SPI_DataSizeConfig(SPI_TypeDef* SPIx, uint16_t SPI_DataSize);

void SPI_TransmitCRC(SPI_TypeDef* SPIx);

void SPI_CalculateCRC(SPI_TypeDef* SPIx, FunctionalState NewState);

uint16_t SPI_GetCRC(SPI_TypeDef* SPIx, uint8_t SPI_CRC);

uint16_t SPI_GetCRCPolynomial(SPI_TypeDef* SPIx);

void SPI_BiDirectionalLineConfig(SPI_TypeDef* SPIx, uint16_t SPI_Direction);

FlagStatus SPI_I2S_GetFlagStatus(SPI_TypeDef* SPIx, uint16_t SPI_I2S_FLAG);

void SPI_I2S_ClearFlag(SPI_TypeDef* SPIx, uint16_t SPI_I2S_FLAG);

ITStatus SPI_I2S_GetITStatus(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT);

void SPI_I2S_ClearITPendingBit(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT);


 注意:hal库函数有个容易犯错的地方。


F4可以设置一次传输最小单位为一个字节或两个字节。但是发送函数接收的缓存参数都是指向u8类型的指针,但是函数参数Size表示的并不是字节数,而是“amount of data to be sent”,要发送的最小单位的数量。比如,每帧4个字节,设置SPI databits 为16位,那么调用HAL_SPI_Transmit函数时,Size=2。


HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout);


3 代码范例

void SPI2_Init(void)

{

  GPIO_InitTypeDef GPIO_InitStructure;

    SPI_InitTypeDef  SPI_InitStructure;

 

RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE );//PORTB时钟使能 

RCC_APB1PeriphClockCmd( RCC_APB1Periph_SPI2,  ENABLE );//SPI2时钟使能

 

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //PB13/14/15复用推挽输出 

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB

 

  GPIO_SetBits(GPIOB,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);  //PB13/14/15上拉

 

SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工

SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //设置SPI工作模式:设置为主SPI

SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //设置SPI的数据大小:SPI发送接收8位帧结构

SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //串行同步时钟的空闲状态为高电平

SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //串行同步时钟的第二个跳变沿(上升或下降)数据被采样

SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制

SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //定义波特率预分频的值:波特率预分频值为256

SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始

SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC值计算的多项式

SPI_Init(SPI2, &SPI_InitStructure);  //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器

 

SPI_Cmd(SPI2, ENABLE); //使能SPI外设

SPI2_ReadWriteByte(0xff);//启动传输

}

关键字:STM32  SPI 引用地址:STM32-快速上手SPI

上一篇:【MCP3208/MCP3204】STM32多通道AD采集
下一篇:STM32-SPI

推荐阅读最新更新时间:2024-11-10 22:46

【菜鸟入门】stm32 之 iic
纠结了两天,终于重新开始写了,这两天一直卡在硬件iic上,由于硬件iic是比较难啃的一块骨头,问题一大堆,明明感觉配置好,测试时,一会出这个问题,一会出那个问题,哎,说多了都是泪。。。。 最后木有办法了,总不能吊死在一棵树上吧,然后就写了个模拟的iic的,由于对iic研究和应用的比较多(我们实验室的设备都是iic通信的,所有设备的驱动都是我来写的),所以在搞这个的时候得心应手,一个小时就把所有的搞定了,有花了1个小时把eeprom(at24c02)调通; 我大致测了下,我的板子上的eeprom电路类似这个: 所以我要做的是就是把PB6配置称时钟线SCL,PB7配置成数据线SDA 这里我们再配置输出的时候,要把管脚配
[单片机]
【菜鸟入门】<font color='red'>stm32</font> 之 iic
STM32学习总结之Sysstick(系统滴答定时器)
学习内容: 1、Cortex-M3 在内核部分 包含了一个简单的定时器——SysTick timer STM32内核有一个定时器。 2、有定时器就需要有时钟源,时钟源可以是内部的还可以是外部的,需要阅读使用手册确定什么作为时钟源。 在STM32 中SysTick 以 HCLK(AHB 时钟)或HCLK/8 作为运行时钟 3、SysTick 是一个24 位的定时器,即一次最多可以计数2^24 个时钟脉冲,这 个脉冲计数值被保存到 当前计数值寄存器STK_VAL(SysTick current value register) 中,只能向下计数,每接收到一个时钟脉冲STK_VAL 的值就向下减1,直至0,当STK_VAL 的值被
[单片机]
<font color='red'>STM32</font>学习总结之Sysstick(系统滴答定时器)
LPC2214 SPI及UART初始化程序
//SPI1口发数 void spi1senddata(uint8 data) { IO0CLR = le58_ctrl_cs; // 片选 S1PDR = data; while(0==(S1PSR&0x80)); // 等待SPIF置位,即等待数据发送完毕 IO0SET = le58_ctrl_cs; } /**************************************************************************** * 名称:UART0_Init() * 功能:串口工作参数设置。 * 入口参数:无 * 出口参数:无 ******************
[单片机]
stm32 SD卡
容量等级 SD容量有8MB、16MB、32MB、64MB、128MB、256MB、512MB、1GB、2GB SDHC容量有2GB 、4GB、8GB、16GB、32GB SDXC容量有32GB、48GB、64GB、128GB、256GB、512GB、1TB、2TB SD卡寄存器 命令格式 所有命令均遵守此格式,总共48位。一个起始位,一个方向位,6个命令位,32位参数(有些命令需要),CRC 7位校验,1个停止位 Command Classes 注: 命令详细解释见SD卡2.0协议 部分命令 应答 应答格式有多种,以R1举例 初始化流程 以SPI模式举例 典型初始化流程 1.使能SPI时钟 2.使能GPIO
[单片机]
<font color='red'>stm32</font> SD卡
STM32-快速上手输入捕获
配置步骤 使能定时器(通用定时器在APB1下)和相关IO(APB2下)时钟 void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState); void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState); 初始化IO口为输入模式 void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct); 初始化定时器(主要是配置ARR和PSC) void TIM_TimeBas
[单片机]
STM32 CAN 波特率、采样点设置
为了总结在STM32上设置CAN波特率和采样点,所以整理自己的理解如下: 一,CAN波特率 1.CAN位时序 2.公式推导 这里Tpclk理解成CAN时钟的周期(实际上CAN使用APB1时钟) 根据图中公式有: (1) 正常的位时间(Tnbt) = (1+Tbs1 + Tbs2)*Tq (2) Tq = (BRP+1)*Tpclk 设CAN时钟频率为Fpclk,则有 (3) Tq = (BRP+1)/Fpclk 由(1),(3)有: (4) Tnbt =(1+Tbs1 + Tbs2)* (BRP+1) / Fpclk 由(4)知CAN输出波特率(Fcan = 1 / Tnbt )为:
[单片机]
<font color='red'>STM32</font> CAN 波特率、采样点设置
STM32达人的GPIO使用心得
1. 我使用GPIO的不同就是,GPIO 操作是直接动用了STM32内部的寄存器的.虽说库好用,但对于某些IO 操作,很多人都会嫌库的效率底下(包括我自己在内),总得对STM32 的寄存器看两眼的吧,不然还不敢叫STM32 达人! 2. 当然了,即使直接操作寄存器了,但一些方便的宏定义还是用库里面的好,反正宏定义本身并不影响效率.这里要说一下MDK 的一个重要技巧,就是把工程编译完以后,在变量或函数体上按下F12 键,就会自动跳转到这个变量或函数的定义处.要研究库代码,这个技巧必不可少,不然在大堆C文件里找一个定义是相当累人的. 大家看看ST 官方库里面对各个寄存器的定义,是使用结构体的,可谓相当有技巧,首先要定义几个基础
[单片机]
关于stm32的USB和SPI疑似存在干扰的问题
情况是这样的,最近做一个项目,使用的是stm32f103RE单片机,使用到了单片机的usb口和SPI1。USB虚拟成串口向上位机发送数据,已经通过修改官网的例程调试通过,SPI1也能正常工作。但是当把两个功能做在同一个工程中时,发现出现了一些问题:USB想上位机发送一段时间后会停止发送(我的程序是在while中一直发送);USB发送会出现乱码。当我把SPI1的读写函数注释掉之后上述问题有消失了。这个问题纠结了我好几天了,不知道各位高手能不能帮我解答解答。 调试发现程序停在了while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);中,但是之前没有添加USB功能模块
[单片机]

推荐帖子

vs2005同开发板连接问题
各位大虾们,我现在用PCM-3586(CPU:vortex86DX)的板子开发一个程序,现在遇到了一个很棘手的问题,就是开发板不能同vs2005连接进行调试程序,必须通过U盘拷到板子上面去,非常麻烦。前几天试过用一根双公口的USB线让板子同PC连起来,但失败了。我的这块板子上的是ce6.0的操作系统,板子上有一个网口,四个串口,两个普通的USB口,请问如何才能让板子与PC连接起来?最好是能通过网口与PC机相连,如网口不行也可以用其它的口。只要能够在线调试程序都行,请各位大虾们支支招啊,被这个问
znstchhh 嵌入式系统
阿牛哥参加太阳能风能展和军民两用技术展览会见闻
9月19日下午阿牛哥赶往静安庄国展中心参观太阳能风能展和军民两用技术展览会。快到中秋节和国庆节了,但是会场里观众很多。光伏产品和风能发电是热点,有一些太阳能基板材料供应商,有很多是德国和奥地利的公司。很奇怪这次无锡尚德没有参展。阿牛哥和北京一些参展商沟通,很多是光伏并网发电系统。还有国家电网公司下属的几个媒体朋友也组织展位,看来太阳能和风能是很热的。阿牛哥在会展上有看到了目录分销商派睿电子的展台,厚厚的产品目录,还有技术支持。今年派睿电子的业务很不错,看看展台上派睿电子的朋友耐心的解答就知
jameswangsynnex 电源技术
【复旦微车规MCU FM33FT0A 系列】--LVGL移植
开发板MCU型号FM33FT056A,CodeFlash384KB,RAM32KB,移植lvglRAM略偏小,移植时要注意些裁剪。一.了解LVGL及库准备1.了解LVGLLVGL全称LightandVersatileGraphicsLibrary,轻量化和多功能的图形库,遵循MIT开源许可协议,具有以下特性(whatLVGLcandoforyou)。(1)对硬件的要求CPU:16、32、64位主频:推荐16MHzFla
dirty 汽车电子
TS101开发板link port与主机通信问题
请教各位高手,如何实现TS101开发板上linkport与主机的通信,有专用的linkport连接线缆可用吗?TS101开发板linkport与主机通信问题先自己顶一下,拜谢高手回复!!!
loboyang DSP 与 ARM 处理器
转来的一个ucos在51单片机上面跑的例子
前言想了很久,要不要写这篇文章?最后觉得对操作系统感兴趣的人还是很多,写吧.我不一定能造出玉,但我可以抛出砖.包括我在内的很多人都对51使用操作系统呈悲观态度,因为51的片上资源太少.但对于很多要求不高的系统来说,使用操作系统可以使代码变得更直观,易于维护,所以在51上仍有操作系统的生存机会.流行的uCos,Tiny51等,其实都不适合在2051这样的片子上用,占资源较多,唯有自已动手,以不变应万变,才能让51也有操作系统可用.这篇贴子的目的,是教会大家如何现场写一个OS,而不是给大
njlianjian 实时操作系统RTOS
【翌创ET6001测评】以KEY控制LED
为了一种GPIO口的输入功能,特为它配置了一个触摸式按键以控制LED的亮灭。其中,将GPIO2_4与开发板上的LED9相连;将GPIO2_3与触摸式按键的输出引脚相连。为对按键连接引脚的配置,相应的函数为:staticvoidKEY_Init(void){IOC_Init_TypeDefinit;IOC_ConfigStructInit(&init);init.mode=IOC_AF_MODE_3;init.dir=GPIO_DIR_IN_
jinglixixi 国产芯片交流
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved