问题描述
我正在使用STM32F051接口通过I2C协议与APDS Sensor一起为我的项目编写代码。但是我的代码仅在我连接ST-Link并加载代码后才运行。然后关闭电源,再打开,然后我的代码无法运行。我发现问题是发送i2c配置功能。但是我不明白为什么我在加载代码时会运行。请帮助我解决该问题。谢谢! 功能发送I2C:
void writeDataTo(uint8_t Address,uint8_t reg,uint8_t data)
{
I2C_SlaveAddressConfig(I2C1,Address);
I2C_MasterRequestConfig(I2C1,I2C_Direction_Transmitter);
I2C_AckNowledgeConfig(I2C1,ENABLE);
//------------------------------------------------
I2C_GenerateSTART(I2C1,ENABLE);
I2C_NumberOfBytesConfig(I2C1,2);
I2C_SendData(I2C1,reg);
while(I2C_GetFlagStatus(I2C1,I2C_ISR_TXE) == Bit_RESET)
{
}
I2C_SendData(I2C1,data);
while(I2C_GetFlagStatus(I2C1,I2C_ISR_TXE) == Bit_RESET)
{
}
I2C_GenerateSTOP(I2C1,ENABLE);
}
传感器配置功能:
*void APDS_9500_Configuration(void)
{
writeDataTo(APDS9500_ADDRESS,APDS9500_R_RegBankSet,0x00); // select bank 0
// Define cursor limits
writeDataTo(APDS9500_ADDRESS,APDS9500_R_CursorClampLeft,0x07); // min horiz value
writeDataTo(APDS9500_ADDRESS,APDS9500_R_CursorClampRight,0x17); // max horiz value
writeDataTo(APDS9500_ADDRESS,APDS9500_R_CursorClampup,0x06); // min vert value
writeDataTo(APDS9500_ADDRESS,APDS9500_R_Int2_En,0x01); // enable interrupt on proximity
// Auto exposure/Auto gain Controls
writeDataTo(APDS9500_ADDRESS,APDS9500_R_AELedOff_UB,0x2D); // exposure time upper bound
writeDataTo(APDS9500_ADDRESS,APDS9500_R_AELedOff_LB,0x0F); // exposure time lower bound
writeDataTo(APDS9500_ADDRESS,APDS9500_R_AE_Exposure_UB_L,0x3C); // low byte auto exposure upper bound
writeDataTo(APDS9500_ADDRESS,APDS9500_R_AE_Exposure_UB_H,0x00); // high byte auto exposure upper bound
writeDataTo(APDS9500_ADDRESS,APDS9500_R_AE_Exposure_LB_L,0x1E); // low byte auto exposure lower bound
writeDataTo(APDS9500_ADDRESS,APDS9500_R_AE_Gain_LB,0x20); // auto gain upper bound
writeDataTo(APDS9500_ADDRESS,APDS9500_R_Manual,0x10); // enable auto exposure
writeDataTo(APDS9500_ADDRESS,0x5E,0x10); // don't kNow
writeDataTo(APDS9500_ADDRESS,0x60,0x27); // don't kNow
// Set up Interrupt
writeDataTo(APDS9500_ADDRESS,APDS9500_InputMode_GPIO_0_1,0x42); // set GPIO0 as OUTPUT,GPIO1 as INPUT
writeDataTo(APDS9500_ADDRESS,APDS9500_InputMode_GPIO_2_3,0x44); // set GPIO2 as INPUT,GPIO3 as INPUT
writeDataTo(APDS9500_ADDRESS,APDS9500_InputMode_INT,0x04); // set INT as INPUT
// Detection thresholds
writeDataTo(APDS9500_ADDRESS,APDS9500_R_Cursor_objectsizeTh,0x01); // object size threshold for cursor mode
writeDataTo(APDS9500_ADDRESS,APDS9500_R_NoMotionCountThd,0x06); // no motion counter threshold
writeDataTo(APDS9500_ADDRESS,APDS9500_R_ZDirectionThd,0x0A); // gesture detection z threshold
writeDataTo(APDS9500_ADDRESS,APDS9500_R_ZDirectionXYThd,0x0C); // gesture detection x and y thresholds
writeDataTo(APDS9500_ADDRESS,APDS9500_R_ZDirectionAngleThd,0x05); // angle threshold for forward and backward detection
writeDataTo(APDS9500_ADDRESS,APDS9500_R_RotateXYThd,0x14); // rotation detection threshold
writeDataTo(APDS9500_ADDRESS,APDS9500_R_Filter,0x3F); // filter weight and frame position threshold
writeDataTo(APDS9500_ADDRESS,APDS9500_R_FilterImage,0x19); // use pixel brightness for weak average filter
writeDataTo(APDS9500_ADDRESS,APDS9500_R_YtoZSum,0x19); // z-direction mapping parameter
writeDataTo(APDS9500_ADDRESS,APDS9500_R_YtoZFactor,0x0B); // z-direction mapping parameter
writeDataTo(APDS9500_ADDRESS,APDS9500_R_FilterLength,0x03); // filter length for cursor object center
writeDataTo(APDS9500_ADDRESS,APDS9500_R_WaveThd,0x64); // wave gesture counter and angle thresholds
writeDataTo(APDS9500_ADDRESS,APDS9500_R_AbortCountThd,0x21); // abort gesture counter threshold
//writeDataTo(APDS9500_ADDRESS,APDS9500_R_Prox_UB,0x00); // Proximity up bound
// Change to Bank 1
writeDataTo(APDS9500_ADDRESS,0x01); // select bank 1
// Image size settings
writeDataTo(APDS9500_ADDRESS,APDS9500_Cmd_HStart,0x0F); // horizontal starting point
writeDataTo(APDS9500_ADDRESS,APDS9500_Cmd_vstart,0x10); // vertical starting point
writeDataTo(APDS9500_ADDRESS,APDS9500_Cmd_HV,0x02); // vertical flip
writeDataTo(APDS9500_ADDRESS,APDS9500_R_LensShadingComp_EnH,0x01); // enable lens shading compensation
writeDataTo(APDS9500_ADDRESS,APDS9500_R_Offest_Y,0x39); // vertical offset of lens,set to 55
writeDataTo(APDS9500_ADDRESS,APDS9500_R_LSC,0x7F); // Lens shading coefficient,set to 127
writeDataTo(APDS9500_ADDRESS,APDS9500_R_LSFT,0x08); // shift amount,initialize to 10
writeDataTo(APDS9500_ADDRESS,0x3E,0xFF); // don't kNow
writeDataTo(APDS9500_ADDRESS,0x3D); // don't kNow
/* Sleep mode parameters */
writeDataTo(APDS9500_ADDRESS,APDS9500_R_IDLE_TIME_L,0x96); // idle time low byte = 150 which is set for ~120 fpsenter code here
writeDataTo(APDS9500_ADDRESS,APDS9500_R_IDLE_TIME_SLEEP_1_L,0x97); // idle time for weak sleep,set for report rate ~ 120 Hz
writeDataTo(APDS9500_ADDRESS,APDS9500_R_IDLE_TIME_SLEEP_2_L,0xCD); // idle time for deep sleep,low byte
writeDataTo(APDS9500_ADDRESS,APDS9500_R_IDLE_TIME_SLEEP_2_H,0x01); // idle time for deep sleep,high byte
writeDataTo(APDS9500_ADDRESS,APDS9500_R_Object_TIME_2_L,0x2C); // deep sleep enter time,APDS9500_R_Object_TIME_2_H,0x01); // deep sleep enter time,APDS9500_R_TG_EnH,0x01); // enable time gating
writeDataTo(APDS9500_ADDRESS,APDS9500_R_Auto_SLEEP_Mode,0x35); // no object weak and deep sleep,object wake
writeDataTo(APDS9500_ADDRESS,APDS9500_R_Wake_Up_Sig_Sel,0x00); // interrupt on time gate start
/* Start sensor */
writeDataTo(APDS9500_ADDRESS,APDS9500_R_SRAM_Read_EnH,0x01); //SRAM read enable
// Change back to bank 0 for data read
writeDataTo(APDS9500_ADDRESS,0x00); // select bank 0
}*
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)