今天使用STM32F407读取flash中的数据的实验中,发现一个问题读取到的问题一直不对,找了半天问题,后面找到原子的例程看了一下,发现是SPI数据的读取与发送函数写的有问题,我原本的发送与接收函数是单独的两个函数,而原子的发送与接收函数全都放在 一起。看了半天没搞懂为什么要这么写,但这么写读写确实正常,网上找了找终于找到了一个解答,因此分享出来,方便自己记忆也方便遇到同样问题的人能尽快找到解决办法。
u8 SPI1_ReadWriteByte(u8 TxData)
{
while((SPI1->SR & SPI_I2S_FLAG_TXE) == (uint16_t)RESET);
SPI_I2S_SendData(SPI1, TxData);
while((SPI1->SR & SPI_I2S_FLAG_RXNE) == (uint16_t)RESET);
return SPI_I2S_ReceiveData(SPI1);
}
发送与接收为什么这么写?
首先我们 要知道数据寄存器(SPIX->DR)分为 2 个缓冲区,一个用于写入(发送缓冲区),一个用于读取(接收缓冲 区)。对数据寄存器执行写操作时,数据将写入发送缓冲区,从数据寄存器执行读取时,将返回接收缓冲区中的值。因此这样写并不会出现读到的数据等于发送的数据,而且发送与接收在全双工通信模式下是并行进行的。另一个要注意的问题,因为从模式是没法提供时钟的,所以主模式下必须要在接收的同时提供时钟。办法就是发送一个字节来实现,因为还是上面说的,发送一个字节就意味着收到一个字节,代码和写完全一样,只要把读出来的字节保存即可。
关键字:STM32 SPI发送 接收 函数实现
引用地址:
STM32 SPI发送与接收用一个函数实现的问题
推荐阅读最新更新时间:2024-11-12 13:33
STM32 TFT学习笔记——刷屏
主机环境:Windows 7 SP1 开发环境:MDK5.14 目标板:ST NUCLEO-F303RE TFT型号:2.4英寸,带触摸,SD卡,240*320分辨率,26万色 驱动IC:ILI9325 ST库版本:STM32Cube_FW_F3_V1.1.0 之前已经正确读取了ILI9325的ID号,现在编辑以下刷屏代码,以固定颜色填充满整个LCD屏幕,最重要的一步是对ILI9325进行初始化配置,对着文档写入各个寄存器的值。尤其是电源控制寄存器。初始化列表如下 /*********************************************************************
[单片机]
对比stm32,arm9研究方向的猜想
大二上的寒假,受老师的邀请,去到东莞实习了10天。虽然不是第一次去,但是这次的体会和上次有了很大的不同。这篇文章本来想从东莞回来就写了,但是一直拖到现在才写。在东莞,我工作位置的旁边是一个约27岁的大学生,他的职位大概是嵌入式工程师,他每天都在使用上了ucos2的STM32芯片进行编程。刚好我在学ARM9+LINUX,于是有时候我们也私下讨论了一下STM32和ARM9的那些事儿。 STM32是这几年很火的,有哈佛架构,性价比高,开发使用的函数库齐全等优点,这个芯片我本来也想在大一下的时候买块开发板来学,不过后来项目需要,所以学了ARM9。 在讲之前,问一个问题。假设有这样的一个项目,让你做一个数字示波器的控制和显示部分的
[单片机]
stm32的ADC之规则组和注入组
STM32的每个ADC模块通过内部的模拟多路开关,可以切换到不同的输入通道并进行转换。STM32特别地加入了多种成组转换的模式,可以由程序设置好之后,对多个模拟通道自动地进行逐个地采样转换。 有2种划分转换组的方式:规则通道组和注入通道组。通常规则通道组中可以安排最多16个通道,而注入通道组可以安排最多4个通道。 在执行规则通道组扫描转换时,如有例外处理则可启用注入通道组的转换。 一个不太恰当的比喻是:规则通道组的转换好比是程序的正常执行,而注入通道组的转换则好比是程序正常执行之外的一个中断处理程序。 ----------------------------------------------------------
[单片机]
STM32入门开发: 制作红外线遥控器(智能居家-万能遥控器)
一、环境介绍 MCU: STM32F103ZET6 编程软件环境: keil5 红外线传输协议: NEC协议---38KHZ载波:。NEC协议是红外遥控协议中常见的一种。 编码发送思路: 延时函数模拟38KHZ + PWM产生38KHZ两种方式 代码风格: 模块化编程,寄存器直接操作方式 完整keil工程源码下载(解压即可编译运行测试): https://download.csdn.net/download/xiaolong1126626497/19863305 二、NEC协议与相关硬件介绍 2.1 NEC协议介绍 NEC协议在上篇 STM32入门开发: NEC红外线协议解码(超低成本无线传输方案)
[单片机]
STM32学习笔记:ESP8266模块(1)
由于项目要求要涉及到物联网,公司要采用wifi 于是就采购了一块串口wifi模块,ESP8266 开始拿到后首先应该掌握的就是测试,熟悉AT指令,因为串口wifi通信是采用AT指令进行通信的, 在这里需要注意一点的就是:在编写程序的时候,一个串口(usart2)连接ESP8266,另一个串口(USart1)通过USB-TTL连接PC机查看输出信息, bool ESP8266_Cmd ( char * cmd, char * reply1, char * reply2, u32 waittime ) { strEsp8266_Fram_Record .InfBit .FramLength = 0; //从新开始
[单片机]
基于stm32cubemx对fatfs文件系统进行移植
今天要给大家分享的是使用FatFs这个库来读写SD卡上面的文件。工程的初始化函数和FatFs都是通过STM32CubeMX配置生成的,不需要我们手动添加库。 今天分享的内容和我的上一篇帖子 SDIO读取SD卡的扇区 有关,最好掌握了SDIO读取SD卡扇区的基础之后再来看这一篇帖子。 写在前面的话 上一次发表了关于SDIO读取SD卡的一篇开发分享的帖子,今天呢就更进一步使用了FatFs文件系统。同样我们完全使用ST公司提供的STM32CubeMX软件和HAL库来进行开发。如果喜欢我的帖子请多多回复我会努力更新的。 我使用的工具 开发平台:正点原子探索者STM32F407开发板 硬件:使用了NUCLEO-F446RE开发板的ST-Li
[单片机]
STM32之ADC实例(基于DMA方式)
ADC简介: ADC(Analog-to-Digital Converter,模/ 数转换器)。也就是将模拟信号转换为数字信号进行处理,在存储或传输时,模数转换器几乎必不可少。 STM32在片上集成的ADC外设非常强大,我使用的奋斗开发板是STM32F103VET6,属于增强型的CPU,它有18个通道,可测量16个外部和2个内部信号源。各通道的A/D转换可以单次,连续,扫描或间断模式执行,ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中。 ADC工作过程分析: 我们以ADC规则通道转换过程来分析,如上图,所有的器件都是围绕中间的模拟至数字转换器部分展开的。它的左端VREF+,VREF- 等ADC参考电
[单片机]
STM32的三种延时方法的代码实现_纯软件延时, 系统定时器延时, 定时器延时
/* 外部调用: delay_init(72); //系统主频, 单位为MHZ, 仅对 SYSTICK_DELAY 有效 delay_ms(1000); */ #include stm32f10x.h //#define SOFT_DELAY //纯软件延时 //#define SYSTICK_DELAY //系统定时器延时 #define TIMER_DELAY //定时器延时 #ifdef TIMER_DELAY #define TIMER_DELAY TIM4 #define TIMER_DELAY_PERIOD 1000 #de
[单片机]