资讯详情

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

芯片传感器(如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 ±2g  SPI_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 1Hz  SPI_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 filter  SPI_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 1  SPI_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_ENABLE  SPI_A_WRITE(INT_ENABLE_ADDR_W,0x00);    // register:FIFO_WM_TH  SPI_A_WRITE(FIFO_WM_TH_ADDR_W,0x00); // If zero then watermark interrupt is disabled.    // register:PWR_MGMT_1 2  SPI_A_WRITE(PWR_MGMT_1_ADDR_W,0x00);  SPI_A_WRITE(PWR_MGMT_2_ADDR_W,0x00); } 

4、第四步

第四步,其实不说大家都知道,就是测试你的配置是否工作,比如传感器芯片,你会读出传感器输出。移动你的设备,看看传感器是否输出。 对不对? 美滋滋啊。

标签: zg2传感器如何维护w8486a传感器a用在设备的传感器hal880传感器传感器afs60b

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台