Добрый день, есть функция чтение температуры из термодатчика Lm75ad во время ожидания ожидания флага передаю управления другому процессу portYIELD(); Так вот если замкнуть линии I2C то процесс чтения температуры зависает, а остальное все работает. Так вот как по феншую сделать отработку зависания ? Пока только одна идея перед каждый ожидание засекать время, и в диспетчере смотреть больше оно таймаута или нет, но мне это не нравиться тем что это надо прятать в дефайны, что не айс, или код "загромождать". Если другие способы определения ?
uint8_t OS_Lm75ad_Read(short unsigned int* dataout,const unsigned char addr){ static short unsigned int tmp[2]; static short unsigned int* dataout_temp; //------------------------------------------------------------------------------------ LED_DEBUG_ON dataout_temp=dataout; while(I2C_GetFlagStatus(I2C_LM75AD, I2C_FLAG_BUSY)){portYIELD();}; LED_DEBUG_OFF //------------------------------------------------------------------------------------ I2C_GenerateSTART(I2C_LM75AD, ENABLE); /* check start bit flag */ while(!I2C_CheckEvent(I2C_LM75AD, I2C_EVENT_MASTER_MODE_SELECT)){portYIELD();}; LED_DEBUG_ON //----------------------SEND_ADDR_Write------------------------------------------------------- I2C_Send7bitAddress(I2C_LM75AD,(addr), I2C_Direction_Transmitter); while(!I2C_CheckEvent(I2C_LM75AD, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)){portYIELD();}; //----------------------POINT------------------------------------------------------------------ I2C_SendData(I2C_LM75AD,LM75AD_ADDR_REG_Temp); //Регист Temp(температура) while(!I2C_CheckEvent(I2C_LM75AD, I2C_EVENT_MASTER_BYTE_TRANSMITTED)){portYIELD();}; LED_DEBUG_ON //----------------------RE-START------------------------------------------------------------------- I2C_GenerateSTART(I2C_LM75AD, ENABLE); /* check start bit flag */ while(!I2C_CheckEvent(I2C_LM75AD, I2C_EVENT_MASTER_MODE_SELECT)){portYIELD();}; LED_DEBUG_OFF //-------------------Send_addr_read------------------------------------------------------ I2C_Send7bitAddress(I2C_LM75AD, (addr), I2C_Direction_Receiver); while(!I2C_CheckEvent(I2C_LM75AD, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)){portYIELD();}; LED_DEBUG_ON //------------------------------------------------------------------------------------------ while(!I2C_CheckEvent(I2C_LM75AD, I2C_EVENT_MASTER_BYTE_RECEIVED)){portYIELD();}; LED_DEBUG_OFF tmp[0]=I2C_ReceiveData(I2C_LM75AD); //------------------------------------------------------------------------------------------ while(!I2C_CheckEvent(I2C_LM75AD, I2C_EVENT_MASTER_BYTE_RECEIVED)){portYIELD();}; LED_DEBUG_ON tmp[1]=I2C_ReceiveData(I2C_LM75AD); //------------------------------------------------------------------------------------------ I2C_GenerateSTOP(I2C_LM75AD, ENABLE); /*stop bit flag*/ I2C_AcknowledgeConfig(I2C_LM75AD, ENABLE); while(I2C_GetFlagStatus(I2C_LM75AD, I2C_FLAG_BUSY)){portYIELD();}; LED_DEBUG_OFF //------------------------------------------------------------------------------------------ *dataout_temp=(tmp[0]<<8)|tmp[1]; NOP;NOP;NOP;NOP;NOP; LED_DEBUG_ON //------------------------------------------------------------------------------------------ }
|