如何让silabs Si1141退出挂起模式
How to get silabs Si1141 out of suspended mode
正在尝试读取 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
先排除I2C错误。你的软件 I2C 库一点用都没有。
确保先读取寄存器 PART_ID、REV_ID、SEQ_ED,并且值与数据 sheet 相匹配。你的期望值。这是为了排除 I2C 错误。
您必须采取相当多的步骤才能开始阅读。
重置 Si114x。编程 HW_KEY。将 PS_LED21 编程为合理的值。 AN 会告诉你怎么做。 不要 编写一个比您的组件可以处理的值和您的设计可以支持的值更高的值。如果操作不当,这可能会破坏 某些东西。也不要对 PS_ADC_GAIN 有任何有趣的想法,否则你会 fry 你的设备。阅读 AN。此时不要编程PS_ADC_GAIN。
清除 PSLED21_SELECT -- 仅 PS2_LED,为 LED1 保留 PS1_LED 设置,显然 -- 和 PSLED3_SELECT。这是可能可选的,但数据sheet告诉你这样做,那就去做。
接下来,将 CH_LIST 编程为 PS1_EN,然后发送 PS_FORCE 命令。** 现在从 PS1_DATA0 和 [=52 读取 PS1 数据=].完成。
首先使用 ALS 进行测试可能更容易排除一些杂散红外线使您的传感器饱和(当您整夜工作时想想落日)。
** 对于命令协议,您必须实施数据sheet 中规定的command/response 协议。我建议你先用 reset 和 nop 来测试你的代码。
正在尝试读取 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
先排除I2C错误。你的软件 I2C 库一点用都没有。
确保先读取寄存器 PART_ID、REV_ID、SEQ_ED,并且值与数据 sheet 相匹配。你的期望值。这是为了排除 I2C 错误。
您必须采取相当多的步骤才能开始阅读。
重置 Si114x。编程 HW_KEY。将 PS_LED21 编程为合理的值。 AN 会告诉你怎么做。 不要 编写一个比您的组件可以处理的值和您的设计可以支持的值更高的值。如果操作不当,这可能会破坏 某些东西。也不要对 PS_ADC_GAIN 有任何有趣的想法,否则你会 fry 你的设备。阅读 AN。此时不要编程PS_ADC_GAIN。
清除 PSLED21_SELECT -- 仅 PS2_LED,为 LED1 保留 PS1_LED 设置,显然 -- 和 PSLED3_SELECT。这是可能可选的,但数据sheet告诉你这样做,那就去做。
接下来,将 CH_LIST 编程为 PS1_EN,然后发送 PS_FORCE 命令。** 现在从 PS1_DATA0 和 [=52 读取 PS1 数据=].完成。
首先使用 ALS 进行测试可能更容易排除一些杂散红外线使您的传感器饱和(当您整夜工作时想想落日)。
** 对于命令协议,您必须实施数据sheet 中规定的command/response 协议。我建议你先用 reset 和 nop 来测试你的代码。