芯片级的传感器(如ICM-26090)和某些功能芯片(如DAC芯片:DAC81404),在编程使用时,往往会陷入一种迷茫的境地,有点恐惧。因为往往它的参考手册长的更一本书一样。主要原因时很多芯片为了兼容各种应用场景,拥有很多我们不需要的冗余功能。

其实这些芯片用起来不难,一般来讲我们的主控芯片都可以通过SPI/I2C等通信接口,去配置这些芯片,读写芯片里的寄存器。 只要按照正确合适的方式,配置好芯片内部的某些寄存器,就能正常操作了。这与直接操作主控芯片的寄存器只是多了一个操作的方式。 主控芯片的寄存器,可以直接读写。 而传感器芯片和功能芯片需用用SPI/I2C等通信方式去操作芯片的寄存器。 下面介绍通用的一种编程思路。

1、第一步

用传感器芯片或功能芯片的型号去网上下载它的参考手册。下到手册后,先看看它的功能介绍,特性介绍,了解这个芯片是干什么的,有什么特性。下面拿ICM-26090来举例说明。

然后通篇拉通了浏览一遍,看看主芯片控制它是用什么通信方式,通信协议是怎样的。

本例中的芯片可以使用I2C和SPI两种通信方式,通信协议也找到了,如上图所示。

最后就是找到芯片需要操作的寄存器。

不必细读,找到了,你的第一步就完成了。

2、第二步

2.1、读设备ID

第二步主要完成一个通信测试,比如你用的SPI通信方式,协议你也知道了。编程的第一步就是先试试能不能通信。所以要进行通信测试,有个很妙的东西,就是基本上这些功能芯片都有一个可以读的东西(设备ID什么的)。

比如ICM-20690芯片里面有个WHO_AM_I寄存器

比如DAC81404芯片里,有个DEVICEID寄存器

所以你通信的第一步,就是把设备ID读出来。

2.2、测试写入功能

如果你设备ID读对了,那你就可以测试写入了。根据通信协议,把(寄存器地址+写指令)+写的数据,写入某一个可读可写的寄存器(R/W), 写了之后,你又可以再读回来,看是否是你刚刚写入的数据。因为你在上一步已经通过读设备ID验证了读的功能,所以现在就是测试写功能。 写功能如果出了问题,可以看看通信协议和时序等相关内容。【我遇到的用SPI通信的芯片,你要写入数据时,你的(寄存器地址+写指令)+写的数据都是连续发送的,不能说写一个字节读一个字节,再写一个字节读一个字节,用这种断断续续的操作】 ,再不行,借助示波器看看你的输出信号。

2.3、封装芯片读写操作的函数

当你读写都没问题了,你就可以把读/写芯片的操作函数封装起来。 以便于进一步的使用。

如:

void SPI_A_READ(unsigned char addr, unsigned char * Rxdata){spi_cs_A_Enable;HAL_SPI_Transmit(&hspi1,&addr,1,100);HAL_SPI_Receive(&hspi1,Rxdata,1,100);spi_cs_A_Disable;
}void SPI_A_WRITE(unsigned char addr, unsigned char Txdata){unsigned char Rxdata=0x00;spi_cs_A_Enable;HAL_SPI_Transmit(&hspi1,&addr,1,100);HAL_SPI_Transmit(&hspi1,&Txdata,1,100); // 经测试,地址字节和数据字节必须连续发送。 否则无法正常写入// 接不接收都可以,接收的数据是无用的,但稳妥起见,还是接一下吧HAL_SPI_Receive(&hspi1,&Rxdata,1,100);HAL_SPI_Receive(&hspi1,&Rxdata,1,100);spi_cs_A_Disable;
}

3、第三步

第三步,是最后一步,也是最难的一步。就是配置芯片寄存器。这个没有什么捷径,这是避无可避的。

但我认为最有效的办法,就是把每一个需配置的寄存器(有些寄存器是只读的,那就不用配置,有些寄存器是与配置无关的,比如记录传感器最终的测量输出的寄存器)都配置一遍,穷举所有可配置的寄存器。

我一般就是把每一个寄存器的地址,全部都用宏定义先抄下来。

然后写一个config函数,比如ICM-20690芯片,就叫icm20690_config函数。

把每个需要配置的寄存器,挨个配置一遍。配置的时候,就读一读这个寄存器是啥意思。

穷举所有可配置的寄存器,劳资全部给他配置一遍,最稳妥。 很多芯片看着吓人,寄存器数量很多的,但其实很多都是冗余的,别虚。

如:

void icm20690_config(void){// register: SMPLRT_DIV// This register is only effective when FCHOICE_B register bits are 2’b00, and (0 < DLPF_CFG < 7).// register: CONFIG // FIFO_MODE - 0 // EXT_SYNC_SET - 0// DLPF_CFG - 0 250Hz 0.97ms 8KhZ  FCHOICE_B(0 0)SPI_A_WRITE(CONFIG_ADDR_W,0x00);// register: GYRO_CONFIG// XG_ST YG_ST ZG_ST 0// FS_SEL 0 250dps// FCHOICE_B (2'b00)SPI_A_WRITE(GYRO_CONFIG_ADDR_W,0x00);// register: ACCEL_CONFIG// XA_ST YA_ST ZA_ST 0// AFS_SEL 00 ±2g// AFS_SEL_OIS 00 ±2gSPI_A_WRITE(ACCEL_CONFIG_ADDR_W,0x00);// register: ACCEL_CONFIG2// FIFO_SIZE 00 128byte// DEC2_CFG 3                           32x averaging filter // ACCEL_FCHOICE_B 0 // A_DLPF_CFG 7                        420Hz 1.38ms 1HzSPI_A_WRITE(ACCEL_CONFIG_2_ADDR_W,0x37);// register: LP_MODE_CONFIG// GYRO_CYCLE 0 low-power gyroscope mode is disable// GYRO_AVGCFG 111b = 7H        128x averaging filterSPI_A_WRITE(LP_MODE_CONFIG_ADDR_W,0x70);// register: FIFO_EN// TEMP_OUT 1 GYRO_XOUT 1 GYRO_YOUT 1 GYRO_ZOUT 1 ACCEL_XYZ_OUT 1SPI_A_WRITE(FIFO_EN_ADDR_W,0xF8);// register: ODR_DELAY_EN// ODR_DELAY_EN 0 Function is disabled.SPI_A_WRITE(ODR_DELAY_EN_ADDR_W,0x00);// register:INT_ENABLESPI_A_WRITE(INT_ENABLE_ADDR_W,0x00);// register:FIFO_WM_THSPI_A_WRITE(FIFO_WM_TH_ADDR_W,0x00);   // If zero then watermark interrupt is disabled.// register:PWR_MGMT_1 2SPI_A_WRITE(PWR_MGMT_1_ADDR_W,0x00);SPI_A_WRITE(PWR_MGMT_2_ADDR_W,0x00);
}

4、第四步

第四步,其实不说都知道,就是测试你的配置起作用了没有,比如传感器芯片,你就把传感器输出读出来。动动你的设备,看看传感器输出有没有? 对不对? 美滋滋啊。

传感器_芯片级传感器和功能芯片的使用和编程思路相关推荐

  1. pcie总线与cpci总线_基于通用PCI接口功能芯片和热插拔控制器实现CPCI总线控制的设计...

    CPCI总线简介 CPCI总线是一个开放式.国际性技术标准,由PCI总线工业计算机制造商组织PICMG(PCI Industrial Computer Manufacturer Group)负责制定和 ...

  2. 单片机涡轮流量传感器_关于涡轮流量计传感器的维护保养

    涡轮流量计是一种精密流量测量仪表,与相应的流量积算仪表配套可用于测量液体的流量和总量.广泛用于石油.化工.冶金.科研等领域的计量.控制系统.配备有卫生接头的涡轮流量计传感器可以应用于制药.食品等行业. ...

  3. java狼羊草过河_解决狼、羊、白菜过河问题的编程思路

    前几天女朋友复习人工智能的考试,看见了一道经典的狼.羊.白菜过河问题,题目如下:一个人带着一只羊,一条狼和一个白菜想过河,假设他每次只能带一只羊,或者一条狼,或者一棵白菜过河,并限定人不在场时,狼和羊 ...

  4. 基于单片机的车辆防碰撞及自动刹车系统(STC89C52RC芯片+超声波传感器HC-SR04+液晶屏1602+继电器+蜂鸣器)...

    基于单片机的车辆防碰撞及自动刹车系统(STC89C52RC芯片+超声波传感器HC-SR04+液晶屏1602+继电器+蜂鸣器) 本系统的目的是设计一个基于单片机的车辆防碰撞及自动刹车系统,系统通过对汽车 ...

  5. 芯片如何储存信息_十四五规划之:芯片

    大家好,我是老蒼,一个秉承好赛道,好公司实操,中长线模式的小散...... 一.现实使命 随着十四五规划重点细则的发布,那么,一批具有前瞻性.战略性的国家重大科技项目也会逐步实施,比如,重点强调的☞集 ...

  6. 红外倒车雷达原理图_斯坦福研究登Nature子刊:芯片实现激光雷达技术,价格低至数百美元...

    一直以来,是否采用激光雷达都是区分自动驾驶技术派系的「三八线」,相比 Waymo.Cruise 等中规中矩采用激光雷达方案的传统派,马斯克一直秉持着 AI 视觉方案+毫米波雷达取代激光雷达的思路. 这 ...

  7. 车规级芯片、手机芯片、电脑芯片比较

    在汽车新四化(电动化.智能化.网联化.共享化)的当下,尤其是对于智能化和网联化,车规迹芯片,无疑是最基础的硬件底座 (座舱操作系统,无疑是最基础的软件底座) .本文对车规级芯片进行的梳理,让大家对此有 ...

  8. 激光雷达赛道“白刃战”?硅光芯片级FMCW技术进入量产周期

    芯片级封装.图像级分辨率.直接获取每个像素的瞬时速度,被视为激光雷达的下一个时代.去年,Mobileye宣布将自主研发硅光芯片+FMCW(调频连续波)技术路线,计划2025年量产. 如今,一家名为Ae ...

  9. ble芯片 全称_一文看懂BLE芯片竞争格局

    来源:内容来自基业常青经济研究院,作者李亚乔.陈凯,谢谢. 网络应用快速发展,数据传输场景日益丰富.据We Are Social和Hootsuite报告统计,截至2018年底,全球互联网用户规模超过4 ...

最新文章

  1. 语义分割--Large Kernel Matters--Improve Semantic Segmentation by Global Convolutional Network
  2. AMP328音频放大器
  3. vagrant系列教程(二):vagrant的配置文件vagrantfile详解(转)
  4. Linux 下源码编译安装 vim 8.1
  5. 电脑桌面便签_电脑桌面定时提醒记事本便签软件
  6. uva 11174(排列组合+搜索)
  7. python网络爬虫系列(五)——数据提取 jsonpath模块
  8. 虚函数指针sizeof不为sizeof(void*)
  9. 使用XStream注解处理复杂xml的属性及数据集合(xml转对象)
  10. apache php mysql环境搭建_Ubuntu+Apache+PHP+Mysql环境搭建(完整版)
  11. K8s CKS认证学习全套笔记
  12. eclipse接入hadoop-2.7.6集群(hadoop2.x版本通用),含免费资源
  13. 推荐系统(6):推荐算法之基于内容的推荐算法
  14. 大数据之道 HMM系列
  15. 算法工程师-机器学习-数据科学家面试准备[外企和国外公司、春招、秋招]
  16. python读excel 包含格式_python读取excel格式的文件
  17. 动力环境监控系统的必要性及功能作用!
  18. 通关HCIE-RS新版实验的正确姿势,请查收!
  19. Java和Julia谁更快_Julia和Java性能比较
  20. 如何修复无法在苹果Mac上使用缩放

热门文章

  1. geoserver发布wms服务和wmts服务,并在cesium上进行调用
  2. vb连接Access数据库自定义
  3. element-ui之el-collapse-transition(折叠展开动画)源码解析学习
  4. 金山词霸在360极速浏览器下不能取词
  5. 【作业】RGB/BMP转YUV格式及YUV视频拼接
  6. Linux安全加固——登录
  7. [CloudSim学习心得] 第一天学习Cloudsim
  8. ODX 诊断数据库转换工具 — DDC
  9. VUE的优缺点简单理解
  10. 计算机初中校本研修计划,初中教师校本研修计划.doc