diff --git a/DS18B20/dallas_tools.c b/DS18B20/dallas_tools.c index 8bd859d..42264a7 100644 --- a/DS18B20/dallas_tools.c +++ b/DS18B20/dallas_tools.c @@ -90,14 +90,14 @@ HAL_StatusTypeDef Dallas_SensorInitByROM(OneWire_t *onewire, DALLAS_HandleTypeDe return HAL_ERROR; uint8_t ROM[8] = {0}; - ROM[0] = (sensor->Init.ROM >> (7*8)) & 0xFF; - ROM[1] = (sensor->Init.ROM >> (6*8)) & 0xFF; - ROM[2] = (sensor->Init.ROM >> (5*8)) & 0xFF; - ROM[3] = (sensor->Init.ROM >> (4*8)) & 0xFF; - ROM[4] = (sensor->Init.ROM >> (3*8)) & 0xFF; - ROM[5] = (sensor->Init.ROM >> (2*8)) & 0xFF; - ROM[6] = (sensor->Init.ROM >> (1*8)) & 0xFF; - ROM[7] = (sensor->Init.ROM) & 0xFF; + ROM[0] = (sensor->Init.ROM >> (0*8)) & 0xFF; + ROM[1] = (sensor->Init.ROM >> (1*8)) & 0xFF; + ROM[2] = (sensor->Init.ROM >> (2*8)) & 0xFF; + ROM[3] = (sensor->Init.ROM >> (3*8)) & 0xFF; + ROM[4] = (sensor->Init.ROM >> (4*8)) & 0xFF; + ROM[5] = (sensor->Init.ROM >> (5*8)) & 0xFF; + ROM[6] = (sensor->Init.ROM >> (6*8)) & 0xFF; + ROM[7] = (sensor->Init.ROM >> (7*8)) & 0xFF; if(DS18B20_IsValidAddress(ROM) != HAL_OK) return HAL_ERROR; @@ -202,7 +202,7 @@ HAL_StatusTypeDef Dallas_SensorInitByUserBytes(OneWire_t *onewire, DALLAS_Handle } } - memset(&sensor->sensROM, 0, DALLAS_ROM_SIZE); + sensor->sensROM = 0; memset(&sensor->scratchpad, 0, sizeof(DALLAS_ScratchpadTypeDef)); /* Возвращаем ошибку если не нашли */ return HAL_ERROR; @@ -251,12 +251,13 @@ HAL_StatusTypeDef Dallas_SensorInit(OneWire_t *onewire, DALLAS_HandleTypeDef *se return HAL_ERROR; sensor->onewire = onewire; - - for(int i = 0; i < DALLAS_ROM_SIZE; i++) - sensor->sensROM[i] = (*ROM)[i]; + sensor->sensROM = 0; + sensor->sensROM = *(uint64_t *)(ROM); +// for(int i = 0; i < DALLAS_ROM_SIZE; i++) +// sensor->sensROM |= ((uint64_t)(*ROM)[i] << (56 - 8*i)); /* Проверка присутствует ли выбранный датчик на линии */ - result = DS18B20_ReadScratchpad(sensor->onewire, (uint8_t *)sensor->sensROM, (uint8_t *)&sensor->scratchpad); + result = DS18B20_ReadScratchpad(sensor->onewire, (uint8_t *)&sensor->sensROM, (uint8_t *)&sensor->scratchpad); if (result == HAL_OK) { /* Установка разрешения */ @@ -384,7 +385,7 @@ HAL_StatusTypeDef Dallas_ConvertT(DALLAS_HandleTypeDef *sensor, DALLAS_WaitConve return result; // Отправка команды начала преобразования температуры - result = DS18B20_StartConvT(sensor->onewire, (uint8_t *)sensor->sensROM); + result = DS18B20_StartConvT(sensor->onewire, (uint8_t *)&sensor->sensROM); if(result != HAL_OK) { return result; @@ -461,7 +462,7 @@ HAL_StatusTypeDef Dallas_ReadTemperature(DALLAS_HandleTypeDef *sensor) return result; - result = DS18B20_CalcTemperature(sensor->onewire, (uint8_t *)sensor->sensROM, (uint8_t *)&sensor->scratchpad, &sensor->temperature); + result = DS18B20_CalcTemperature(sensor->onewire, (uint8_t *)&sensor->sensROM, (uint8_t *)&sensor->scratchpad, &sensor->temperature); if (result != HAL_OK) { @@ -484,7 +485,7 @@ HAL_StatusTypeDef Dallas_IsConnected(DALLAS_HandleTypeDef *sensor) if(sensor->isInitialized == 0) return HAL_ERROR; - result = DS18B20_ReadScratchpad(sensor->onewire, (uint8_t *)sensor->sensROM, (uint8_t *)&sensor->scratchpad); + result = DS18B20_ReadScratchpad(sensor->onewire, (uint8_t *)&sensor->sensROM, (uint8_t *)&sensor->scratchpad); if (result == HAL_OK) { @@ -528,13 +529,13 @@ HAL_StatusTypeDef Dallas_WriteUserBytes(DALLAS_HandleTypeDef *sensor, uint16_t U if (result != HAL_OK) return result; - result = DS18B20_WriteUserBytes(sensor->onewire, (uint8_t *)sensor->sensROM, UserBytes12, UserBytes34, UserBytesMask); + result = DS18B20_WriteUserBytes(sensor->onewire, (uint8_t *)&sensor->sensROM, UserBytes12, UserBytes34, UserBytesMask); if (result != HAL_OK) { sensor->f.other_err_cnt++; return result; } - result = DS18B20_ReadScratchpad(sensor->onewire, (uint8_t *)sensor->sensROM, (uint8_t *)&sensor->scratchpad); + result = DS18B20_ReadScratchpad(sensor->onewire, (uint8_t *)&sensor->sensROM, (uint8_t *)&sensor->scratchpad); if (result != HAL_OK) { return result; diff --git a/DS18B20/dallas_tools.h b/DS18B20/dallas_tools.h index 6587101..48eb8e7 100644 --- a/DS18B20/dallas_tools.h +++ b/DS18B20/dallas_tools.h @@ -88,7 +88,7 @@ typedef struct unsigned isLost:1; ///< Флаг потери связи OneWire_t *onewire; ///< Интерфейс OneWire - uint8_t sensROM[DALLAS_ROM_SIZE]; ///< ROM-код датчика + uint64_t sensROM; ///< ROM-код датчика DALLAS_ScratchpadTypeDef scratchpad; ///< Scratchpad датчика float temperature; ///< Текущая температура diff --git a/DS18B20/pch_sensors.c b/DS18B20/pch_sensors.c index 7f80098..5754832 100644 --- a/DS18B20/pch_sensors.c +++ b/DS18B20/pch_sensors.c @@ -34,7 +34,7 @@ HAL_StatusTypeDef PCHSens_FindUnknownSensors(OneWire_t *onewire, PCHSens_Unknown if(result != HAL_OK) __NOP(); - if((IS_REG_PCH_LOCATION(location) == 0) || + if((IS_REG_SENS_LOCATION(location) == 0) || (IS_REG_PCH_LOCATION(location) == 0) || (IS_REG_PCH_NUMB(location) == 0) ) { @@ -182,15 +182,17 @@ HAL_StatusTypeDef PCHSens_ReadTemperature(PCHSens_ModuleTypeDef *module) result = Dallas_ReadTemperature(&module->sens2.sens); if(result != HAL_OK) - PCHSens_CheckSensor(module->onewire, &module->sens1); + PCHSens_CheckSensor(module->onewire, &module->sens2); result = Dallas_ReadTemperature(&module->sens3.sens); if(result != HAL_OK) - PCHSens_CheckSensor(module->onewire, &module->sens1); + PCHSens_CheckSensor(module->onewire, &module->sens3); result = Dallas_ReadTemperature(&module->sens4.sens); if(result != HAL_OK) - PCHSens_CheckSensor(module->onewire, &module->sens1); + PCHSens_CheckSensor(module->onewire, &module->sens4); + + PCHSens_DefineUnknownSensor(&UnknownSensors, NULL); return result; } @@ -216,7 +218,7 @@ HAL_StatusTypeDef PCHSens_CheckSensor(OneWire_t *onewire, PCHSens_SensorTypeDef* } else { - sensor->not_found = 0; + sensor->not_found = 0; } } return HAL_OK; @@ -226,16 +228,30 @@ HAL_StatusTypeDef PCHSens_CheckSensor(OneWire_t *onewire, PCHSens_SensorTypeDef* HAL_StatusTypeDef PCHSens_DefineUnknownSensor(PCHSens_UnknownSensorsTypeDef *unknowns, PCHSens_SensorTypeDef *sensor) { HAL_StatusTypeDef result; - if(unknowns->UnknownCnt == 0) - return HAL_OK; +// if(unknowns->UnknownCnt == 0) +// return HAL_OK; - if((unknowns->ROMtoDefine != NULL) && (unknowns->LocationtoDefine.all != NULL)) + if((unknowns->ROMtoDefine != NULL) && (unknowns->LocationtoDefine.all != NULL) && (unknowns->senstoDefine != NULL)) { - result = PCHSens_InitNewSensor(unknowns->onewire, sensor, unknowns->ROMtoDefine, unknowns->LocationtoDefine.all); + result = PCHSens_InitNewSensor(unknowns->onewire, unknowns->senstoDefine, unknowns->ROMtoDefine, unknowns->LocationtoDefine.all); + unknowns->ROMtoDefine = 0; + unknowns->LocationtoDefine.all = 0; + unknowns->senstoDefine = 0; + return result; } return HAL_OK; } +HAL_StatusTypeDef PCHSens_FullDeInitSensor(PCHSens_SensorTypeDef *sensor) +{ + HAL_StatusTypeDef result; +// if(unknowns->UnknownCnt == 0) +// return HAL_OK; + + result = PCHSens_InitNewSensor(sensor->onewire, sensor, unknowns->ROMtoDefine, unknowns->LocationtoDefine.all); + return result; +} + void PCHSens_FirstInit(void) { int init_find = 0; @@ -249,6 +265,7 @@ void PCHSens_FirstInit(void) PCHSens_InitModule(&OW, &module1, REG_PCH_NUMB_11|REG_PCH_DIODE_NUMB_1, init_find); PCHSens_FindUnknownSensors(&OW, &UnknownSensors); + PCHSens_DefineUnknownSensor(&UnknownSensors, NULL); // Dallas_SensorInitByInd(&OW, &AllSens.outdoor, 0); // Dallas_SensorInitByInd(&OW, &AllSens.indoor, 2); // Dallas_SensorInitByInd(&OW, &AllSens.bathroom, 1); diff --git a/DS18B20/pch_sensors.h b/DS18B20/pch_sensors.h index eb8ad8c..b413d46 100644 --- a/DS18B20/pch_sensors.h +++ b/DS18B20/pch_sensors.h @@ -147,6 +147,7 @@ typedef struct uint8_t UnknownCnt; uint64_t ROMtoDefine; PCHSens_LocationTypeDef LocationtoDefine; + PCHSens_SensorTypeDef *senstoDefine; }PCHSens_UnknownSensorsTypeDef; @@ -157,6 +158,7 @@ HAL_StatusTypeDef PCHSens_AddSensor(OneWire_t *onewire, PCHSens_SensorTypeDef* s HAL_StatusTypeDef PCHSens_InitModule(OneWire_t *onewire, PCHSens_ModuleTypeDef* module, uint16_t location, uint8_t init); HAL_StatusTypeDef PCHSens_ReadTemperature(PCHSens_ModuleTypeDef *module); HAL_StatusTypeDef PCHSens_CheckSensor(OneWire_t *onewire, PCHSens_SensorTypeDef* sensor); +HAL_StatusTypeDef PCHSens_DefineUnknownSensor(PCHSens_UnknownSensorsTypeDef *unknowns, PCHSens_SensorTypeDef *sensor); void PCHSens_FirstInit(void); #endif // #ifndef PCH_SENSORS_H \ No newline at end of file diff --git a/test_project/MDK-ARM/ds18b20.uvoptx b/test_project/MDK-ARM/ds18b20.uvoptx index a5bf29f..6908c8d 100644 --- a/test_project/MDK-ARM/ds18b20.uvoptx +++ b/test_project/MDK-ARM/ds18b20.uvoptx @@ -145,10 +145,43 @@ 0 ST-LINKIII-KEIL_SWO - -U53FF72064980555724221187 -O2254 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(2BA01477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC800 -FN1 -FF0STM32F10x_128.FLM -FS08000000 -FL08000 -FP0($$Device:STM32F103C6$Flash\STM32F10x_128.FLM) -WA0 -WE0 -WVCE4 -WS2710 -WM0 -WP2 + -U53FF72064980555724221187 -O2254 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(1BA01477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC800 -FN1 -FF0STM32F10x_128.FLM -FS08000000 -FL08000 -FP0($$Device:STM32F103C6$Flash\STM32F10x_128.FLM) -WA0 -WE0 -WVCE4 -WS2710 -WM0 -WP2 - + + + 0 + 0 + 236 + 1 +
134229812
+ 0 + 0 + 0 + 0 + 0 + 1 + ..\..\DS18B20\pch_sensors.c + + \\ds18b20\../../DS18B20/pch_sensors.c\236 +
+ + 1 + 0 + 70 + 1 +
134231004
+ 0 + 0 + 0 + 0 + 0 + 1 + ..\..\DS18B20\pch_sensors.c + + \\ds18b20\../../DS18B20/pch_sensors.c\70 +
+
0 @@ -163,22 +196,7 @@ 2 1 - ROM - - - 3 - 1 - sensor - - - 4 - 1 - initlocation - - - 5 - 1 - scratchpad + UnknownSensors @@ -190,7 +208,7 @@ 1 2 - init_find + UnknownSensors