STM32-SPI使用(ZT)

发布者:自由思想最新更新时间:2015-08-12 来源: eefocus关键字:STM32  SPI 手机看文章 扫描二维码
随时随地手机看文章
SPI知识:
      1)

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


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


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


     CPOL     CPHA        模式


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


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


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


                                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 引用地址:STM32-SPI使用(ZT)

上一篇:STM32多通道ADC规则转换实现
下一篇:STM32笔记(三)ADC、DMA、USART的综合练习

推荐阅读最新更新时间:2024-03-16 14:28

STM32】ADC库函数、一般步骤详解 实例:内部温度传感器
STM32F1xx官方资料: 《STM32中文参考手册V10》-第11章 模拟/数字转换(ADC) 《STM32中文参考手册V10》-第11章 第11.10小节 温度传感器 ADC采样数值 如何STM32的ADC模块,得到接入ADC管脚上的实际电压值? 会读到什么值 由于STM32的ADC是12位逐次逼近型的模拟数字转换器,也就是说ADC模块读到的数据是12位的数据。 因此:STM32读到的ADC值,是从0到4095(111111111111)。当把ADC引脚接了GND,读到的就是0;当把ADC引脚接了VDD,读到的就是4095。 读到的值怎么换算成实际的电压值 前面提到了,我们输入GND,读到的值是0,输入V
[单片机]
【<font color='red'>STM32</font>】ADC库函数、一般步骤详解 实例:内部温度传感器
STM32的USART0与ZigBee的P02_RX和P03_TX引脚实现串口双向通信
STM32的USART0与ZigBee的P02_RX和P03_TX引脚实现串口双向通信 BY:T7 Date:20171214 At:YSU_B307 开发环境: uVision : V5.12.0.0 STM32F103V8T6 库版本 : STM32F10x_StdPeriph_Lib_V3.5.0 一、硬件连接: 1. STM32: 2. Zigbee 3.力特Z-TEK ZY099 RS232 TO TTL(5V)串口转换器 兼容电平 232转TTL 4.九针串口线RS232线db9公对公交叉线 5.STM32到ZigBee的连线图 二、代码: 1.STM32代码 :功能:
[单片机]
<font color='red'>STM32</font>的USART0与ZigBee的P02_RX和P03_TX引脚实现串口双向通信
STM32(五)IIC通信原理及IO口软件模拟编程
一、IIC概述 I2C(IIC,Inter-Integrated Circuit),两线式串行总线,由PHILIPS公司开发用于连接微控制器及其外围设备。 它是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。在CPU与被控IC之间、IC与IC之间进行双向传送,高速IIC总线一般可达400kbps以上。 IIC是半双工通信方式。 多主机I2C总线系统结构: 二、I2C协议 1、空闲状态 I2C总线的SDA和SCL两条信号线同时处于高电平时,规定为总线的空闲状态。此时各个器件的输出级场效应管均处在截止状态,即释放总线,由两条信号线各自的上拉电阻把电平拉高。 2、开始信号
[单片机]
<font color='red'>STM32</font>(五)IIC通信原理及IO口软件模拟编程
多路数据采集系统的设计与实现
0 引言 随着物联网技术的发展与应用,A/D数据采集是其中一项重要的研究课题,A/D多路采集系统实现方案可以多种,通过对三种实现方案进行比较,最终采用STM32系列ARM芯片进行设计。STM32是基于ARM Cortex-M3内核的32位处理器,具有杰出的功耗控制以及众多的外设,并具有极高的性价比,目前正逐渐抢占了电子领域原有的51、AVR的市场。本设计中采用STM32F103RBT6作为主控制器,该芯片配置丰富,便于今后的系统功能扩展。 1 方案比较与论证 为实现多路数据采集要求,提出如下三种设计方案: (1)基于单片机的数据采集系统 本方案采用双单片机的方法,即在数据采集的远端、近端均采用单片机控制,远端完成
[单片机]
多路数据采集系统的设计与实现
STM32_SPI主从通信
今天讲解“STM32F103 SPI主从通信”,原本计划将这部分内容定在后面(第二阶段)来讲解,满足一位网友的问题“关于两块MCU的SPI通讯”,所以今天特地提前讲解了。 由于昨天讲解的是“SPI读写Flash”,MCU是作为SPI通信中的主机,今天主要讲解SPI通信的从机,我将我测试的主机和从机的代码分别打包供大家下载测试。 今天提供并讲解的软件工程,基于昨天的软件工程“SPI读写Flash”修改而来。若有疑问,请关注微信公众号“EmbeddDeveloper”获取更多信息。 今天的软件工程下载地址(360云盘 - 密码见微信): 主机: https://yunpan.cn/cPIJguDkjntYI 访问密码 7
[单片机]
STM32_<font color='red'>SPI</font>主从通信
使用STM32固件库函数操作控制LED灯
直接使用寄存器地址来进行STM32开发要对每一个寄存器的地址通过查找芯片手册,对每一个寄存器的各个位的含义也要查清楚,然后决定对那个地址的哪些位进行怎样的设置。这种编程效率低,程序的可移植性差,程序的可读性差。 STM32提供了对外设寄存器操作的功能函数,对寄存器操作只需要调用相应的库函数就可以,一般函数名单词组合与功能密切相关,增强了程序的可读性。 1、以CMSIS固件库项目为基础,在项目文件夹下新增 Lib 文件夹,在 Lib 文件夹下新增 inc 和 src 文件夹,在 inc 文件夹中复制 stm32f10x_gpio.h 和 stm32f10x_rcc.h 两个头文件,在 src 文件夹中复制 stm
[单片机]
使用<font color='red'>STM32</font>固件库函数操作控制LED灯
IOTA基金会与意法半导体联手加速物联网技术整合
IOTA基金会是一家非营利组织,提供世界上第一个可扩展,无损且完全分散的分布式账本技术,正在与意法半导体合作,创建一个新级别的强大,无缝且经济高效的物联网接入功能。 这项合作的基石是将IOTA Tangle(一种免费的点对点技术解决方案)集成到ST的STM32Cube扩展软件中,该软件用于业界领先的STM32 32位MCU生态系统X-CUBE-IOTA1。 这种关系将为ST用户社区提供物联网集成功能,使客户能够轻松快速地为单个或多个设备创建和构建新的物联网解决方案。同样重要的是,开发人员可以在享受通过IOTA功能开发系统,环境,产品和服务的能力的同时工作,以及Tangle分布式,高度可扩展的点对点网络和无感结构等强大功能。 “通过
[单片机]
嵌入式系统中可配置式GPIO模拟SPI总线方法
在嵌入式系统处理器中有相当一部分处理器不带SPI接口,但基丁SPI接口的设备非常丰富,此外,SPI设备的不同以及处理器对GPIO口位寻址是否支持各处理器各有不同,因而不同处理器中软件模拟GPIO也各不相同。若能提供一种通用可配置可移植的GPIO模拟SPI总线的驱动则能很方便快捷的访问SPI设备,从而提高整个嵌入式系统的开发效率。本文针对GPIO口位寻址与否给出方面,给出了一种可配置GPIO模拟SPI总线的方法并详细介绍了其设计与实现过程,且具有代码小可移植性强使用方便等特点。 1 GPIO规范 SPI是一个全双工的串行接口。它设计成可以在一个给定总线上处理多个互联的主机和从机。在一定数据传输过程中,接口上只能有一个丰机和一个从
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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