如何让Silabs Si1141脱离悬浮模式

时间:2015-03-20 13:20:37

标签: c sensor i2c proximity

尝试读取PS1值。但是,当我运行以下代码时,它一直在" chip_stat"它暂停了。

main (void){

    init(); // Configuration initialization
    si1141_init(); // Si1141 sensor initialization

    __delay_ms(30); // Delay to ensure Si1141 is completely booted, must be atleast 25ms

    si1141_WriteToRegister(REG_IRQ_STATUS, 0xFF); // Clear interrupt source

    signed int status;

    while(1){

        WriteToI2C(0x5A<<1); // Slave address
        PutByteI2C(0x30); // chip_stat
        ReadFromI2C(0x5A<<1); // Slave address
        if((status = GetByteI2C(0x30)) == Sw_I2C_ERROR) // chip_stat
        {
            return Sw_I2C_ERROR;
        }
        Stop_I2C();
        status++;;
    }
}

用于读取PS1值的代码如下。我正在读取值16705.所有测量值保持不变。

该值应该从0到32767上下移动,因为它会测量或多或少的移动。

signed int si1141_ReadFromRegister(unsigned char reg){
    signed int data;

    WriteToI2C(0x5A<<1); // Slave address
    ReadFromI2C(0x5A<<1); // Slave address
    if((data = GetByteI2C(Sw_I2C_LAST)) == Sw_I2C_ERROR)
    {
        return Sw_I2C_ERROR;
    }
    Stop_I2C();
    return data;
}

main (void){

    init(); // Configuration initialization
    si1141_init(); // Si1141 sensor initialization

    __delay_ms(30); // Delay to ensure Si1141 is completely booted, must be atleast 25ms

    si1141_WriteToRegister(REG_IRQ_STATUS, 0xFF); // Clear interrupt source

    signed int PS1;

    while(1){        

    PS1 = si1141_ReadFromRegister(REG_PS1_DATA0) + (256 * si1141_ReadFromRegister(REG_PS1_DATA1)); // Proximity CH1

    }
}

我链接了i2c通信的文件。

https://www.dropbox.com/s/q41vw444gjvj0qa/swi2c.c?dl=0 https://www.dropbox.com/s/1mshyz88o15hz8c/swi2c.h?dl=0

1 个答案:

答案 0 :(得分:0)

首先排除I2C错误。您的软件I2C库完全没有帮助。

确保首先读取寄存器PART_ID,REV_ID,SEQ_ED,并且值与数据表相匹配。你的期望值。这是为了排除I2C错误。

你必须采取相当多的步骤才能开始阅读。

重置Si114x。编程HW_KEY。将PS_LED21编程为合理的值。 AN告诉你如何。 编程的值高于组件可以处理的值以及您的设计可以支持的值。如果操作不正确,这可能会销毁。不要对PS_ADC_GAIN有任何有趣的想法,或者你你的设备。阅读AN。此时编程PS_ADC_GAIN。

清除PSLED21_SELECT - 仅PS2_LED,显然为LED1设置PS1_LED - 和PSLED3_SELECT。这可能是可选,但是数据表告诉你这样做,所以这样做。

接下来,将CH_LIST编程为PS1_EN,然后发送PS_FORCE命令。**现在从PS1_DATA0和PS1_DATA1读取PS1数据。完成。

使用ALS进行测试可能更容易,以排除使用一些杂散红外线对传感器造成饱和的影响(在整个夜晚工作时想想夕阳)。

**对于命令协议,您必须实现数据表中列出的命令/响应协议。我建议您首先使用reset和nop进行测试以验证您的代码。