ADXL346 挖坑填坑

最近做的项目里用到了ADXL346加速度传感器,话不多说开始操作流程。

硬件 IDEA
EFR32MG21 ADXL346 Simplicity Studio
选择ADXL436 4线SPI通信

引脚对应图
Pin Function
Pin6 SCX
Pin7 SDO
Pin4 SDX
Pin8 CSB

SPI通信模式

主要内容:

1、采用三线SPI模式进行数据传输的时候需要将DATA_FORMAT(Address 0x31)地址的D6位设置为0,反之D6位为1时数据的传输模式为四线SPI模式。
2、SPI的数据交互采用的是SPI的模式3:SCLK是串行端口时钟,由SPI主机提供。在空闲期间SCLK应处于高电平状态。SDI和SDO分别是串行数据输入和输出。SCLK下降沿数据更新,SCLK上升沿数据采样。

3、CS是串口使能线,由SPI主控器控制。这条线必须在传输开始时低,在传输结束时高。

Simplicity Studio 相关配置

直接上代码。

// A code block
var foo = 'bar';
//ADXL346.c
/*******************************************************
*
* Function name: ADXL346Init
* Description: ADXL346Init
* Parameter:  (void)
* Return uint8_t
**********************************************************/
uint8_t ADXL346Init(void)
{uint8_t TempData = 0;ADXL346_SpiRead_byte(DEVICE_ID,&TempData);while(TempData != DeviceID)     //Check whether the device ID is correct. Verify that SPI communication is normal{USART_Tx(USART0, TempData); //USART send device IDreturn 0;}ADXL346_SpiWrite_byte( INT_ENABLE, 0x00);ADXL346_SpiWrite_byte(  DATA_FORMAT , 0x0B);     // 中断寄存器清零ADXL346_SpiWrite_byte(  POWER_CTL   , 0x08);     // 传感器测量模式ADXL346_SpiWrite_byte(  BW_RATE     , 0x0E);     // 传感器传输数据速率1600HZADXL346_SpiWrite_byte(  FIFO_CTL    , 0x00);     // FIFO模式设置ADXL346_SpiWrite_byte(  INT_MAP     , 0x00);     // 中断映射ADXL346_SpiWrite_byte(  OFSX , 0x00);   // X轴偏移量ADXL346_SpiWrite_byte(  OFSY , 0x00);   // Y轴偏移量ADXL346_SpiWrite_byte(  OFSZ , 0x00);   // Z轴偏移量ADXL346_SpiWrite_byte(  INT_ENABLE  , 0x83);     // 中断寄存器return 1;
}/*******************************************************
*
* Function name: ReadADXL346Data
* Description: Read and store the displacement
* Parameter:  (void)
* Return Nothing
**********************************************************/
void ReadADXL346Data(void)
{unsigned char Buf[6];ADXL346_XYZ *ADXL346;ADXL346->ADXL346_X = 0;ADXL346->ADXL346_Y = 0;ADXL346->ADXL346_Z = 0;ADXL346_SpiRead_byte( DATA_X0, Buf);ADXL346_SpiRead_byte( DATA_X1, Buf + 1);ADXL346_SpiRead_byte( DATA_Y0, Buf + 2);ADXL346_SpiRead_byte( DATA_Y1, Buf + 3);ADXL346_SpiRead_byte( DATA_Z0, Buf + 4);ADXL346_SpiRead_byte( DATA_Z1, Buf + 5);ADXL346->ADXL346_X = ((Buf[1]<<8|Buf[0]));ADXL346->ADXL346_Y = ((Buf[3]<<8|Buf[2]));ADXL346->ADXL346_Z  = ((Buf[5]<<8|Buf[4]));USART_Tx(USART0, ADXL346->ADXL346_X); //USART send XUSART_Tx(USART0, ADXL346->ADXL346_Y); //USART send YUSART_Tx(USART0, ADXL346->ADXL346_Z); //USART send Z
}/*******************************************************
*
* Function name: ADXL346_SpiWrite_byte
* Description: Write one byte of data to ADXL346
* Parameter:
*        @address
*        @data
*
* Return sl_status_t
**********************************************************/
static sl_status_t ADXL346_SpiWrite_byte(uint8_t address,uint8_t data)
{uint8_t txBuffer[2];Ecode_t ret_code;txBuffer[0] = address & ~0x80;    // RWb = 0 for writes.txBuffer[1] = data;ret_code = SPIDRV_MTransmitB(spi_handle, txBuffer, 2);if (ret_code != ECODE_EMDRV_SPIDRV_OK) {return SL_STATUS_TRANSMIT;}return SL_STATUS_OK;
}/*******************************************************
*
* Function name: ADXL346_SpiRead_byte
* Description: Read one byte of data to ADXL346
* Parameter:
*        @cmd
*        @*data
*
* Return sl_status_t
**********************************************************/
void ADXL346_SpiRead_byte(uint8_t cmd,uint8_t *data)
{uint8_t txBuffer[3];uint8_t rxBuffer[3];Ecode_t ret_code;txBuffer[0] = cmd| 0x80;txBuffer[1] = 0x00;txBuffer[2] = 0x00;ret_code = SPIDRV_MTransferB(spi_handle, txBuffer, rxBuffer, 3);if (ret_code == ECODE_EMDRV_SPIDRV_OK){*data = rxBuffer[2];}
}
// ADXL346.h
#ifndef ADXL346_H
#define ADXL346_h
//******************************//
//        USER define           //
//******************************//#define DeviceID        0xE6      //Device ID Reset value
#define DEVICE_ID       0x00      //device ID 0xE6
#define THRESH_TAP      0x1D
#define OFSX            0x1E      // X value
#define OFSY            0x1F      // Y value
#define OFSZ            0x20      // Z value
#define DUR             0x21
#define Latent          0x22
#define Window          0x23
#define THRESH_ACT      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      //Sampling rate
#define POWER_CTL       0x2D      //Sleep control
#define INT_ENABLE      0x2E
#define INT_MAP         0x2F
#define INT_SOURCE      0x30
#define DATA_FORMAT     0x31      //interrupt mode
#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 TAP_SIGN        0x3A
#define ORIENT_CONF     0x3B
#define Orient          0x3C#define spi_handle    sl_spidrv_usart_spi_handletypedef BMA490L_INTF_RET_TYPE (*bma490l_read_fptr_t)(uint8_t reg_addr, uint8_t *read_data, uint32_t len,void *intf_ptr);
typedef struct{uint16_t ADXL346_X;uint16_t ADXL346_Y;uint16_t ADXL346_Z;
}ADXL346_XYZ;//******************************//
//        API_Statement         //
//******************************//uint8_t ADXL346Init(void);
void ReadADXL346Data(void);
static sl_status_t ADXL346_SpiWrite_byte(uint8_t address,uint8_t data);
void ADXL346_SpiRead_byte(uint8_t cmd,uint8_t *data);
#endif

完结撒花~~~

EFR32MG21 with ADXL346相关推荐

  1. EFR32MG21 zigbee 3.0 OTA 升级实验

    EFR32MG21 zigbee 3.0 OTA 升级实验 参考文档:AN728 https://www.sekorm.com/doc/1607600.html 芯片:EFR32MG21A010F76 ...

  2. Androidq下编译efr32mg21

    要在Androidq下编译efr32mg21,花了2天时间,分享下 拿到源码后,先在linux的环境下编译成功 sudo apt-get install libreadline-dev sudo ap ...

  3. 基于51单片机驱动ADXL346 (LCD1602显示)

    基于51单片机驱动ADXL346 (LCD1602显示) 一.ADXL346传感器介绍 1.实物图 2.产品说明 3.电气参数 4.通信协议 二.驱动代码 1.引脚定义 2.初始化函数 3.主函数 三 ...

  4. 单片机 ADXL346 IIC通讯

    文章目录 一.简介 二.特性 三.示例代码 IIC协议链接 一.简介 ADXL346是一款小而薄的超低功耗3轴加速度计,分辨率高(13位),测量范围达±16 g.数字输出数据为16位二进制补码格式,可 ...

  5. 魔改宜家灯泡当主机,玩转《毁灭战士》无压力!网友:远超我家第一台电脑...

    贾浩楠 胡子豪 发自 凹非寺 量子位 报道 | 公众号 QbitAI 这年头,"万物皆可<毁灭战士>"!(Doom) 极客们把这款猛男必玩的游戏移植到五花八门的设备上, ...

  6. 2021年度科技行业有哪些大事件?“杰出科技奖”公布36家企业领先科技技术

    上海2021年12月27日 /美通社/ -- 2021年度科技行业有哪些大事件?让杰出科技奖Great Tech Awards 2021一一盘点. 由上海市国际贸易促进委员会主办,上海国展展览中心有限 ...

  7. ADXL345实现功能全面的计步器

    计步器是一种颇受欢迎的日常锻炼进度.,可以激励人们挑战自己,增强体质,帮助瘦身.早期设计利用加重的机械开关检测步伐,并带有一个简单的计数器.晃动这些装置时,可以听到有一个金属球来回滑动,或者一个摆锤左 ...

  8. 使用Docker Compose构建ZigBee基础架构

    For me, the first half of 2020 was a start for ZigBee and home automation basics. After the lockdown ...

  9. EFR32芯科zigbee学习文档资源总结

    硬件相关 efr32mg21外设例程 世强资源 [经验]如何将EFM32和EFR32的烧录引脚配置成GPIO? [经验]多协议无线 SOC EFR32MG实现ZigBee的OTA操作指南 在rejoi ...

最新文章

  1. X-003 FriendlyARM tiny4412 uboot移植之添加相应目录文件
  2. 解决修改SQL SERVER 默认1433端口 访问出错的问题;
  3. Coding and Paper Letter(一)
  4. 牛客题霸 [扑克牌顺子] C++题解/答案
  5. arch linux添加用户,Users and groups (简体中文)
  6. php代码实现文件下载,php实现文件下载的简单代码
  7. JAVA EE配TOMCAT
  8. jQuery keyup事件
  9. python面值组合_算法题 - 拼凑面额 - Python
  10. 「大学生offer内推计划」:阿里/百度/华为等一线大厂都在抢这样的人!
  11. Linux远程传输命令scp、rsync(tar打包归档并在系统之间传输文件)
  12. SQL 建表与索引
  13. 全网最详细的零基础动态web项目集成mybatis框架实现增删改查系统(案例+源码)
  14. java常见问题incompatible types
  15. 【前端小白的每日一点】
  16. 进大厂全靠自学,微软头条实习生现身说法:我是这样自学深度学习的
  17. 北大韦神等十人获奖,均分1000万元,达摩院2021青橙奖出炉
  18. tensorflow2实现yolov3并使用opencv4.5.5 DNN加载模型预测
  19. 你的个人AI助理Pi来了
  20. origin 气泡和颜色映射图

热门文章

  1. java实现分页功能(一)
  2. 全国计算机java语言程序设计_2018年全国计算机等级考试二级教程:Java语言程序设计(2018年版)...
  3. Python 写文件中文乱码问题
  4. Md5工具包加密之MD5Util
  5. 荒野白茶特点及口感如何
  6. MobPush 创建推送
  7. html如何添加时钟效果,五步轻松实现JavaScript HTML时钟效果
  8. 文本分类实战----数据处理篇----embeddings与vocab中词汇不相覆盖问题的处理办法
  9. WPS表格的常用操作技巧大全
  10. RabbitMQ学习笔记:集群和网络分区(Network Partitions)