STM32SPI读写函数

发布者:WhisperingWaves最新更新时间:2016-07-27 来源: eefocus关键字:STM32  SPI读写函数 手机看文章 扫描二维码
随时随地手机看文章

//SPIx 读写一个字节

//TxData:要写入的字节

//返回值:读取到的字节

u8 SPIx_ReadWriteByte(u8 TxData)

{                                                              

         while((SPI1->SR&(1<<1))==0);           

         SPI1->DR=TxData;            //发送一个byte          

         while((SPI1->SR&(1<<0))==0);                                                           

         returnSPI1->DR;          //返回收到的数据                                  

}

 

对于这样的读写函数曾有这样的疑惑,读就是读写就写为什么要放一起呢。这样是不是很麻烦,查询相关资料有如下解答。

 

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(u8data)

​{

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(u8data){ 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); }

关键字:STM32  SPI读写函数 引用地址:STM32SPI读写函数

上一篇:stm32的堆与栈
下一篇:S3C2440、S3C2450和S3C6410之间区别

推荐阅读最新更新时间:2024-03-16 15:01

卡尔曼滤波方式研究
前段时间在论坛里简单地发了一些关于kalman的理解。 有很多网友顶贴的,趁着今天休息,整理一下前段时间的工作。 有些理解和说法可能不正确,以此抛砖引玉吧。 1, 在google上搜索卡尔曼滤波,很容易找到以下这个帖子: http://blog.csdn.net/lanbing510/article/details/8828109 这里面很简单形象的解释了kalman的作用。 但是帖子后半段,将kalman回归到了一大堆数学推理、推导上,对非数学专业,或者数学基础尤其是概率和随机过程基础不好的同学来讲实在太过头痛。 帖子最后用matlab实现了kalman,其中很简单地用i,j,k来命名,可能不是太妥当,新手理解的时候,脑袋里面
[单片机]
STM32使用模拟IIC操作EEPROM
贴出stm32f103vet6使用模拟IIC操作EEPROM的代码: 头文件部分i2c.h #ifndef _i2c_H_ #define _i2c_H_ #include stm32f10x.h #define countof(a) (sizeof(a)/sizeof(*(a))) #define GPIOA_IDR_Addr (GPIOA_BASE + 8) //0x40010808 #define GPIOB_IDR_Addr (GPIOB_BASE + 8) // /*位带操作,实现51类似的GPIO控制功能*/ /*IO口操作宏定义 */ #define BITBAND(addr, bitnum) (
[单片机]
stm32 M3启动文件解析
DATA_IN_ExtSRAM EQU 0 ;;1定义是否使用外部SRAM,为1则使用,为0则表示不使用 Stack_Size EQU 0x00000400 ;;2定义栈空间大小为0x00000400个字 AREA STACK, NOINIT, READWRITE, ALIGN = 3 ;;3伪指令AREA,定义一个段 Stack_Mem SPACE Stack_Size ;;4开辟一段大小为Stack_Size的内存空间作为栈。 __initial_sp ;;5标号__initial_sp,表示栈空间顶地址。 Heap_Size EQU 0x00000400 ;;6定义堆空间大小为0x00000400个字节,也为1Kbyte。
[单片机]
STM32的8种GPIO模式理解
最近在看数据手册的时候,发现STM32的GPIO输入输出模式的配置种类有8种之多(输入和输入各4种): (1)GPIO_Mode_AIN模拟输入 (2)GPIO_Mode_IN_FLOATING浮空输入 (3)GPIO_Mode_IPD下拉输入 (4)GPIO_Mode_IPU上拉输入 (5)GPIO_Mode_Out_OD开漏输出 (6)GPIO_Mode_Out_PP推挽输出 (7)GPIO_Mode_AF_OD复用开漏输出 (8)GPIO_Mode_AF_PP复用推挽输出 我们平时接触的最多的也就是推挽输出、开漏输出、上拉输入这三种,但对于各种模式下IO口的内部电路和典型应用,STM32的数据手册中也未曾做过详细的说明和归纳
[单片机]
STM32单片机之ADC学习总结
因为公司的产品上需要使用AD来检测电池电压,要求不是很高,突然想用下DMA+ADC+TIM,以前以为很简单,实际使用中让我觉得很惭愧,遇到的问题让我一下子蒙了,不停的查资料,不停的测试,终于一个一个的问题都解决了,同时对stm32的ADC有了新的认识,并且打算再闲暇时间内将stm32的资源尽量的实践下。 我用的是STM32F4 来调试ADC3+DMA+TIM1(单通道),首先我先查看了下DMA的资料,之后参考官方提供的ADC3+DMA很快可以正常读取数据,之后我直接添加定时器触发AD转换,结果失败,我开始查资料看手册,逐渐对这三者之间的关系有了一个认识 首先定时器产生触发信号,AD检测到转换信号后开始转换,每转换
[单片机]
<font color='red'>STM32</font>单片机之ADC学习总结
STM32(Cortex-M3)中的优先级理解
很多人在配置STM32中断时对固件库中的这个函数NVIC_PriorityGroupConfig() 配置优先级分组方式,会很不理解,尤其是看中文翻译版的,因为中文翻译版里把这里翻译成 先占优先级和从优先级 这样翻译其实是不对的,很容易让人误解。为了便于大家理解,有必要先解释两个概念: 抢占式优先级/响应优先级: STM32(Cortex-M3)中有两个优先级的概念 抢占式优先级和响应优先级,有人把响应优先级称作'亚优先级'或'副优先级',每个中断源都需要被指定这两种优先级。 具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的
[单片机]
STM32 HAL 库学习笔记之-------(系统时钟配置)
使用CubeMX工具,让开发者不用理会底层的实现,是整个配置变简单 一、准备工具STM32_CubeMX ST官网可下载 http://www.st.com/content/st_com/en/search.html#q=cubemx-t=tools-page=1 二、打开STM32_CubeMX开始配置,使用内部RC,最大倍频至64MHZ,芯片大于64MHZ,应该选择HSE 已STM32F103为例子 HSI配置 HSE配置 三、以下是STM32F103 HES 72MHZ配置例子: 工具生成基本直接可以使用,需要注意是,外部晶振源,有8khz(默认),12khz,可以在System_stm32f1xx.h修改
[单片机]
stm32 开发环境MDK+库文件配置
stm32 是一款arm cortex-m3 架构的芯片 结合库函数使用 可以更方便的实现各种功能 尤其是结合各种总线开发应用时 因为库函数已经封装很多总线的处理方法和驱动 直接调用对应库函数 就可以操作各个总线 相比于 直接操作寄存器来说 操作I2C SPI CAN 等总线结构 会简单很多 stm32 的开发工具有很多MDK ADS AVR 等 我用的是MDk 其实就是可以编译arm的keil 界面和keil是一样的 之前安装过keil 直接把MDK 覆盖原来的keil 就可以支持51单片机和arm的芯片的开发 MDK官网下载地址 : https://www.keil.com/arm/demo/eval/arm.htm stm
[单片机]
<font color='red'>stm32</font> 开发环境MDK+库文件配置
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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