村田 IMU SCC2000系列芯片驱动
村田 IMU SCC2000系列芯片驱动
文章目录
- 村田 IMU SCC2000系列芯片驱动
- 一、总体特点
- 二、启动时序和逻辑
- 三、SPI通信和数据读取
- 四、数据处理
一、总体特点
1、本次具体的型号是村田SCC2130系,IMU有1轴(x)陀螺仪、三轴加速度计和温度计,测量范围陀螺仪±125°/s,加速度±6,温度-50到150。
2、高稳定性,广泛的自诊断等安全保护,因此主要应用都是在一些汽车工业级的场景。
3、32位四线SPI,最大8MHZ通信速度,有CRC校验。
4、硬件针脚图如下,实际上硬件IMU比较大针脚太多,成本高。
二、启动时序和逻辑
1、启动时序也就是驱动IMU初始化,主要是根据状态机的图来实现整个IMU的驱动,本次MCU是采用国产芯片
2、硬件上电复位或者软件复位IO引脚上拉后需要等待20ms后在总状态寄存器设置输出滤波,接着根据两种不同的滤波等待不同的时间,然后需要清除所有的状态寄存器状态,读总状态寄存器看RS位返回状态。正常状态后才可以正常读取IMU数据。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TALJ1CQP-1647160100539)(C:/Users/曾伟荣/AppData/Roaming/Typora/typora-user-images/image-20220313130839320.png)]
3、RS的状态
4、驱动代码
uint16_t HW_MURATA_INIT_TIM_Cnt_u16 = 0;
uint8_t HW_MURATA_INIT_OK_Flag_u8 = 0xEE;
uint8_t HW_MURATA_INIT_TIM_stopFlag_u8 = 0xEE;
void FUN_HW_Murata_IMU_Init()
{uint8_t S_agspi_rsdata_u8;if(HW_MURATA_INIT_TIM_stopFlag_u8 == 0xEE){HW_MURATA_INIT_TIM_Cnt_u16 ++; // 10ms计数周期}if(HW_MURATA_INIT_TIM_Cnt_u16 < 2){Murata_IMU_SendAndRead(Murata_IMU_HARD_RST);}else if(HW_MURATA_INIT_TIM_Cnt_u16 < 5){Murata_IMU_SendAndRead(Murata_IMU_Status_Summary_10HZ);}else if(HW_MURATA_INIT_TIM_Cnt_u16 < 10){if(HW_MURATA_INIT_OK_Flag_u8 == 0xEE){Murata_IMU_SendAndRead(Murata_IMU_RATE_STATUS1);Murata_IMU_SendAndRead(Murata_IMU_RATE_STATUS2);Murata_IMU_SendAndRead(Murata_IMU_ACC_STATUS);Murata_IMU_SendAndRead(Murata_IMU_Common_Status);Murata_IMU_SendAndRead(Murata_IMU_Status_Summary);StartupOK = TRUE;Response_StatSum = Murata_IMU_SendAndRead(Murata_IMU_Status_Summary);S_agspi_rsdata_u8 = (uint8_t)((Response_StatSum & Murata_IMU_STATUS_MASK) >> 24);if(S_agspi_rsdata_u8 != 1){StartupOK = FALSE;}if(!StartupOK){Response_RateState1 =Murata_IMU_SendAndRead(Murata_IMU_RATE_STATUS1);Response_RateState2 = Murata_IMU_SendAndRead(Murata_IMU_RATE_STATUS2);Response_AccStat = Murata_IMU_SendAndRead(Murata_IMU_ACC_STATUS);Response_ComStat1 = Murata_IMU_SendAndRead(Murata_IMU_Common_Status);}HW_MURATA_INIT_OK_Flag_u8 = 0xAA;}}else{HW_MURATA_INIT_TIM_Cnt_u16 = 0xEEEB;HW_MURATA_INIT_TIM_stopFlag_u8 = 0xAA;}
}
三、SPI通信和数据读取
1、32位SPI,还是OUT-OFF模式,下一帧返回上一帧的结果,而我是直接连着发两帧相同的命令这样回传处理就很方便。
2、MOSI的读写命令前8位为寄存器地址中间16位为数据,最后八位为CRC校验。
3、官方手册已经给了具体的相关寄存器读写命令可以直接用
4、读取数据代码,本次MCU是国产的芯片上海芯旺微的KF系列,环境啥都还挺好搭建,上手也挺容易。
uint32_t Murata_IMU_SendAndRead(uint32_t data)
{uint32_t receive_data;SPI_I2S_SendData32(SPI0_COM,data);delay_us(2);SPI_I2S_SendData32(SPI0_COM,data);delay_us(2);receive_data = SPI_I2S_ReceiveData(SPI0_COM);return receive_data;
}
/*原始数据读取,读取到的数据是补码形式*/
/*x轴角速度*/
x_rate = Murata_IMU_SendAndRead(Murata_IMU_X_RATE);
/*x轴加速度*/
x_acc = Murata_IMU_SendAndRead(Murata_IMU_X_ACC);
/*y轴加速度*/
y_acc = Murata_IMU_SendAndRead(Murata_IMU_Y_ACC);
/*z轴加速度*/
z_acc = Murata_IMU_SendAndRead(Murata_IMU_Z_ACC);
/*温度值*/
temp = Murata_IMU_SendAndRead(Murata_IMU_TEMP);
/*状态读取*/
rate_status1 = Murata_IMU_SendAndRead(Murata_IMU_RATE_STATUS1);
rate_status2 = Murata_IMU_SendAndRead(Murata_IMU_RATE_STATUS2);
acc_status = Murata_IMU_SendAndRead(Murata_IMU_ACC_STATUS);
common_status = Murata_IMU_SendAndRead(Murata_IMU_Common_Status);
summary_status = Murata_IMU_SendAndRead(Murata_IMU_Status_Summary);
四、数据处理
1、SPI读取到的数据是一个二进制补码,需要我们对数据处理转化为原码。手册上也有处理方法。
2、博世SMI810一样也是原始数据转化为原码后除以sensitivity。
3、数据处理代码
/*数据处理*/
/*x轴角速度处理*/
x_rate_origin = (int32_t)(Murata_IMU_DataProcess(x_rate,x_rate));
S_SPI_yawrate_s16 =(int32_t)(x_rate_origin*2);
/*x,y,z轴加速度处理*/
x_acc_origin = (int32_t)(Murata_IMU_DataProcess(x_acc,x_acc));
S_SPI_accx_s16 = (int32_t)(x_acc_origin*100/1962);y_acc_origin = (int32_t)(Murata_IMU_DataProcess(y_acc,y_acc));
S_SPI_accy_s16 = (int32_t)(y_acc_origin*100/1962);z_acc_origin = (int32_t)(Murata_IMU_DataProcess(z_acc,z_acc));
S_SPI_accz_s16 = (int32_t)(z_acc_origin*100/1962);
/*温度处理*/
S_SPI_temperture_s16_last =(int32_t)(Murata_IMU_DataProcess(temp,temp));
S_SPI_temperture_s16 = (int32_t)((S_SPI_temperture_s16_last * 10/ 147 + 60));
uint16_t Murata_IMU_DataProcess(uint32_t input_data,uint32_t input_status)
{uint16_t output_data;uint16_t output_status;uint16_t output_first;/*数据处理*/output_data = (uint16_t)((input_data & Murata_IMU_DATA_MASK ) >> 8);output_first = output_data >> 15;if(output_first == 1){/*为负数,取反加+1到原码,但输出的uint型仍为正数*/output_data = (~output_data) + 1;/*转化为负数*/output_data = (int16_t)(output_data & 0xFFFF);output_data *= -1;}else{/*为正数,直接取反码为原码*/output_data = output_data;}/*状态冗余有效性判断*/output_status = (uint8_t)((input_status & Murata_IMU_STATUS_MASK)>>24);if (output_status != 1){spi_imu_status_flag = 1;output_data = 0xFFFF;}return output_data;
}
村田 IMU SCC2000系列芯片驱动相关推荐
- 触摸屏gt9xx系列芯片驱动调试
平台:STM32MP157 触摸屏芯片:gt911 驱动:goodix.c 现在很多平台都使用gt9xx系列的触摸屏,我在imx6dl平台和imx6ull平台都调试过这个芯片. 这次刚好调试157平台 ...
- Bosch SMI810 IMU传感器芯片驱动
Bosch SMI810 IMU传感器芯片驱动 文章目录 Bosch SMI810 IMU传感器芯片驱动 一.总体特点 二.SPI通信 三.数据处理 四.寄存器设置和代码编写 一.总体特点 1.smi ...
- 【HISI系列】海思芯片驱动使用方法
DATE: 2019-2-22 前言 在调试不同海思芯片的编码器时,遇到了需要加载和卸载驱动的情况,并且调试过程中出现不同硬件层面和编码的错误,特将问题定位方法记录一下以供后续参考. 1.海思 ...
- 了解 ARM Coretex-A 系列芯片
1.UART串口 2.SPI 接口 3.USB Host/Device 4.音频接口 5.SDMMC接口 6.IIC(I2C)通信接口 7.键盘和外部中断 8.PWM Timer PWM Timer脉 ...
- 基于STM32系列芯片的 IAP实现的探索
基于STM32系列芯片的 IAP实现的探索 什么是IAP? 如何实现IAP? 第一步:学习官方源代码 第二步:了解STM32芯片基本硬件参数 第三步.搞清除STM32内置Flash 第四步. STM3 ...
- 要闻君说:台积电将为iPhone生产5纳米A系列芯片?腾讯云TStack与银河麒麟完成互认证……...
关注并标星星CSDN云计算 极客头条:速递.最新.绝对有料.这里有企业新动.这里有业界要闻,打起十二分精神,紧跟fashion你可以的! 每周三次,打卡即read 更快.更全了解泛云圈精彩news g ...
- 村田 | 用于人机界面和生命体征检测的压电薄膜传感器
产品 Picoleaf™是一款可进行高灵敏度按压检测的柔性薄型传感器.它可以利用高度敏感的功能为新的按压和生物信号检测做出贡献.村田制作所可以为实现无缝设计新功能提供合适的解决方案. 村田制作所采用特 ...
- Ameya详解:村田的用于人机界面和生命体征检测的压电薄膜传感器
村田制作所采用特有的压电技术研发的"Picoleaf",是一款可进行高灵敏度按压检测的柔性薄型传感器.可节省安装空间,与以往的传感器相比,在薄型.组装性能及耐久性等方面实现了改良. ...
- TMI8150芯片驱动开发
TMI8150芯片驱动开发 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TMI8150芯片驱动开发 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 T ...
最新文章
- iOS 相册和网络图片的存取
- ML基石_1_LearningProblem
- java55矩阵output_leetcode 59 螺旋矩阵2 Java 用时较短-Go语言中文社区
- 追根究底之追本溯源:光标
- vijos P1051 送给圣诞夜的极光
- python导入机制及importlib模块
- Android WebView https白屏、Http和Https混合问题、证书配置和使用
- 谷歌眼镜Mirror app开发之简单新闻浏览页面
- linux环境c语言课程设计,linux环境下c语言编程课程设计
- C++多态(二)——纯虚函数、抽象类
- Linux uname命令
- jQuery.fn.extend()方法
- try与raise用法
- 人工智能︱腾讯如何利用英特尔至强处理器在游戏内创建购买推荐系统?
- hive打patch流程说明
- Flutter AnimatedIcon 图标也可以动画
- html兼容ie低版本,jquery不兼容低版本ie浏览器怎么办?
- Ubuntu 安装 uWSGI
- 图解windows系统 硬盘主分区、扩展分区、逻辑分区的区别.
- linux 命令 xxd linux下查看二进制文件
热门文章
- ERROR 1709 (HY000): Index column size too large. The maximum column size is 767 bytes.
- 【搞定CAD】经典练习题库解答、有点难度
- 马斯克:未来可将个人意识复制到特斯拉机器人上
- PolyFormer: Referring Image Segmentation as Sequential Polygon Generation 论文阅读笔记
- Cookie报错java.lang.IllegalArgumentException
- 宽屏企业网站源码中英php_Lankecms蓝科中英文双语企业网站系统PHP版V2.0,PHP伪静态html宽屏LED照明公司模板外贸黑色...
- Blender学习笔记(基于辣椒酱教程)
- 523、Java Spring Cloud Alibaba -【Spring Cloud Alibaba SkyWalking】 2021.12.27
- 树莓派小车教程(四)之——基本实现网页控制小车速度可调(同步执行)
- Python爬虫-采集某车平台二手车数据