完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
Si1143血氧传感器运用于低功耗可穿戴设备上,它本来是运用于检测距离的但是后来发展成了检验血氧浓度的传感器。我是一个单片机小白,刚进入实习遇到了需要驱动这样一个传感器,再驱动的过程中遇到一些问题并通过看中文参考手册解决了一些问题,但是最后驱动的结果与真实值有一定的差距,驱动的过程稍微了解了一些,为了方便后来人少经历问题,同时方便自己以后查看问题所以写下了这篇文章。
最开始找原厂提供了一份Arduino的驱动源码,以前虽然使用过Arduino但是不是很熟悉。硬着皮头上,后来移植IIC协议到STM32上面验证驱动命令,结果驱动不起来。于是乎上网查看资料,不查不要紧一查全是Arduino的资料,关于STM32驱动它的可以说是没有,只有一些51的代码,但是51的代码也只是用来计算距离的或者有一些干脆就只驱动,取了几个寄存器的参数值出来而已。下面上问题。 1.Arduino上面PA4,PA5引脚算是硬件IIC引脚,STM32应该用模拟IIC还是硬件IIC 我使用的是模拟IIC驱动的,我想硬件IIIC应该也可以驱动 2.传感器作为从机,从机地址为多少,全局地址,全局复位命令是多少 从机地址0x5A,全局响应地址0x00,全局复位命令0x06 应该怎么理解全局地址和全局复位命令,我想在我这里就是第一条发送0x00,后再发0x06具体的可以参考我上的代码 delay_ms(2000); IIC_Start(); IIC_Send_Byte(0x00); if(!IIC_Wait_Ack()) { LED0=0; } IIC_Send_Byte(0x06); if(!IIC_Wait_Ack()) { // LED0=1; printf("检测到"); } IIC_Stop(); delay_ms(2000); 代码是紧接着IIC初始化中调用的。 全局初始化后我们就应该进行寄存器配置,寄存器配置我们参考Arduino中的寄存器命令但是我尝试了如果光使用Arduino上寄存器的配置硬件驱动不起来,所以再百度上找到一篇和这个类似的51驱动代码上连接http://read.pudn.com/downloads796/sourcecode/embedded/3142061/Si1143/Si1143.c__.htm 这个驱动命令能驱动起来,但是和计算血氧有明显的差距,所以我结合了一下最后驱动命令如下 Si114_wrcmd(0x07,0x17); Si114_wrcmd(0x03,0x03); Si114_wrcmd(0x04,0x10); Si114_wrcmd(0x06,0x01); Si114_wrcmd(0x08,0x84); Si114_wrcmd(0x09,0x08); Si114_wrcmd(0x0A,0x08); Si114_wrcmd(0x0F,0x39); Si114_wrcmd(0x10,0x02); Si114_wrcmd(0x01,0x77); Si114_wrcmd(0x0B,0x00); Si114_wrcmd(0x02,0x21); Si114_wrcmd(0x03,0x04); Si114_wrcmd(0x07,0x03); Si114_wrcmd(0x08,0x03); Si114_wrcmd(0x0A,0x70); //Si114_wrcmd(0x18,0x0F); Si114_wrcmd(0x17,0x01); Si114_wrcmd(0x18,0xBB); Si114_wrcmd(0x17,0x37); Si114_wrcmd(0x18,0xA1); Si114_wrcmd(0x18,0x0F); 按照Arduino的只需要写道我注释掉的那一行就可以了但是实际驱动需要用上面的代码来驱动,具体原因我没有怎么认真的去研究,IIC写入命令的格式为如下,第一条发设备地址家读写位也就是直接发设备地址左移一位如下 IIC_Send_Byte(0x5A<<1); 然后发寄存器地址 IIC_Send_Byte(WriteAddr); 最后发数据 IIC_Send_Byte(DataToWrite); 这就是写入命令的过程 读取的过程如下 写入设备地址IIC_Send_Byte(0X5A<<1); IIC_Wait_Ack(); 发送寄存器地址 IIC_Send_Byte(ReadAddr); //发送低地址 IIC_Wait_Ack(); IIC信号起始 IIC_Start(); 进入读写读写需要设备地址先左移再加1也就是相当于8位地址最后一位为读写位,如果读写位是0就是写入命令,如果读写位是1则为读,这个需要自己去理解一下。 IIC_Send_Byte((0X5A<<1)+1); //进入接收模式 IIC_Wait_Ack(); temp=IIC_Read_Byte(0); IIC_Stop(); //产生一个停止条件 return temp; 这样传感器就驱动起来了。 最后就是移植血氧算法涉及到一个循环计数函数 start = millis(); millis();函数百度一下替换成STM32的就可以了,通过最后的算法你可以看到打印的数据我最后实现的数据是比正常的大一倍左右而且不能连续测量,如果连续测量数据就会大很多。最后上一张打印的结果图吧 可以看出第一个数据大一倍,连续测量这个数据就大了很多,这个传感器还在继续研究。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1617 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1543 浏览 1 评论
977 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
683 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1595 浏览 2 评论
1863浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
644浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
515浏览 3评论
531浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
504浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 02:42 , Processed in 0.822574 second(s), Total 74, Slave 57 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号