STM32 SPI 收发数据 ---规则 + 问题解析

发布者:学思者最新更新时间:2019-04-28 来源: eefocus关键字:STM32  SPI  收发数据 手机看文章 扫描二维码
随时随地手机看文章

规则:

1) 

高速同步串行口。3~4线接口(CS ,CLK ,MOSI,MISO),收发独立、可同步进行。

2)SPI分为主从模式,主模式提供时钟和片选选择信号.

3) 模式控制:CPOL用来控制时钟信号(clk)在空闲时候的状态;CPHA用来控制采样时刻时CLK的边缘动作。

CPOL CPHA 模式:

0 0 CLK空闲时为低电平,CLK上升沿采样数据。

0 1 CLK空闲为低电平,CLK下降沿采样数据。

1 0 CLK空闲时为高电平,CLK上升沿采样数据。

1 1 CLK空闲时为高电平,CLK下降沿采样数据。



1)SPI配置(3.01库):

SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //双工模式

SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //SPI主模式

SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //8bit数据

SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //CLK空闲时为高电平 

SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //CLK上升沿采样,因为上升沿是第二个边沿动作,所以也可以理解为第二个边沿采样

SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //片选用软件控制

SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4; //SPI频率

SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //高位在前

SPI_InitStructure.SPI_CRCPolynomial = 7; //crc7,stm32spi带硬件ecc

SPI_Init(SPI1, &SPI_InitStructure);



2)CS信号:

主模式下要为从设备提供片选信号,值得注意的是STM32的主频相当较高,要提防数据没有完全发送前拉高CS信号。 



3)SPI读写:(非中断模式)

a)写一个字节:

while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

//确保发生前Buffer为空,也就是说上一次已经发生完成

SPI_I2S_SendData(SPI1, Data); //往寄存器中写入一个字节

while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);

//等待接受到一个字节数据,为什么要这么做?加这一句的原因是为了确保这个字节已经发送出去,因为发生和接受是并行同步进行,那就是说你发生出去一个字节意味着你收到一个字节。所以这样判断完全没有问题,再说必要性,如果你不加这句你就会容易犯过早拉高CS信号的错误,你想想如果在SPI_I2S_SendData(SPI1, Data)后面立即拉高CS是什么后果。

SPI_I2S_ReceiveData(SPI1); //都会接收到的数据,看起来没什么必要,但以用stm32的经验推荐这样做,也许会有意想不到的收获。




SPI_Writebyte(u8 data)

{

while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

SPI_I2S_SendData(SPI1, Data); 

while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); 

SPI_I2S_ReceiveData(SPI1); 

}



b)读一个字节:



读的时候要注意一个问题,因为从模式是没法提供时钟的,所以主模式下必须要在接收的同时提供时钟。办法就是发送一个字节来实现,因为还是上面说的,发送一个字节就意味着收到一个字节,代码和写完全一样,只要把读出来的字节保存即可。




u8 SPI_Readbyte(u8 data)

while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

SPI_I2S_SendData(SPI1, Data);    //发送与应用不相关的数据,为后续的读数据提供时钟信号

while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); 

return SPI_I2S_ReceiveData(SPI1); 

}



总结:上面的程序是最求稳定而设定的,如果你对速度有要求,你可以做相应的精简,比如读写直接对寄存器进行操作,另外配置SPI前要对从模式的模式了解清楚,包括从设备支持的时钟范围和模式(CPOL,CPHA状态)。

以上出自:STM32 SPI使用知识



问题及解析:

1、全双工模式下,发送一个8位的数据,接收到的数据是什么? 


 经实验观察,没看出什么联系。当然,这里所说的是发送无用的数据,而非 某些特定环境 说:发送一个数据(命令),应该能够接收到什么.....




2、接收数据时,示波器观察到MISO引脚 不是方波,下降沿特别圆滑,看着像是电容放电的节奏。


那阵子貌似在弄 ADS1256这款A/D片子,遇到这么个情况。  最后定位为 :


SPI配置:SPI_InitStructure.SPI_BaudRatePrescaler = **;---合适就好,过犹不及................



关键字:STM32  SPI  收发数据 引用地址:STM32 SPI 收发数据 ---规则 + 问题解析

上一篇:STM32F4 SPI NSS硬件模式配置及使用
下一篇:stm32 SPI通信[操作寄存器+库函数]

推荐阅读最新更新时间:2024-11-01 11:58

stm32 基本定时器TIM6、TIM7的使用
基本定时器只具备最基本的定时功能,就是累加的时钟脉冲数超过预定值时,能触发中断或触发DMA请求。 使用基本定时器的定时功能需要进行以下设置: 1)使能定时器的时钟。 2)设置预分频数。 3)设置计数器值。 4)设置采样分频数。 5)设置计数方式,向上还是向下计数,其中TIM6、TIM7只有向上计数功能。 6)使能中断,配置中断分组及中断服务函数。 配置函数如下: /********************************************************** ** 函数名: TIM6_Config ** 功能描述: 基本定时器配置 ** 输入参数: 无 ** 输出参数: 无 ** 说明:定时时间=(预分频
[单片机]
STM32_ADC单通道单次采集
今天讲解“STM32F103 ADC单通道单次采集”功能。 今天提供并讲解的软件工程,基于软件工程“A0.0.0(STM32F10x_TIM延时)”修改而来。若不知道如何而来,请关注微信公众号“EmbeddDeveloper”获取更多信息。 本着免费分享的原则,将讲解的工程源代码分享给大家,还望看到的朋友关注一下微信公众号,增加一下人气。 每天提供下载的“软件工程”都是在硬件板子上进行多次测试、并保证没问题才上传至360云盘。 今天的软件工程下载地址(360云盘): https://yunpan.cn/cPGrE6DLHX24R 访问密码 de4f STM32F10x的资料可以在我360云盘下载: https:/
[单片机]
STM32_ADC单通道单次采集
STM32基础实验3(串口通信)
一、实验原理 简单串口通信实例 1、串口设置的一般步骤可以总结为如下几个步骤: 1) 串口时钟使能,GPIO时钟使能 2) 串口复位 3) GPIO端口模式设置 4) 串口参数初始化 5) 开启中断并且初始化NVIC(如果需要开启中断才需要这个步骤) 6) 使能串口 7) 编写中断处理函数 2、具体函数实现 1)串口时钟使能,GPIO时钟使能:RCC_APB2PeriphClockCmd(); //①串口时钟使能,GPIO时钟使能 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//GPIOA时钟使能 RCC_APB2PeriphC
[单片机]
<font color='red'>STM32</font>基础实验3(串口通信)
STM32学习记录17 串口一键下载
1.MCUISP串口软件一键下载设置: DTR低电平复位,RTS高电平进入bootload串口下载 在ch340芯片对应DTR和RTS输出电平与电脑软件设置的电平相反。一键下载电路根据ch340芯片对应引脚的控制信号完成对应功能具体实现过程如下: 2.单片机启动设置单片机低电平复位 Boot0=0,boot1=x,从用户区flash启动Boot0=1,boot1=0,进入串口下载区Boot0=1,boot1=1,从SRAM启动改变boot0电平就可以从不同区域启动 3.一键下载电路如下: 4.当MUCISP软件点击下载后(需要选中下载后执行):DTR#,RTS#信号由MUCISP软件控制MUCISP软件设置为:
[单片机]
<font color='red'>STM32</font>学习记录17 串口一键下载
STM32出现HardFault_Handler故障的原因及处理方法整理
STM32出现HardFault_Handler故障的原因主要有两个方面: 1、内存溢出或者访问越界。这个需要自己写程序的时候规范代码,遇到了需要慢慢排查。 2、堆栈溢出。增加堆栈的大小。 出现问题时排查的方法: 1、发生异常之后可首先查看LR寄存器中的值,确定当前使用堆栈为MSP或PSP,然后找到相应堆栈的指针,并在内存中查看相应堆栈里的内容。由于异常发生时,内核将R0~R3、R12、Return address、PSR、LR寄存器依次入栈,其中Return address即为发生异常前PC将要执行的下一条指令地址,因此在堆栈中反数第三个字即为出错位置。 2、默认的HardFault_Handler处理方法是B .将它
[单片机]
关于 STM32 SPI 从机模式的问题
网上有很多关于STM32 作为从机来使用 的 问题 主要还是 从机接收数据错误 1 关于主从机的 时钟悬空配置 可以肯定的说 主机与从机的时钟悬空一定要配成一样的 这点STM 的官方手册说的很明白 2 从机的波特率 只与 主机提供的 CLK 信号有关 3 通信失败 或者 数据接收错误 问题就出在从机对SPI 的起始信号的判断上面 当使用TI 模式 NSS 信号由硬件 从机对数据的捕获 就很容易 若没有NSS 信号呢 因为STM32 SPI普通模式 根本就没有对数据的捕获 做什么工作 真的有点糊弄我们 它 只是 当我们把SPI 打开 他就开始进行捕获 而不管SCK 此时是闲置的还是忙的 这就造成
[单片机]
基于STM32的智能笔筒设计
简介:本文基于STM32F103VET6单片机设计了智能笔筒。该设计充分利用此单片机的FSMC,SDIO和SPI等片上资源,结合MP3解码技术、图像解码技术和蓝牙通信技术等多种技术实现笔筒的智能化。此笔筒不仅满足常用的功能,且还可在液晶屏上查看电子相册、听MP3歌曲、玩小游戏。此外还可显示周围环境的温湿度和光线强度,具有节假日和预设提醒等功能。 1 智能笔筒硬件设计 1.1 硬件总体结构 系统硬件以STM32F103VET6为核心,硬件框图如图1所示。 传感器感知模块包括温湿度传感器、光敏传感器和人体感应传感器,用于获取当前环境的参数;声光模块包括7色LED灯和蜂鸣器,使笔筒更加绚丽并具有提示功能;以触摸屏为
[单片机]
基于<font color='red'>STM32</font>的智能笔筒设计
STM32 通用底层函数集锦, 自用
#include xustm32.h #include xucommon.h //#define COM_DEBUG #include xudebug.h //-------------------- STM32通用函数集锦 --------------------------------------------------- #if 0 HardFault_Handler PROC ; EXPORT HardFault_Handler ; B . IMPORT hard_fault_handler_c TST LR, #4 ITE EQ
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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