STM32+HAL库驱动ADXL345传感器(SPI协议)

这篇具有很好参考价值的文章主要介绍了STM32+HAL库驱动ADXL345传感器(SPI协议)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

ADXL345传感器简介

STM32+HAL库驱动ADXL345传感器(SPI协议),ARM单片机,传感器模块,stm32,嵌入式硬件,单片机
ADXL345 是 ADI 公司推出的基于 iMEMS 技术的 3 轴、数字输出加速度传感器。该加速度传感器的特点有:

a. 分辨率高。最高 13 位分辨率。

b. 量程可变。具有+/-2g, +/-4g, +/-8g, +/-16g 可变的测量范围。

c. 灵敏度高。最高达 3.9mg/LSB,能测量不到 1.0°的倾斜角度变化。

d. 功耗低。 40~145uA 的超低功耗,待机模式只有 0.1uA。

e. 尺寸小。整个 IC 尺寸只有 3mm5mm1mm, LGA 封装。

ADXL 支持标准的 I2C 或 SPI 数字接口,自带 32 级 FIFO 存储,并且内部有多种运动状态检测和灵活的中断方式等特性。
引脚如下所示:
STM32+HAL库驱动ADXL345传感器(SPI协议),ARM单片机,传感器模块,stm32,嵌入式硬件,单片机

实物

使用的是STM32F103ZET6单片机,使用了SPI2
主要接线为:CS接PB6;SCL接PB13;SDA接PB15;SDO接PB14。
STM32+HAL库驱动ADXL345传感器(SPI协议),ARM单片机,传感器模块,stm32,嵌入式硬件,单片机

STM32CubeMX配置

使用的是STM32F103ZET6单片机,使用SPI2,通过串口进行数据显示
时钟配置如下:
STM32+HAL库驱动ADXL345传感器(SPI协议),ARM单片机,传感器模块,stm32,嵌入式硬件,单片机

SPI配置

STM32+HAL库驱动ADXL345传感器(SPI协议),ARM单片机,传感器模块,stm32,嵌入式硬件,单片机

使用硬件SPI,根据ADXL345的SPI时序图,选择SPI的模式3,片选使用软件片选
STM32+HAL库驱动ADXL345传感器(SPI协议),ARM单片机,传感器模块,stm32,嵌入式硬件,单片机

片选引脚配置

片选使用的是PB6引脚
STM32+HAL库驱动ADXL345传感器(SPI协议),ARM单片机,传感器模块,stm32,嵌入式硬件,单片机

串口配置

STM32+HAL库驱动ADXL345传感器(SPI协议),ARM单片机,传感器模块,stm32,嵌入式硬件,单片机

特别注意(重点部分)

1.模块默认使用IIC通信,如果需要使用四线SPI通信,需要将模块的R4电阻取掉,如果不取,就抓不到时序。原因如下图所示:
STM32+HAL库驱动ADXL345传感器(SPI协议),ARM单片机,传感器模块,stm32,嵌入式硬件,单片机
模块将芯片的SDO引脚通过R4电阻直接连接到GND,如果不把R4电阻取掉,接线上去读时序是读不到信号的。
STM32+HAL库驱动ADXL345传感器(SPI协议),ARM单片机,传感器模块,stm32,嵌入式硬件,单片机
2.对于SPI采集,需要注意一下,有的MCU会把SPI1的SCK引脚用作调试引脚,导致使用逻辑分析仪抓取波形的时候,SCK引脚一直处于拉高状态,解决方案:A.将SCK引脚重映射去其他引脚;B.换一组SPI

核心代码

ADXL345.C的代码


#include "ADXL345.h"
#include "spi.h"
#include "stdio.h"
/*
 * 作者:PrairieOne
 * csdn:PrairieOne
 * 邮箱:prairieone1024@163.com
 * 嵌入式技术交流群:826251093
 */
#define SET_SPI_CS_H	HAL_GPIO_WritePin(SPI1_CS_GPIO_Port,SPI1_CS_Pin,GPIO_PIN_SET);
#define SET_SPI_CS_L	HAL_GPIO_WritePin(SPI1_CS_GPIO_Port,SPI1_CS_Pin,GPIO_PIN_RESET);

//写字节
void ADXL345_Write(uint8_t addr, uint8_t value)
{
	addr &= 0x3F;
	SET_SPI_CS_L;
	HAL_SPI_Transmit(&hspi2, &addr, 1, 10);
	HAL_SPI_Transmit(&hspi2, &value, 1, 10);
	SET_SPI_CS_H;
}
//读字节
void ADXL345_Rread(uint8_t addr, uint8_t *value)
{
	addr &= 0x3F;	
	addr |= (0x80);
	SET_SPI_CS_L;
	HAL_SPI_Transmit(&hspi2, &addr, 1, 10);
	HAL_SPI_Receive(&hspi2, value, 1, 10);
	SET_SPI_CS_H;
}

//读ID
uint8_t Get_Adxl345_ID(void)
{
	uint8_t DEVICEID = 0x00;
	uint8_t result = 0;
	ADXL345_Rread(DEVICEID, &result);

	return result;
}
//初始化
void ADXL345_Init(void)
{
	while (Get_Adxl345_ID() != 0xE5)//e5
	{
		printf("ADXL345 Init Fail:%x\r\n", Get_Adxl345_ID());
		HAL_Delay(1000);
	}

	ADXL345_Write(INT_ENABLE, 0x00);
	ADXL345_Write(DATA_FORMAT, 0x0B);
	ADXL345_Write(BW_RATE, 0x1A);
	ADXL345_Write(POWER_CTL, 0x08);
	ADXL345_Write(INT_ENABLE, 0x14);

	printf("ADXL345 Init Success\r\n");
}
//读取X轴数据
void ADXL345_XTest(void)
{
	short x;
	uint8_t addrxl = 0x32;
	uint8_t addrxh = 0x33;
	uint8_t xl, xh;

	ADXL345_Rread(addrxl, &xl);
	ADXL345_Rread(addrxh, &xh);

	x = (short)(((uint16_t)xh << 8) + xl);

	printf("X:%d\r\n", x);
}

//读取Y轴数据
void ADXL345_YTest(void)
{
	short Y;
	uint8_t addrYl = 0x34;
	uint8_t addrYh = 0x35;
	uint8_t Yl, Yh;

	ADXL345_Rread(addrYl, &Yl);
	ADXL345_Rread(addrYh, &Yh);

	Y = (short)(((uint16_t)Yh << 8) + Yl);

	printf("Y:%d\r\n", Y);
}
//读取Z轴数据
void ADXL345_ZTest(void)
{
	short Z;
	uint8_t addrZl = 0x34;
	uint8_t addrZh = 0x35;
	uint8_t Zl, Zh;

	ADXL345_Rread(addrZl, &Zl);
	ADXL345_Rread(addrZh, &Zh);

	Z = (short)(((uint16_t)Zh << 8) + Zl);

	printf("Z:%d\r\n", Z);
}


ADXL345.H的代码

#ifndef ADXL345_H_
#define ADXL345_H_

#include "main.h"
/*
 * 作者:PrairieOne
 * csdn:PrairieOne
 * 邮箱:prairieone1024@163.com
 * 嵌入式技术交流群:826251093
 */
 
/******************ADXL345寄存器命令定义**********************/
#define DEVICE_ID           0X00        //获取器件ID,0XE5
#define THRESH_TAP          0X1D        //敲击阀值
#define OFSX                0X1E	//x轴调整偏移值
#define OFSY                0X1F
#define OFSZ                0X20
#define DUR                 0X21
#define Latent              0X22
#define Window              0X23
#define THRESH_ACK          0X24
#define THRESH_INACT        0X25
#define TIME_INACT          0X26
#define ACT_INACT_CTL       0X27
#define THRESH_FF           0X28
#define TIME_FF             0X29
#define TAP_AXES            0X2A
#define ACT_TAP_STATUS      0X2B
#define BW_RATE             0X2C
#define POWER_CTL           0X2D
 
#define INT_ENABLE          0X2E
#define INT_MAP             0X2F
#define INT_SOURCE          0X30
#define DATA_FORMAT        0X31
#define DATA_X0            0X32
#define DATA_X1            0X33
#define DATA_Y0            0X34
#define DATA_Y1            0X35
#define DATA_Z0            0X36
#define DATA_Z1            0X37
#define FIFO_CTL            0X38
#define FIFO_STATUS         0X39
 
#define I_M_DEVID      ((uint8_t)0xE5) //器件ID=0XE5
 
//初始化
void ADXL345_Init(void);
//读取X轴数据
void ADXL345_XTest(void);
//读取Y轴数据
void ADXL345_YTest(void);
//读取Z轴数据
void ADXL345_ZTest(void);
#endif /* ADXL345_H_ */


main的代码

/*
 * 作者:PrairieOne
 * csdn:PrairieOne
 * 邮箱:prairieone1024@163.com
 * 嵌入式技术交流群:826251093
 */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  MX_SPI2_Init();
  /* USER CODE BEGIN 2 */
	HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1);
  /* USER CODE END 2 */
	ADXL345_Init();		
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {          
		//读取X轴数据
		ADXL345_XTest();
		//读取Y轴数据
		ADXL345_YTest();
		//读取Z轴数据
		ADXL345_ZTest();
		HAL_Delay(1000);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

效果展示

初始化模块的时序图:回读E5代码正确
STM32+HAL库驱动ADXL345传感器(SPI协议),ARM单片机,传感器模块,stm32,嵌入式硬件,单片机
STM32+HAL库驱动ADXL345传感器(SPI协议),ARM单片机,传感器模块,stm32,嵌入式硬件,单片机
遇事不决,可问春风!文章来源地址https://www.toymoban.com/news/detail-796778.html

到了这里,关于STM32+HAL库驱动ADXL345传感器(SPI协议)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32(HAL库)驱动AD8232心率传感器

    目录 1、简介 2、CubeMX初始化配置 2.1 基础配置 2.1.1 SYS配置  2.1.2 RCC配置 2.2 ADC外设配置 2.3 串口外设配置  2.4 GPIO配置  2.5 项目生成  3、KEIL端程序整合 3.1 串口重映射 3.2 ADC数据采集 3.3 主函数代码整合 4 硬件连接 5 效果展示 本文通过STM32F103C8T6单片机通过HAL库方式对AD8232心率

    2024年02月16日
    浏览(42)
  • STM32(HAL库)驱动SHT30温湿度传感器通过串口进行打印

    目录 1、简介 2、CubeMX初始化配置 2.1 基础配置 2.1.1 SYS配置  2.1.2 RCC配置 2.2 软件IIC引脚配置 2.3 串口外设配置  2.4 项目生成  3、KEIL端程序整合 3.1 串口重映射 3.2 SHT30驱动添加 3.3 主函数代 3.4 效果展示 本文通过STM32F103C8T6单片机通过HAL库方式对SHT30传感器进行数据的读取,并

    2024年02月16日
    浏览(45)
  • STM32 HAL 驱动PM2.5传感器(GP2Y10AU气体检测模块)

    目录 1、简介 2、CubeMX初始化配置 2.1 基础配置 2.1.1 SYS配置  2.1.2 RCC配置 2.2 ADC外设配置 2.3 串口外设配置  2.4 项目生成  3、KEIL端程序整合 3.1 串口重映射 3.2 ADC数据采集 3.3 主函数代 3.4 效果展示 本文通过STM32F103C8T6单片机通过HAL库方式对GP2Y10AU气体检测模块进行数据的读取,

    2024年02月22日
    浏览(44)
  • 【ESP32】BL0942功耗传感器SPI接口驱动

    BL0942功耗模块在物联网设备中的应用比较广泛,本博文完成ESP32基于SPI接口驱动功耗BL0942模块(上海贝岭公司)的寄存器的读写,从而可以完成寄存器模式的配置,以及读取寄存器的值完成电流电压,功率等值的计算。 在通信模式下,先发送 8bit 识别字节(0x58) 或(0xA8), (0x5

    2024年02月14日
    浏览(65)
  • SPI传感器接口设计与优化:基于STM32的实践

    SPI(串行外设接口)是一种常用的串行通信协议,用于在微控制器和外部设备之间进行全双工的高速数据传输。 在本文中,我们将探讨如何基于STM32微控制器设计和优化SPI传感器接口,并提供相应的代码示例。 1. SPI传感器接口设计 SPI传感器接口设计的主要目标是实现可靠、

    2024年01月19日
    浏览(38)
  • 【STM32(HAL库)--DHT11温湿度传感器】

    stm32控制DHT11温湿度传感器,进行温湿度的读取.以下是自己的一点学习过程和心得,若有不妥之处,还望各位大佬指正,在下感激不尽. DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器 。 它应用专用的数字模块采集技术温湿度传感技术, 确保产品具有极高

    2024年04月15日
    浏览(52)
  • [STM32]HAL库STM32CubeMX+DHT11温湿度传感器

    目录 所用的工具: 知识概括: DHT11介绍: DHT11性能说明: 接口说明  电源引脚 串行接口   工程创建 1、设置RCC 2、时钟设置 3、项目文件设置 4、设置IO口(DATA) 5、TIM时钟配置 6、USART配置   程序编写:          1、TIM3实现微秒(us)级延时函数: 2、IO口配置 3、DHT11检测

    2024年02月09日
    浏览(47)
  • 使用STM32的SPI接口实现与外部传感器的数据交互

    一、引言 外部传感器是嵌入式系统中常用的外设,用于检测环境参数、采集数据等。通过STM32微控制器的SPI接口,可以与外部传感器进行数据交互,从而实现数据的采集和控制。 本文将介绍如何使用STM32的SPI接口实现与外部传感器的数据交互,并提供示例代码。 ✅作者简介:

    2024年01月23日
    浏览(42)
  • STM32使用HAL库BH1750光照度传感器

    单片机:STM32F103C8T6 光照度传感器:BH1750 IDE:KEIL+STM32CUBEMX 1、STM32CUBEMX 1、头文件 2、C文件 3、主函数操作BH1750

    2024年02月14日
    浏览(41)
  • STM32采集问答式串口传感器数据写入SD卡(spi模式)

    STM32f103RCT6板子 问答式温湿度传感器(TTL信号) 外接SD卡模块(淘宝都差不多) 1. SD卡模块 ,采用SPI1接线 (CLK)SCK —PA5 (DATA0)MISO —PA6 (CMD)MOSI —PA7 (DATA3)CS —PA4 前面小括号里的是SDIO模式的接线,可以忽略。 2. 传感器模块 问答式TTL信号的传感器都可以, 连接到板子的串口2,

    2024年02月05日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包