尝试读取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
答案 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进行测试以验证您的代码。