66、SPI驱动ADXL345加速度计
SPI驱动ADXL345加速度计一、SPI协议核心原理SPI是全双工、同步、主从式的通信总线想要驱动外设先吃透物理层连线和时序规则。1.1 物理层四线制连接逻辑SPI标准四线制的每根线都有明确分工IMX6ULL主设备与ADXL345从设备的具体连线如下信号线功能说明IMX6ULL引脚ECSPI3ADXL345引脚SCLK串行时钟主设备产生UART2_RX_DATASCLKMOSI主发从收UART2_CTS_BMOSIMISO主收从发UART2_RTS_BMISOCS/SS从机选择低电平有效GPIO模拟UART2_TX_DATAGPIO1_IO20CS注IMX6ULL的ECSPI3本身自带硬件CS但本文用GPIO模拟CS更灵活也便于新手理解“片选”的核心逻辑。1.2 时序规则CPOL与CPHA决定通信模式SPI的时序由两个关键参数定义CPOL时钟极性和CPHA时钟相位组合出4种通信模式ADXL345推荐使用模式3CPOL1CPHA1。参数含义模式3配置CPOL时钟闲置时的电平0低电平闲置1高电平闲置1CPHA数据采样边沿0时钟第1个边沿采样1时钟第2个边沿采样1模式3的时序逻辑SCLK空闲时保持高电平主设备在SCLK的下降沿发送数据从设备在SCLK的上升沿采样数据第二个边沿。二、IMX6ULL ECSPI控制器从引脚到寄存器配置IMX6ULL的SPI控制器称为ECSPI增强型可配置SPI我们以ECSPI3为例完成底层硬件初始化。2.1 引脚复用配置IMX6ULL的引脚是多功能的需要先将对应引脚复用为ECSPI3功能并配置电气特性上拉、速率等。#includeimx6ull.h// 引脚复用配置函数底层寄存器封装无需修改voidIOMUXC_SetPinMux(unsignedintmux_register,unsignedintmux_mode);voidIOMUXC_SetPinConfig(unsignedintconfig_register,unsignedintconfig_value);// ECSPI3引脚初始化voidspi3_pin_init(void){// 1. MISOUART2_RTS_B复用为ECSPI3_MISOIOMUXC_SetPinMux(IOMUXC_UART2_RTS_B_ECSPI3_MISO,0);IOMUXC_SetPinConfig(IOMUXC_UART2_RTS_B_ECSPI3_MISO,0x10B1);// 上拉、速率100MHz// 2. MOSIUART2_CTS_B复用为ECSPI3_MOSIIOMUXC_SetPinMux(IOMUXC_UART2_CTS_B_ECSPI3_MOSI,0);IOMUXC_SetPinConfig(IOMUXC_UART2_CTS_B_ECSPI3_MOSI,0x10B1);// 3. SCLKUART2_RX_DATA复用为ECSPI3_SCLKIOMUXC_SetPinMux(IOMUXC_UART2_RX_DATA_ECSPI3_SCLK,0);IOMUXC_SetPinConfig(IOMUXC_UART2_RX_DATA_ECSPI3_SCLK,0x10B1);// 4. CSUART2_TX_DATA复用为GPIO1_IO20IOMUXC_SetPinMux(IOMUXC_UART2_TX_DATA_GPIO1_IO20,0);IOMUXC_SetPinConfig(IOMUXC_UART2_TX_DATA_GPIO1_IO20,0x10B1);// GPIO1_IO20设为输出初始高电平未选中ADXL345GPIO1-GDIR|(120);GPIO1-DR|(120);}2.2 ECSPI3寄存器核心配置IMX6ULL的ECSPI控制器核心配置在CONREG控制寄存器和CONFIGREG配置寄存器重点是匹配ADXL345的模式3时序同时设置主机模式、数据长度、时钟分频。// ECSPI3初始化配置时序、模式、数据长度voidspi3_init(void){// 1. 先初始化引脚spi3_pin_init();// 2. 复位CONREG寄存器ECSPI3-CONREG0;/* CONREG参数解析 * 720BURST_LENGTH7 → 数据长度8位0~7共8位 * 0x0E12CLK_CTL14 → 时钟分频IPG_CLK66MHz → 66/(141)4.4MHz适配ADXL345 * 28CHIP_SELECT2 → 选择通道0ECSPI3_CH0 * 14MODE1 → 主机模式 * 13SCLK_CTL1 → 时钟由CONREG的CLK_CTL控制 * 10ENABLE1 → 使能ECSPI3 */ECSPI3-CONREG|(720)|(0x0E12)|(28)|(14)|(13)|(10);// 3. 复位CONFIGREG寄存器ECSPI3-CONFIGREG0;/* CONFIGREG参数解析 * 120SCLK_POL1 → CPOL1时钟高电平闲置 * 14MOSI_POL0 → MOSI引脚极性正常无需翻转 * 10PHASE1 → CPHA1第二个边沿采样 */ECSPI3-CONFIGREG|(120)|(14)|(10);}三、ADXL345驱动实现SPI读写传感器控制ADXL345的核心操作是“读写寄存器”——通过SPI向传感器寄存器写配置、读数据先实现SPI底层读写再封装传感器专属接口。3.1 SPI全双工读写基础函数SPI是全双工通信发送1个字节的同时必然会接收1个字节。因此读写函数的核心是“发数据等接收”利用ECSPI的TX/RX FIFO完成数据传输。// SPI3通道0读写函数发送1字节同时接收1字节全双工unsignedintspi3_ch0_write_and_read(unsignedintdata){// 等待发送FIFO为空准备好接收新数据while((ECSPI3-STATREG(10))0);// 往TXDATA写入要发送的数据ECSPI3-TXDATAdata;// 等待接收FIFO有数据数据已接收完成while((ECSPI3-STATREG(13))0);// 返回接收到的数据returnECSPI3-RXDATA;}3.2 ADXL345寄存器读写封装ADXL345的寄存器读写有固定规则读操作寄存器地址最高位置1reg_addr | 0x80发送地址后发0xFF伪数据触发时钟读取返回值写操作寄存器地址最高位清0发送地址后发送要写入的数据。// ADXL345读寄存器reg_addr寄存器地址返回寄存器值unsignedcharadxl345_read(unsignedcharreg_addr){unsignedcharret0;// 1. 拉低CS选中ADXL345GPIO1-DR~(120);// 2. 发送读指令地址最高位1spi3_ch0_write_and_read(reg_addr|0x80);// 3. 发送伪数据0xFF读取传感器返回值retspi3_ch0_write_and_read(0xFF);// 4. 拉高CS结束通信GPIO1-DR|(120);returnret;}// ADXL345写寄存器reg_addr寄存器地址data要写入的值voidadxl345_write(unsignedcharreg_addr,unsignedchardata){// 1. 拉低CS选中ADXL345GPIO1-DR~(120);// 2. 发送写指令地址最高位0spi3_ch0_write_and_read(reg_addr~0x80);// 3. 发送要写入的数据spi3_ch0_write_and_read(data);// 4. 拉高CS结束通信GPIO1-DR|(120);}3.3 ADXL345初始化与数据采集ADXL345使用前需要初始化配置量程、进入测量模式然后读取三轴加速度数据16位低位在前。// 定义ADXL345数据结构体存储X/Y/Z三轴加速度值typedefstruct{shortx;// X轴加速度shorty;// Y轴加速度shortz;// Z轴加速度}ADXL345_Data;// ADXL345初始化验证ID配置量程进入测量模式intadxl345_init(void){unsignedchardev_id;// 1. 读取设备IDDEVID寄存器地址0x00固定值0xE5dev_idadxl345_read(0x00);if(dev_id!0xE5){return-1;// ID错误初始化失败}// 2. 配置DATA_FORMAT0x31±16g量程0x0Fadxl345_write(0x31,0x0F);// 3. 配置POWER_CTL0x2D0x08 → 进入测量模式adxl345_write(0x2D,0x08);return0;// 初始化成功}// 读取ADXL345三轴加速度数据ADXL345_Dataadxl345_read_data(void){ADXL345_Data data;// X轴低字节(0x32) 高字节(0x33)data.xadxl345_read(0x32);data.x|(short)(adxl345_read(0x33)8);// Y轴低字节(0x34) 高字节(0x35)data.yadxl345_read(0x34);data.y|(short)(adxl345_read(0x35)8);// Z轴低字节(0x36) 高字节(0x37)data.zadxl345_read(0x36);data.z|(short)(adxl345_read(0x37)8);returndata;}四、主函数测试验证SPI驱动是否正常最后写主函数初始化硬件后循环读取加速度数据可通过串口打印需提前实现串口初始化。intmain(void){ADXL345_Data accel_data;// 1. 初始化SPI3spi3_init();// 2. 初始化ADXL345if(adxl345_init()!0){// 串口打印ID错误需实现uart_printfuart_printf(ADXL345 init failed! ID error\r\n);while(1);}uart_printf(ADXL345 init success!\r\n);// 3. 循环读取三轴数据while(1){accel_dataadxl345_read_data();// 打印X/Y/Z轴数据uart_printf(X: %d, Y: %d, Z: %d\r\n,accel_data.x,accel_data.y,accel_data.z);// 简单延时for(inti0;i1000000;i);}return0;}五、实战调试常见问题排查新手最容易遇到“ID读取为0/255”或“数据乱跳”按以下步骤排查5.1 ID读取异常0/255硬件连线检查SCLK/MOSI/MISO/CS的引脚是否接反、虚焊CS电平用万用表测GPIO1_IO20读寄存器时是否拉低读完是否拉高SPI模式确认CONFIGREG的CPOL120和CPHA10是否配置正确模式3时钟分频ECSPI3的时钟不能超过ADXL345的最大速率5MHz本文分频后4.4MHz符合要求逻辑分析仪抓波观察MOSI是否发送了0x80读ID指令MISO是否返回0xE5。5.2 数据乱跳电源稳定性ADXL345需3.3V供电确保电源纹波小接地传感器的GND与IMX6ULL的GND共地避免干扰量程配置确认DATA_FORMAT寄存器配置的量程与数据解析匹配如±16g对应分辨率13mg/LSB。六、总结本文从SPI协议原理出发完成了IMX6ULL ECSPI3的底层配置再到ADXL345的寄存器读写封装最终实现了三轴加速度数据的采集。核心要点SPI的关键是时序匹配CPOL/CPHA必须与外设一致IMX6ULL的ECSPI配置重点是“主机模式数据长度时钟分频”ADXL345的核心是“寄存器读写规则”读地址最高位1写地址最高位0裸机开发中“等待FIFO”“CS电平控制”是SPI通信的关键细节。

相关新闻

AI圈炸锅!Kimi K2.5开源:代码生成+视觉理解,前端开发从此“躺平“

AI圈炸锅!Kimi K2.5开源:代码生成+视觉理解,前端开发从此“躺平“

1月27日,国内AI独角兽月之暗面(Moonshot AI)正式开源并发布新一代多模态大模型——Kimi K2.5!这不仅是Kimi迄今最智能、最全能的模型,更在多项权威评测中斩获全球开源模型最佳成绩,堪称国产大模型的又一里程…

2026/7/3 15:36:11 阅读更多 →
CAP定理实战:大数据场景下的一致性、可用性平衡之道

CAP定理实战:大数据场景下的一致性、可用性平衡之道

CAP定理实战:大数据场景下的一致性、可用性平衡之道 一、引言 (Introduction) 钩子 (The Hook): 当“双11”库存超卖时,我们到底输在了哪里? 2023年双11,某知名电商平台发生了一起“库存超卖”事故:一款限量1000件的…

2026/7/3 1:07:19 阅读更多 →
收藏!AI悄然颠覆流程工业,工程师不进化将被淘汰?万华化学的工业AI实践给你答案

收藏!AI悄然颠覆流程工业,工程师不进化将被淘汰?万华化学的工业AI实践给你答案

AI正在流程工业系统内部悄然变革,表面看似不变,但决策已开始被算法预判。对工程师而言,这不是"要不要用AI"的选择题,而是能力升级的必然趋势。万华化学等企业已应用专业工业AI模型(如TPT),基于真实工业数据提…

2026/7/3 15:36:14 阅读更多 →

最新新闻

JMeter环境配置全攻略:从Java安装到性能测试实战

JMeter环境配置全攻略:从Java安装到性能测试实战

1. 项目概述 如果你刚接触性能测试或者接口自动化,听到“JMeter”这个名字,大概率会有点懵。这玩意儿到底是干嘛的?简单来说,它就像是一个“压力模拟器”和“接口调试器”的结合体。想象一下,你要测试一个网站或者一个…

2026/7/5 8:28:20 阅读更多 →
宜春口腔机构甄选与避坑实测指南

宜春口腔机构甄选与避坑实测指南

随着口腔行业不断发展,宜春本地口腔门诊数量逐年增加,市民看牙的选择变多,但踩坑概率也随之提升。很多人分不清正规诊疗与套路营销,常常遇到低价引流、方案夸大、医生不稳定、售后缺失等问题。结合本地就诊现状,本文从…

2026/7/5 8:28:20 阅读更多 →
PostgreSQL与MySQL比较

PostgreSQL与MySQL比较

PostgreSQL与MySQL比较 摘要 在当今数据驱动的时代,关系型数据库仍然是绝大多数应用系统的核心基础设施。开源数据库领域,PostgreSQL与MySQL长期占据主导地位,两者在发展哲学、架构设计、功能特性和许可模式上存在深刻差异。PostgreSQL以对…

2026/7/5 8:26:20 阅读更多 →
深入NVIDIA驱动的隐藏世界:用Profile Inspector解锁显卡潜能

深入NVIDIA驱动的隐藏世界:用Profile Inspector解锁显卡潜能

深入NVIDIA驱动的隐藏世界:用Profile Inspector解锁显卡潜能 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector 当你在游戏世界中驰骋时,是否曾想过显卡驱动里还藏着许多未公开的宝…

2026/7/5 8:24:19 阅读更多 →
2026年最新揭秘!这些梳子生产厂家排名,你知道几个?

2026年最新揭秘!这些梳子生产厂家排名,你知道几个?

痛点深度剖析 我们团队在实践中发现,梳子行业存在诸多实际技术困境。市面上普通木梳多为机器量产,工艺粗糙、梳齿尖锐,实测数据显示,使用这类梳子时,易扎头皮、拉扯发丝的情况高达80%,严重损伤发质与头皮。…

2026/7/5 8:24:19 阅读更多 →
SkillComposer:当你的 Skill 库超过 80 个,模型怎么知道选哪个?

SkillComposer:当你的 Skill 库超过 80 个,模型怎么知道选哪个?

来源:arXiv:2606.32025(2026-07-01 提交),发布于 arXiv cs.CL / cs.AI 核心标签:Skill 组合、约束自回归解码、任务条件序列预测、技能依赖建模一、为什么你现在应该读这篇 如果你维护的 Agent 系统里 Skill 数量已经涨…

2026/7/5 8:24:19 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻