近日在进行一个倾角仪产品操作时,发现了stm32在往外发送数据时出现的一个问题。类似问题以前也出过,现在再次出现。特地写下来提醒自己注意以后防止再犯错。
该倾角仪adis16210与主控制器stm32通信时选用的是spi接口,并且在后续的操作过程中是使用stm32的官方函数库。在初期程序调试时,只是进行了spi的读操作(adis可以不用设置初试参数),能正常进行spi的读操作,能获取到随姿态变好的角度值。
在使用过程中,发现倾角仪更新数据太慢,因此需要对倾角仪进行设置。在程序的初始化阶段,增加了一个spi的写操作,写入一个字节以设置该传感器。更新完程序,运行程序发现再无法正常读取传感器数据了,传感器总是返回0。多次测试,发现该写操作导致倾角仪数据出现问题。
查阅数据手册,发现在进行spi双向通信时,需要及时读出spi接收寄存器数据,否则会出现缓存溢出问题。尽管在程序的初始阶段,我们只是进行了spi的发送操作。但是因为spi是双向通信,在主设备发送数据时,有发送时钟,因此主设备也会接收到数据,也即接收缓冲器中有数据,我们需要进行一下读取操作(结果可以当无效数据丢弃),以读空数据。
因此,在stm32发送一个设置参数之后,我等待发送完成,等待接受完成,再进行了一下读spi接受寄存器的操作。再在程序原来位置进行倾角数据读出时,可以正常读取数据。
因为spi的工作原理类似,因此其它器件在多次发送数据时,中间如果不进行spi接收缓冲器清空操作,就有可能导致接收缓存器溢出,当然有的器件溢出了可能会继续正常工作,但stm32系列芯片在溢出时肯定不会再继续正常工作了。
关键字:stm32 spi 发送命令 注意事项
引用地址:
关于stm32的spi发送命令时的注意事项
推荐阅读最新更新时间:2024-11-06 10:22
USB电源充电设计技巧与注意事项
几乎所有目前和未来推出的手持设备都要求使用 USB 电源和 AC 墙上适配器充电,这给电池充电带来了诸多挑战。本文中,我们将讨论简化 USB 充电的一些特性。具体而言,就是说哪些特性可以帮助用户设计一种符合 USB 规范的应用?设计如何能够同时支持 USB 和 AC 适配器输入呢?我们将讨论静态电流、输入电压动态电源管理 (VIN-DPM) 和输入电流极限。下面就以 bq2407x 系列器件为例来说明一下这些特性。导言
消费者希望其设备的电源线和连接线越来越少,并期望获得通过计算机或 AC 插座充电的灵活性,因此要求几乎所有目前和未来推出的手持设备都能通过 USB 电源和 AC 墙上适配器充电。USB 要求给电池充电带
[电源管理]
STM32系统头文件之数据类型定义u8 u16哪里来的
初学STM32编程时,经常见到数据类型定义的符号:u8、u16等,51都是自己定义数据类型的简写符号,STM32是哪里定义的呢?今天没事就看了看系统头文件,数据类型的定义在其中的3个头文件里: (1)stdint.h(摘取定义部分) /* * 'signed' is redundant below, except for 'signed char' and if * the typedef is used to declare a bitfield. */ /* 7.18.1.1 */ /* exact-width signed integer types */ t
[单片机]
STM32系统时钟配置及时钟树
参考资料:《 STM32F4xx 中文参考手册》 RCC 章节。 STM32时钟可大致分为系统时钟和其它时钟两大类,总共包含5个时钟源 HSI(High Speed Internal Clock)、HSE(High Speed External Clock)、LSI(low Speed Internal Clock)、LSE(Low Speed External Clock )、PLL(Phase Locked Loop Clock)。 下图即为STM32时钟树,黄色标识部分即为系统时钟部分,橙色即为其它时钟部分。 一、系统时钟 ①HSE(High Speed External Clock)高速外部时钟信号
[单片机]
太阳模拟器测试非晶硅薄膜的注意事项
太阳电池,也称为光伏电池,是将太阳光辐射能直接转换为电能的器件,而测量太阳能电池的效率是通过用辐射强度计测定入射太阳光的功率和测量电池在最大功率点产生的电功率的办法来实现。使用这种方法存在的困难是被测电池的性能在很大程度上取决于太阳光光谱成分,但是光谱成分的精确程度受到季节变化、地区差异和气候条件等各种因素的影响,加上辐射强度计刻度误差,使测量结果难以精确和稳定。在大多生产厂家,使用模拟太阳光的室内模拟器进行太阳能电池效率的测试,室内模拟器的光强和光谱分布是用经标准太阳光定标的标准片来校准的。 目前一些实验室或者测试机构,经常用晶硅太阳电池作为标准件来测试非晶硅薄膜" title="非晶硅薄膜" 非晶硅薄膜 " titl
[电源管理]
基于STM32和AD5791实现单路超高精度可调电压电路的设计
引言 现在很多智能测量仪表要求具有超高精度的电压信号,同时要求高稳定性、高线形度和低噪声、低温度漂移。这样的模拟系统设计面临复杂的工程技术挑战,常规的方法是采用多个较低分辨率的DAC和大量分立元件与支持IC整合在一起,同时伴随着相当大的开发风险和高代价的修改时间,才能优化电路参数、减小误差和设计出复杂的自动校准电路,这样不仅增加了硬件设计的复杂性,通常达到的精度也不是很高。本系统设计的基于STM32微处理器和AD5791的20位超高精度测量系统中,实现了单路超高精度可调电压信号的输出,输出电压信号的幅值可以通过软件来设置。该系统可靠性高,不需要校准电路。 AD5791是美国ADI公司推出的一款高性能的单路20位电压输出数模转换
[单片机]
STM32进阶之串口环形缓冲区实现 FIFO
队列的概念 在此之前,我们来回顾一下队列的基本概念: 队列 (Queue):是一种先进先出(First In First Out ,简称 FIFO)的线性表,只允许在一端插入(入队),在另一端进行删除(出队)。 队列的特点 类似售票排队窗口,先到的人看到能先买到票,然后先走,后来的人只能后买到票 队列的常见两种形式 普通队列 在计算机中,每个信息都是存储在存储单元中的,比喻一下吧,上图的一些小正方形格子就是一个个存储单元,你可以理解为常见的数组,存放我们一个个的信息。 当有大量数据的时候,我们不能存储所有的数据,那么计算机处理数据的时候,只能先处理先来的,那么处理完后呢,就会把数据释放掉,再处理下一个。那么,已经处
[单片机]
基于STM32的无线飞鼠(二)
在前一篇博客中讲了下一些题外话,从本篇开始讲讲重点的知识,说说无线飞鼠过程用到的模块 细说MPU6050 一、 MPU6050简介 二、 细节问题 三、 相关技术 四、 操作步骤 五、 实现代码 一、 MPU6050简介 MPU6050集成了3轴加速度和3轴陀螺仪,是一款不错的传感器模块,可以用在很多方面,比如:四轴飞控、空中鼠标、两轮平衡车、GPS定位方面、游戏机、3D遥控器、平板设备等等,此模块给我们提供了强大的数据供应,由于将加速度和陀螺仪集成到了一起,免去了组合这两个模块时之间的轴差问题,减少了包装问题,这两年很火,成了DIY制作者的最爱。 二、 细节问题 在淘宝上买MPU6050时,要注意一下几点
[单片机]
STM32学习笔记之 DS18B20 SEARCH ROM
使用说明,根据MCU不同 用户只需修改4函数 //单总线复位函数 int OWReset(); 单线总线的复位函数,注意这个要做相应修改,如果期间存在要返回1,期间不存在返回0, 直接从总线上读取的是期间存在返回0,不存在返回1 //向总线发送一个字节 void OWWriteByte(unsigned char dat); //向总线发送一位 void OWWriteBit(unsigned char bit_value); //读取总线一位 unsigned char OWReadBit(); 使用时用 int OWFirst();发现第一个单线器件 如果期间存在返回1,并且把ID存在 unsigned char
[单片机]