EFR32MG21 with ADXL346
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相关推荐
- EFR32MG21 zigbee 3.0 OTA 升级实验
EFR32MG21 zigbee 3.0 OTA 升级实验 参考文档:AN728 https://www.sekorm.com/doc/1607600.html 芯片:EFR32MG21A010F76 ...
- Androidq下编译efr32mg21
要在Androidq下编译efr32mg21,花了2天时间,分享下 拿到源码后,先在linux的环境下编译成功 sudo apt-get install libreadline-dev sudo ap ...
- 基于51单片机驱动ADXL346 (LCD1602显示)
基于51单片机驱动ADXL346 (LCD1602显示) 一.ADXL346传感器介绍 1.实物图 2.产品说明 3.电气参数 4.通信协议 二.驱动代码 1.引脚定义 2.初始化函数 3.主函数 三 ...
- 单片机 ADXL346 IIC通讯
文章目录 一.简介 二.特性 三.示例代码 IIC协议链接 一.简介 ADXL346是一款小而薄的超低功耗3轴加速度计,分辨率高(13位),测量范围达±16 g.数字输出数据为16位二进制补码格式,可 ...
- 魔改宜家灯泡当主机,玩转《毁灭战士》无压力!网友:远超我家第一台电脑...
贾浩楠 胡子豪 发自 凹非寺 量子位 报道 | 公众号 QbitAI 这年头,"万物皆可<毁灭战士>"!(Doom) 极客们把这款猛男必玩的游戏移植到五花八门的设备上, ...
- 2021年度科技行业有哪些大事件?“杰出科技奖”公布36家企业领先科技技术
上海2021年12月27日 /美通社/ -- 2021年度科技行业有哪些大事件?让杰出科技奖Great Tech Awards 2021一一盘点. 由上海市国际贸易促进委员会主办,上海国展展览中心有限 ...
- ADXL345实现功能全面的计步器
计步器是一种颇受欢迎的日常锻炼进度.,可以激励人们挑战自己,增强体质,帮助瘦身.早期设计利用加重的机械开关检测步伐,并带有一个简单的计数器.晃动这些装置时,可以听到有一个金属球来回滑动,或者一个摆锤左 ...
- 使用Docker Compose构建ZigBee基础架构
For me, the first half of 2020 was a start for ZigBee and home automation basics. After the lockdown ...
- EFR32芯科zigbee学习文档资源总结
硬件相关 efr32mg21外设例程 世强资源 [经验]如何将EFM32和EFR32的烧录引脚配置成GPIO? [经验]多协议无线 SOC EFR32MG实现ZigBee的OTA操作指南 在rejoi ...
最新文章
- X-003 FriendlyARM tiny4412 uboot移植之添加相应目录文件
- 解决修改SQL SERVER 默认1433端口 访问出错的问题;
- Coding and Paper Letter(一)
- 牛客题霸 [扑克牌顺子] C++题解/答案
- arch linux添加用户,Users and groups (简体中文)
- php代码实现文件下载,php实现文件下载的简单代码
- JAVA EE配TOMCAT
- jQuery keyup事件
- python面值组合_算法题 - 拼凑面额 - Python
- 「大学生offer内推计划」:阿里/百度/华为等一线大厂都在抢这样的人!
- Linux远程传输命令scp、rsync(tar打包归档并在系统之间传输文件)
- SQL 建表与索引
- 全网最详细的零基础动态web项目集成mybatis框架实现增删改查系统(案例+源码)
- java常见问题incompatible types
- 【前端小白的每日一点】
- 进大厂全靠自学,微软头条实习生现身说法:我是这样自学深度学习的
- 北大韦神等十人获奖,均分1000万元,达摩院2021青橙奖出炉
- tensorflow2实现yolov3并使用opencv4.5.5 DNN加载模型预测
- 你的个人AI助理Pi来了
- origin 气泡和颜色映射图
热门文章
- java实现分页功能(一)
- 全国计算机java语言程序设计_2018年全国计算机等级考试二级教程:Java语言程序设计(2018年版)...
- Python 写文件中文乱码问题
- Md5工具包加密之MD5Util
- 荒野白茶特点及口感如何
- MobPush 创建推送
- html如何添加时钟效果,五步轻松实现JavaScript HTML时钟效果
- 文本分类实战----数据处理篇----embeddings与vocab中词汇不相覆盖问题的处理办法
- WPS表格的常用操作技巧大全
- RabbitMQ学习笔记:集群和网络分区(Network Partitions)