STM32
直播中

大头

14年用户 427经验值
私信 关注
[问答]

怎么实现Si1143血氧传感器+STM32C8T6 IIC驱动?

怎么实现Si1143血氧传感器+STM32C8T6 IIC驱动?

回帖(1)

庞兴玉

2021-12-3 09:54:41
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的就可以了,通过最后的算法你可以看到打印的数据我最后实现的数据是比正常的大一倍左右而且不能连续测量,如果连续测量数据就会大很多。最后上一张打印的结果图吧



可以看出第一个数据大一倍,连续测量这个数据就大了很多,这个传感器还在继续研究。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分