村田 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系列芯片驱动相关推荐

  1. 触摸屏gt9xx系列芯片驱动调试

    平台:STM32MP157 触摸屏芯片:gt911 驱动:goodix.c 现在很多平台都使用gt9xx系列的触摸屏,我在imx6dl平台和imx6ull平台都调试过这个芯片. 这次刚好调试157平台 ...

  2. Bosch SMI810 IMU传感器芯片驱动

    Bosch SMI810 IMU传感器芯片驱动 文章目录 Bosch SMI810 IMU传感器芯片驱动 一.总体特点 二.SPI通信 三.数据处理 四.寄存器设置和代码编写 一.总体特点 1.smi ...

  3. 【HISI系列】海思芯片驱动使用方法

    DATE: 2019-2-22 前言     在调试不同海思芯片的编码器时,遇到了需要加载和卸载驱动的情况,并且调试过程中出现不同硬件层面和编码的错误,特将问题定位方法记录一下以供后续参考. 1.海思 ...

  4. 了解 ARM Coretex-A 系列芯片

    1.UART串口 2.SPI 接口 3.USB Host/Device 4.音频接口 5.SDMMC接口 6.IIC(I2C)通信接口 7.键盘和外部中断 8.PWM Timer PWM Timer脉 ...

  5. 基于STM32系列芯片的 IAP实现的探索

    基于STM32系列芯片的 IAP实现的探索 什么是IAP? 如何实现IAP? 第一步:学习官方源代码 第二步:了解STM32芯片基本硬件参数 第三步.搞清除STM32内置Flash 第四步. STM3 ...

  6. 要闻君说:台积电将为iPhone生产5纳米A系列芯片?腾讯云TStack与银河麒麟完成互认证……...

    关注并标星星CSDN云计算 极客头条:速递.最新.绝对有料.这里有企业新动.这里有业界要闻,打起十二分精神,紧跟fashion你可以的! 每周三次,打卡即read 更快.更全了解泛云圈精彩news g ...

  7. 村田 | 用于人机界面和生命体征检测的压电薄膜传感器

    产品 Picoleaf™是一款可进行高灵敏度按压检测的柔性薄型传感器.它可以利用高度敏感的功能为新的按压和生物信号检测做出贡献.村田制作所可以为实现无缝设计新功能提供合适的解决方案. 村田制作所采用特 ...

  8. Ameya详解:村田的用于人机界面和生命体征检测的压电薄膜传感器

    村田制作所采用特有的压电技术研发的"Picoleaf",是一款可进行高灵敏度按压检测的柔性薄型传感器.可节省安装空间,与以往的传感器相比,在薄型.组装性能及耐久性等方面实现了改良. ...

  9. TMI8150芯片驱动开发

    TMI8150芯片驱动开发 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TMI8150芯片驱动开发 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 T ...

最新文章

  1. iOS 相册和网络图片的存取
  2. ML基石_1_LearningProblem
  3. java55矩阵output_leetcode 59 螺旋矩阵2 Java 用时较短-Go语言中文社区
  4. 追根究底之追本溯源:光标
  5. vijos P1051 送给圣诞夜的极光
  6. python导入机制及importlib模块
  7. Android WebView https白屏、Http和Https混合问题、证书配置和使用
  8. 谷歌眼镜Mirror app开发之简单新闻浏览页面
  9. linux环境c语言课程设计,linux环境下c语言编程课程设计
  10. C++多态(二)——纯虚函数、抽象类
  11. Linux uname命令
  12. jQuery.fn.extend()方法
  13. try与raise用法
  14. 人工智能︱腾讯如何利用英特尔至强处理器在游戏内创建购买推荐系统?
  15. hive打patch流程说明
  16. Flutter AnimatedIcon 图标也可以动画
  17. html兼容ie低版本,jquery不兼容低版本ie浏览器怎么办?
  18. Ubuntu 安装 uWSGI
  19. 图解windows系统 硬盘主分区、扩展分区、逻辑分区的区别.
  20. linux 命令 xxd linux下查看二进制文件

热门文章

  1. ERROR 1709 (HY000): Index column size too large. The maximum column size is 767 bytes.
  2. 【搞定CAD】经典练习题库解答、有点难度
  3. 马斯克:未来可将个人意识复制到特斯拉机器人上
  4. PolyFormer: Referring Image Segmentation as Sequential Polygon Generation 论文阅读笔记
  5. Cookie报错java.lang.IllegalArgumentException
  6. 宽屏企业网站源码中英php_Lankecms蓝科中英文双语企业网站系统PHP版V2.0,PHP伪静态html宽屏LED照明公司模板外贸黑色...
  7. Blender学习笔记(基于辣椒酱教程)
  8. 523、Java Spring Cloud Alibaba -【Spring Cloud Alibaba SkyWalking】 2021.12.27
  9. 树莓派小车教程(四)之——基本实现网页控制小车速度可调(同步执行)
  10. Python爬虫-采集某车平台二手车数据