基于STM32H743的APDS-9930调试心得

文章目录





前言

作为一个硬件开发新手,第一次接触这个传感器,感觉功能实现还是比较简单。先介绍一下这个传感器:简单来说就是一个集成了数字式环境光传感(ALS)、红外LED和一个完整的接近检测系统的八脚封装的芯片。我购买的是淘宝的小模块,不用自己搭建电路,只用通讯使用功能就行。




一、应用平台

芯片使用的STM32H743VITX。开发平台是基于STM32CubeMX的HAL库。硬件的原始资料均来源于其技术手册。




二、使用步骤




1.Cube配置

网上资料很多关于Cube就不讲太多,说一点注意事项吧。Cube先从时钟开始配起,不要一来就先把功能配上去,有时候会出现一些莫名其妙的问题,主要就体现在逻辑分析仪上面。外部输入的时钟在选择DIVM1的时候选择可以整除的数字。H7最大支持480M时钟,使用的时候一般就往最高的配。下面是我自己配的一个时钟。

 APDS-9930使用I2C支持快速I2C原文描述是(Up to 400 kHz (I2C Fast-Mode)),所以在配置时可以选择高一点的速率。I2C的配置没啥配的就速率控制。这里我们选择快速模式。把中断全部打开。NVIC的钩钩打上,这里暂时不用DMA,以后有需求再来更新。在硬件上我使用的是I2C1,软件上对应选择。如果默认选择时与自己硬件端口不一致,可以直接点击右边芯片上面的管脚先选择功能,此时管脚为黄色,说明此时没有配置上,当在左边进行配置后,管脚转为绿色说明配置成功。同时管脚按照自己的意愿进行了选择。

 后面就是工程的一般配置。我使用的Keil uVision5选择MDK-ARM 版本这里选择V5.27,大家可以根据自己的版本来进行选择。

 接下来就是自己代码生成的一般选项,我比较喜欢分开放置(勾选Generated files的第一个选项),这样有助于自己分类各种不同通讯协议的器件。

至此就可以点击GENERATE CODE,生成自己的工程代码进行下一步操作。




2.所用库函数

对于I2C的通讯主要使用了两个函数

HAL_StatusTypeDef HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress,uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)

其中

I2C_HandleTypeDef *hi2c  是I2C的句柄,使用哪一个就写哪一个

uint16_t DevAddress 是设备地址,APDS-9930最奇葩的设定(自我感觉),手册写了设备地址是0x39原文为(The device supports a single slave address of 0x39 hex using 7 bit addressing protocol.)但是在实际使用中却需要左移一位,这个问题让我一度以为这是一个损坏的传感器。但看到回传波形时一度感动涕零。

uint16_t MemAddress 是寄存器地址,在技术手册中给出了寄存器的列表以及分别所表达的含义。下面两张图进一步揭示了我们如何来填写这个寄存器地址。首先,最高位第7位为1,其次,6:5指示了命令的方法,这里我使用的是00,一点问题没有,后面就是就是寄存器的地址,所以这里我的写法使用0x80 | Reg。

uint16_t MemAddSize 是 内部地址读写方式,只有I2C_MEMADD_SIZE_8BIT 和 I2C_MEMADD_SIZE_16BIT两种

uint8_t *pData 写入的数据指针

uint16_t Size 读取的字节数

uint32_t Timeout 超时时间

HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)

写入和读取参数基本上大同小异,写数据时建议一个一个的写,这样变量比较好控制,同时在计算其他数据时也比较好引用。

3.APDS-9930寄存器配置

首先是启用接近传感器的功能,下图揭示了在0x00的寄存器里面的这个字节中需要需要写入的相应位。这里测距离的话我们只需要关心接近测距功能的启用也就是将PEN位置一,以及将PPULSE(0x0E)设置为0x08(官方推荐,原文为:100 mA and 8 pulses are the recommended driving conditions. )。这样就可以读取接近寄存器(0x18和0x19的值)。后续有厂家对接近传感器的测距测试曲线,我们可以拿来与自己的数据拿来对应。在CONTROL(0xF)寄存器中,有对增益(PGAIN)进行设置,这可以改变测量的范围。keil 5自带有逻辑分析仪用于参考。

接近寄存器在不同设定值下厂家测试曲线

 

其还有红外光检测的功能,将AEN和PON置一就可以了。然后读取(CH0和CH1)的值按照给出的计算公式进行计算。AGAIN的值在上文的CONTROL寄存器里面,可以查看后代入计算。计算公式和例子在下文中给出。所求值的正确性有待考证,手头没有专业的测量工具进行测试。总之越亮值越大。

 





总结

以上便是APDS-9930的两大功能的调试,具体的实验结果就留给看官自己起摸索吧。本人在使用逻辑分析仪时,对结果还是比较满意,能够实现对距离的测量,但是其中断的功能并不是我关注的重点所以并没有深究其中。有不正之处希望看官批评指正。

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值