STM32 HAL库学习笔记-(SPI驱动ADXL345)
STM32 HAL库学习笔记-(SPI驱动ADXL345)
最近有项目需要需要用到ADXL345,网上转了一圈都是IIC驱动为主,正好最近在学习HAL库,所以本文将使用SPI驱动ADXL345
CUBEMX配置
上图为ADXL345 SPI的时序图,时钟线在空闲状态为高电平,所以CPOL=HIGH,数据采样是第二个边沿开始,图中第一个红色竖线的位置,所以CPHA=2 Edge,有了这些信息后,我们开始配置CUBEMX
NSS本文选择为PA4,生成代码后我们来到MDK中编写代码
MDK程序编写
1.片选设置
/*** @brief 片选拉低* */
void Nss_Low(void)
{HAL_GPIO_WritePin(NSS_GPIO_Port, NSS_Pin, GPIO_PIN_RESET);
}/*** @brief 片选拉高* */
void Nss_High(void)
{HAL_GPIO_WritePin(NSS_GPIO_Port, NSS_Pin, GPIO_PIN_SET);
}
2.获取ADXL345 ID
这一步是测试通讯的关键一步,同样也可以作为初始化中循环的判断条件
首先我们连接下ADXL345 ID寄存器的地址
2.1 编写ADXL345的读写程序
void ADXL345_Write(uint8_t addr, uint8_t value)
{addr &= 0x3F;Nss_Low();HAL_SPI_Transmit(&hspi1, &addr, 1, 10);HAL_SPI_Transmit(&hspi1, &value, 1, 10);Nss_High();
}void ADXL345_Rread(uint8_t addr, uint8_t *value)
{addr &= 0x3F; addr |= (0x80);Nss_Low();HAL_SPI_Transmit(&hspi1, &addr, 1, 10);HAL_SPI_Receive(&hspi1, value, 1, 10);Nss_High();
}
关于为什么要与上0x3F和或上0x80,请看下图
相信读者看到SPI的时序图后一定能理解本文的操作。
2.2ADXL读取ID
uint8_t Get_Adxl345_ID(void)
{uint8_t DEVICEID = 0x00;uint8_t result = 0;ADXL345_Rread(DEVICEID, &result);return result;
}
程序返回0xe5后即代表通讯成功
3.ADXL345初始化
void ADXL345_Init(void)
{while (Get_Adxl345_ID() != 0xe5){printf("ADXL345 Init Fail:%x\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\n");
}
相关宏定义
#define DEVICE_ID 0X00 // 器件ID,0XE5
#define THRESH_TAP 0X1D // 敲击阀值寄存器
#define OFSX 0X1E
#define OFSY 0X1F
#define OFSZ 0X20
#define DUR 0X21
#define Latent 0X22
#define Window 0X23
#define THRESH_ACT 0X24 // 运动阈值寄存器
#define THRESH_INACT 0X25 // 静止阈值寄存器
#define TIME_INACT 0X26 // 静止时间 比例1 sec /LSB
#define ACT_INACT_CTL 0X27 // 启用运动/静止检测
#define THRESH_FF 0X28 // 自由下落阈值 建议采用300 mg与600 mg(0x05至0x09)之间的值 比例62.5 mg/LSB
#define TIME_FF 0X29 // 自由下落时间 建议采用100 ms与350 ms(0x14至0x46)之间的值 比例5ms/LSB
#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
4.读取X轴数据
void ADXL345_Test()
{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\n", x);
}
至此ADXL345驱动完成,本文放在FreeRTOS中的线程读取X轴角度,其余角度无非是改变访问的寄存器。
求关注,求点赞
STM32 HAL库学习笔记-(SPI驱动ADXL345)相关推荐
- STM32 HAL库学习笔记1-HAL库简介
STM32 HAL库学习笔记1-HAL库简介 HAL库 SPL 库 和 HAL 库两者相互独立,互不兼容.几种库的比较如下 目前几种库对不同芯片的支持情况如下 ST 中文官网上有一篇<关于ST库 ...
- STM32 HAL库学习笔记4-SPI
STM32 HAL库学习笔记4-SPI 前言 一.SPI协议简介 SPI物理层 SPI协议层 1.基本通讯过程 2. 通讯的起始和停止信号 3. 数据有效性 4. CPOL/CPHA 及通讯模式 二. ...
- STM32 HAL库学习笔记2 HAL库介绍
STM32 HAL库学习笔记2 HAL库介绍 CMSIS标准 一.再次认识HAL库 HAL库设计思想 HAL库实现方式 以GPIO模块为例 GPIO外设数据类型 GPIO外设接口函数 二.使用HAL库 ...
- STM32F407霸天虎HAL库学习笔记——使用ADC采集MQ135的数据并通过OLED显示
STM32F407霸天虎HAL库学习笔记--使用ADC采集MQ135的数据并通过OLED显示 一.软件准备 二.硬件准备 三.CubeMX配置 四.Keil MQ135.c MQ135.h main函 ...
- STM32F407霸天虎HAL库学习笔记——串口发送
STM32F407霸天虎HAL库学习笔记--串口收发 一.软件准备 二.硬件准备 三.CubeMX配置 四.Keil printf重写 main函数 五.实验效果 一.软件准备 软件准备 二.硬件准备 ...
- (HAL库学习8)STM32CubeMX 驱动0.96寸IIC oled(取字模,取图模)
这一篇讲解用STM32CubeMX来使用0.96寸的IIC oled(128*64,VCC,GND,SCL,SDA四脚) 这篇文章我重新写了,如果你是第二次读到这篇文章,对不起,之前卧病额米有讲清楚, ...
- STM32cubemx——HAL库学习笔记 六、IWDG独立看门狗的配置
一.配置STM32cubeMX工程 在配置好时钟和调试设备以后进行一下操作即可以使用 看门狗的溢出时间公式为 Tout= 分频系数/ 时钟 * 重装载值 二.IWDG的技术讲解 可以到看,看门狗相对于 ...
- STM32 HAL库 实现基于SPI模式的SD卡、TF卡FATS文件系统+模拟U盘的应用笔记
前言 很多单片机不带SDIO接口,所以在使用SD卡时必须使用SPI模式进行读写. 想做一个基于SPI的SD卡文件系统读写SD卡上的文件,再配合USB接口做一个模拟U盘.只能利用业余时间慢慢更新,也不知 ...
- 晶联讯12864液晶+STM32+HAL库 IO模拟SPI成功实现显示。
液晶型号:JLX12864G-290-PN不带字库 芯片型号:STM32F030F4 SPI连接方式:IO口模拟 STM32CubeMX 中引脚设置 JLX12864G_290_PN.h文件 #if ...
- STM32 HAL库学习系列第13篇---串口重定向配置--printf
我的首发平台是公众号[CodeAllen],学习交流QQ群:736386324,本文版权归作者所有,转载请注明出处 发送函数重定向 之后就可以使用输入输出函数 /******************* ...
最新文章
- pd.merge 结果出现重复_COUNTIFS函数技巧之去重复值计数(思路分析,过程详解)...
- python画折线图代码-python绘制简单折线图代码示例
- C语言编程题显示日历,C语言日历问题
- java消费者模式_基于Java 生产者消费者模式(详细分析)
- GDCM:gdcm::TableReader的测试程序
- Java基础--面向对象以及相关知识
- 一个传统媒体人转型创业的真实故事
- 骁龙8性能巅峰旗舰!黑鲨5系列获3C认证:配备120W快充
- LoadDruidSegmentStep failed SQLException: Cannot load JDBC driver class ‘com.mysql.jdbc.Driver‘
- Rust: map中的问题,两种写法有什么不同?
- java使用ffmpeg转码并上传视频
- C#编程,使用 Roslyn引擎动态编译代码
- WordPress防止自动压缩jpg图片
- mysql 怎么 增加新用户名和密码_在mysql中怎么添加用户名和密码
- 支付宝实现当面付扫描支付退款及退款查询
- 苹果系统上安装windows教程(图文详解+工具)一看就会!
- 2017/7/11 新开博客
- Apache POI操作Excel文件
- 深信服上网行为管理如何配置双因素/双因子(2FA)身份认证
- legacy引导gpt分区_legacy支持gpt吗