一、简介

官方数据手册:https://pan.baidu.com/s/1Y0M4ImNsBvAvECy-yNUvxg 提取码:itsr

  • 超低噪声、高分辨率 0.001°/√Hz
  • SPI数字接口
  • 优越的机械阻尼特性
  • 使用温度范围:-40~125℃
  • 消耗电流1.2mA(供给电源:3.0~3.6V时)
  • 成熟的静电容量3D-MEMS技术

二、硬件连接

功能口 引脚
MISO 17
MOSI 18
CLK 20
CSN 19

三、添加SPI驱动

查看 NRF52832学习笔记(5)——SPI接口使用

官方文档对 SPI 时钟有推荐,因为 SCK 会影响 SCL3300 的噪声水平,建议时钟频率在 2MHz~4MHz 以获得最优性能。


修改 SPI 频率为 4MHz,SPI_FREQUENCY_FREQUENCY_M4

四、移植文件

链接:https://pan.baidu.com/s/1fS7LCpQW36QGIvJBoxP4gQ 提取码:3opk
board_scl3300.cboard_scl3300.h 加入工程的Application文件夹下

4.1 board_scl3300.c

/********************************************************************** INCLUDES*/
#include "nrf_delay.h"#include "board_scl3300.h"
#include "board_spi.h"static void writeRegister(uint32_t cmd);
static void readRegister(void);
static void delayMs(uint32_t time);
static void delayUs(uint32_t time);/********************************************************************** LOCAL VARIABLES*/
static uint8_t s_readData[4] = {0};/********************************************************************** PUBLIC FUNCTIONS*/
/**@brief SCL3300的初始化函数@param 无@return 无
*/
void SCL3300_Init(void)
{delayMs(10);writeRegister(CHANGE_TO_MODE4);                         // 选择倾角模式readRegister();delayMs(5);writeRegister(READ_STATUS_SUMMARY);                     // 清除状态readRegister();writeRegister(READ_STATUS_SUMMARY);readRegister();writeRegister(READ_STATUS_SUMMARY);readRegister();writeRegister(ENABLE_ANGLE_OUTPUTS);                    // 使能角度输出readRegister();
}/**@brief 检查SPI通信,返回值第3字节为0xC1则通信正常@param 无@return 无
*/
void SCL3300_Test(void)
{writeRegister(READ_ID);readRegister();// 打印s_readData[2]
}/**@brief 读取角度@param direction -[in] 要读取的方向X,Y,Z轴@return 角度数
*/
float SCL3300_ReadAngle(uint8_t direction)
{if(direction == ANG_X){writeRegister(READ_ANG_X);}else if(direction == ANG_Y){writeRegister(READ_ANG_Y);}else if(direction == ANG_Z){writeRegister(READ_ANG_Z);}readRegister();// SPI返回结构第1字节OP+RS,uint16_t angle = (s_readData[1] << 8) + s_readData[2];  // 第2和第3字节为Data// 第4字节为CRCfloat fangle = (float)angle / 16384.0 * 90.0;           // 如3976/2^14*90=21.84°return fangle;
}/********************************************************************** LOCAL FUNCTIONS*/
/**@brief 写SCL3300寄存器@param cmd -[in] 写入命令@return 无
*/
static void writeRegister(uint32_t cmd)
{  uint8_t writeData[4] = {0};writeData[0] = (cmd >> 24) & 0xFF;writeData[1] = (cmd >> 16) & 0xFF;writeData[2] = (cmd >> 8) & 0xFF;writeData[3] = (cmd >> 0) & 0xFF;SPI_CS_LOW;SPI_ReadWriteData(writeData, NULL, 4);SPI_CS_HIGH;delayUs(10);
}/**@brief 读SCL3300寄存器@param 无@return 无
*/
static void readRegister(void)
{   SPI_CS_LOW;SPI_ReadWriteData(NULL, s_readData, 4);SPI_CS_HIGH;delayUs(10);
}/**@brief 毫秒级延时函数@param time -[in] 延时时间(毫秒)@return 无
*/
static void delayMs(uint32_t time)
{nrf_delay_ms(time);
}/**@brief 微秒级延时函数@param time -[in] 延时时间(微秒)@return 无
*/
static void delayUs(uint32_t time)
{nrf_delay_us(time);
}/****************************************************END OF FILE****************************************************/

4.2 board_scl3300.h

#ifndef _BOARD_SCL3300_H_
#define _BOARD_SCL3300_H_/********************************************************************** INCLUDES*//********************************************************************** DEFINITIONS*/
#define ANG_X                   0
#define ANG_Y                   1
#define ANG_Z                   2//******************************************************************/
//                          传感数据                                /
//******************************************************************/
#define READ_ACC_X              0x040000F7
#define READ_ACC_Y              0x080000FD
#define READ_ACC_Z              0x0C0000FB
#define READ_TEMPERATURE        0x140000EF
#define READ_ANG_X              0x240000C7
#define READ_ANG_Y              0x280000CD
#define READ_ANG_Z              0x2C0000CB//******************************************************************/
//                          自我检测                                /
//******************************************************************/
#define READ_STO                0x100000E9//******************************************************************/
//                          状态                                    /
//******************************************************************/
#define READ_STATUS_SUMMARY     0x180000E5//******************************************************************/
//                          错误标志                                /
//******************************************************************/
#define READ_ERR_FLAG1          0x1C0000E3
#define READ_ERR_FLAG2          0x200000C1//******************************************************************/
//                          命令                                    /
//******************************************************************/
#define READ_CMD                0x340000DF
#define CHANGE_TO_MODE1         0xB400001F  // 默认模式,1.8g full-scale 40 Hz 1st order low pass filter
#define CHANGE_TO_MODE2         0xB4000102  // 23.6g full-scale 70 Hz 1st order low pass filter
#define CHANGE_TO_MODE3         0xB4000225  // Inclination mode 13 Hz 1st order low pass filter
#define CHANGE_TO_MODE4         0xB4000338  // Inclination mode 13 Hz 1st order low pass filter Low noise mode
#define SET_POWER_DOWN_MODE     0xB400046B
#define WAKE_UP                 0xB400001F
#define SW_RESET                0xB4002098//******************************************************************/
//                          角度控制                                /
//******************************************************************/
#define ENABLE_ANGLE_OUTPUTS    0xB0001F6F//******************************************************************/
//                          芯片ID                                  /
//******************************************************************/
#define READ_ID                 0x40000091//******************************************************************/
//                          串行块                                  /
//******************************************************************/
#define READ_SERIAL1            0x640000A7
#define READ_SERIAL2            0x680000AD//******************************************************************/
//                          选择BANK                                /
//******************************************************************/
#define READ_CURRENT_BANK       0x7C0000B3
#define SWITCH_TO_BANK_0        0xFC000073 // 默认,读bank1后自动返回
#define SWITCH_TO_BANK_1        0xFC00016E/********************************************************************** API FUNCTIONS*/
void SCL3300_Init(void);
void SCL3300_Test(void);
float SCL3300_ReadAngle(uint8_t direction);#endif /* _BOARD_SCL3300_H_ */

五、初始化流程

开机先等待 10ms——>设置测量模式——>再等待 5ms——>读取状态——>使能角度输出。

六、倾角转换公式

七、API调用

需包含头文件 board_scl3300.h

SCL3300_Init

功能 SCL3300的初始化函数
函数定义 void SCL3300_Init(void)
参数
返回

SCL3300_Test

功能 检查SPI通信,返回值第3字节为0xC1则通信正常
函数定义 void SCL3300_Test(void)
参数
返回

SCL3300_ReadAngle

功能 读取角度
函数定义 float SCL3300_ReadAngle(uint8_t direction)
参数 direction:要读取的方向X,Y,Z轴
返回 角度数

八、使用例子

8.1 初始化

1)添加头文件

#include "board_scl3300.h"
#include "board_spi.h"

2)添加初始化代码(main.c的main函数中)

/**@brief Function for application main entry.*/
int main(void)
{bool erase_bonds;/*-------------------------- 外设驱初始化 ---------------------------*/// Initialize.log_init();                                                                    // 日志驱动初始化                                                                  timers_init();                                                              // 定时器驱动初始化(在此加入自定义定时器)SPI_Init();                                                                 // SPI驱动初始化SCL3300_Init();                                                             // SCL3300三轴倾角驱动初始化······
/*-------------------------- 开启应用 ---------------------------*/// Start execution.NRF_LOG_INFO("Template example started."); ···
}

8.2 读取角度

float angX = SCL3300_ReadAngle(ANG_X);
NRF_LOG_INFO("X:" NRF_LOG_FLOAT_MARKER , NRF_LOG_FLOAT(angX));
float angY = SCL3300_ReadAngle(ANG_Y);
NRF_LOG_INFO("Y:" NRF_LOG_FLOAT_MARKER , NRF_LOG_FLOAT(angY));
float angZ = SCL3300_ReadAngle(ANG_Z);
NRF_LOG_INFO("Z:" NRF_LOG_FLOAT_MARKER "\n", NRF_LOG_FLOAT(angZ));

九、测量方向


• 由 Leung 写于 2020 年 10 月 26 日

• 参考:高精度三轴加速度计SCL3300驱动代码

NRF52832学习笔记(34)——倾角传感器SCL3300使用相关推荐

  1. nrf52832 学习笔记(五)蓝牙主从机连接和连接参数更新

    nrf52832 学习笔记(五)蓝牙主从机连接和连接参数更新 主机连接 nrf52832 SDK中主机连接从机需要使用 sd_ble_gap_connect(ble_gap_addr_t const ...

  2. nrf52832 学习笔记(三)蓝牙从机广播

    nrf52832 学习笔记(三)蓝牙从机广播 蓝牙从机要想被主机连接,首先需要发送广播信息,周围主机通过扫描广播信号,根据从机的广播信息,判断是否连接. 蓝牙协议栈初始化 不管是主机还是从机,要想使用 ...

  3. nrf52832 学习笔记(六)配对和绑定

    nrf52832 学习笔记(六)配对和绑定 配对绑定推荐博客低功耗蓝牙配对绑定解读和实践 蓝牙在配对之前都是明文通信的,也就是说主从机之间传输的数据包可以被第三方抓取分析逆向,而且如果没有配对,谁都可 ...

  4. nrf52832 学习笔记(七)蓝牙协议层级理解

    nrf52832 学习笔记(七)蓝牙协议层级理解 本文主要由一下几篇文档摘录汇总而成 ,如有错误欢迎斧正 da14531 蓝牙协议文档 深入浅出低功耗蓝牙(BLE)协议栈 低功耗蓝牙ATT/GATT/ ...

  5. NRF52832学习笔记(40)——RFID RC522使用

    一.简介 MF RC522 是应用于 13.56MHz 非接触式通信中高集成度读写卡系列芯片中的一员.是 NXP 公司针对"三表"应用推出的一款低电压.低成本.体积小的非接触式读写 ...

  6. NRF52832学习笔记(38)——修改发射功率

    一.背景 蓝牙接收信号强度 RSSI 的直接影响因素就是蓝牙信号的发射功率.发射功率就是你所使用的设备(开发板.手机)所发射出来给主机或从机设备的信号强度.同时在实际应用当中,时常也需要修改蓝牙的发射 ...

  7. nrf52832 学习笔记(一)开发资料汇总

    nrf52832 学习笔记(一)开发资料汇总 协议栈和SDK下载地址 nordic官方的sdk分为ncs(nRF Connect SDK)和sdk17(nRF5 SDK)两种,区别是: sdk17不会 ...

  8. nrf52832 学习笔记(二)SDK框架分析

    nrf52832 学习笔记(二)SDK框架分析 个人对SDK框架的一些理解,如有错误欢迎斧正. flash 分区 在不包含DFU的情况下,nrf52832 flash划分为: MBR 0x000000 ...

  9. nrf52832 学习笔记(四)蓝牙主机扫描

    nrf52832 学习笔记(四)蓝牙主机扫描 从机发出广播后就需要主机进行扫描了,主机扫描之前和从机一样,也需要协议栈初始化.GAP初始化.GATT初始化,这些和从机类似,参考 nrf52832 学习 ...

  10. NRF52832学习笔记(35)——4G模块EC200S使用

    一.简介 EC200S-CN 是移远通信最近推出的 LTE Cat 1 无线通信模块,支持最大下行速率 10Mbps 和最大上行速率 5Mbps,具有超高的性价比:同时在封装上兼容移远通信多网络制式 ...

最新文章

  1. 主流Kubernetes发行版梳理,看完就会选了
  2. linux下用户的添加
  3. 近世代数--整环上的唯一分解问题--相伴是整环上的等价关系,最大公因子建立在相伴所划分的等价类上
  4. antd table设置表格一个单元格的字体颜色_微软Office三件套,各有一个效率神器,全都知道的人不超过1%...
  5. 拜占庭将军问题深入探讨
  6. 实现tomcat的https单向认证及双向认证
  7. Python 中缀表达式转换后缀表达式
  8. 【php更换数据库为orcle】phpstudy+orcle
  9. ICPC North Central NA Contest 2017 B - Pokemon Go Go
  10. 学习杂谈:费曼学习法和show me the code
  11. 190129每日一句
  12. 金蝶KIS专业版13.0视频教程
  13. C++多线程并发(五)---原子操作与无锁编程
  14. 学生信息管理系统(头哥适用版)(c语言)
  15. Android开发学习之WindowManager实现弹窗
  16. bat写暴力破解系统密码
  17. 程序设计-在校整理-06 最常公共子序列与子串+2048小游戏+KNN简单实例
  18. 志愿者系统/新时代文明实践平台
  19. 【gulp】什么是gulp?有什么用?怎么用?
  20. 【小程序】tabbar用法

热门文章

  1. Macbook中的文件显示与隐藏方法
  2. android系统美化app,手机主题App哪个好用?安卓手机主题App推荐
  3. Java七牛云报400错误
  4. Win10 启动英雄联盟后系统没声音 英雄联盟bug
  5. 百度世界2020再曝语义理解领域新进展:文心ERNIE全景图亮相
  6. 【职场新贵】告诉你如何在压力下高效工作
  7. 葡萄城报表模板库更新!新增物流行业特色模板
  8. LifecycleBeanPostProcessor的作用
  9. 沉浸式体验参加网络安全培训班,学习过程详细到底!
  10. 天才在左,疯子在右,我们在哪?