Не, это от сети питается, не батареечное устройство ...Доп. MCU ещё жрет батарейку, а при передаче на скорости 9600 жрут оба чипа. Почему не сделали 1Мбит - непонятно.
Пока у меня ни одно устройство с доп. MCU не соответствует писанине от Tuya. Что-то близко, но не совсем...У Туи хоть какие-то доки есть.
static void drv_calib_adc_verf(void)
{
u8 adc_vref_calib_value[7] = {0};
u16 gpio_calib_vref = 0;
s8 gpio_calib_vref_offset = 0;
flash_read(CFG_ADC_CALIBRATION, 7, adc_vref_calib_value);
#if defined(MCU_CORE_8258) || defined(MCU_CORE_8278)
//Check the two-point gpio calibration value whether is exist
if((adc_vref_calib_value[4] != 0xff) &&
(adc_vref_calib_value[4] <= 0x7f) &&
(adc_vref_calib_value[5] != 0xff) &&
(adc_vref_calib_value[6] != 0xff)){
/****** Method of calculating two-point gpio calibration Flash_gain and Flash_offset value: ********/
/****** Vref = [(Seven_Byte << 8) + Six_Byte + 1000]mv ********/
/****** offset = [Five_Byte - 20] mv. ********/
gpio_calib_vref = (adc_vref_calib_value[6] << 8) + adc_vref_calib_value[5] + 1000;
gpio_calib_vref_offset = adc_vref_calib_value[4] - 20;
typedef struct __attribute__((packed)) _adc_calibration_t {
uint16_t id; /* 0x1965 */
uint8_t voltage_factor; /* 1-255; default - 0x78 (120) */
uint8_t reserve;
} adc_calibration_t;
flash_read(CFG_ADC_CALIBRATION, 4, (uint8_t*)&adc_calibration);
if (adc_calibration.id == ADC_CALIBRATION_ID) {
#if UART_PRINTF_MODE && DEBUG_BATTERY
printf("voltage_factor from flash\r\n");
#endif
voltage_factor = adc_calibration.voltage_factor;
/* voltage_factor should not be 0 */
if (voltage_factor == 0) voltage_factor++;
} else {
#if UART_PRINTF_MODE && DEBUG_BATTERY
printf("voltage_factor from #define\r\n");
#endif
voltage_factor = VOLTAGE_FACTOR;
}
voltage_detect_init()
, а далее просто считывают значения voltage_detect()
и если менее BATTERY_SAFETY_THRESHOLD, то reset или PM_SLEEP... Действительно. Сейчас посмотрел, есть такое. Странно, что я, когда проверял, этого не обнаружил.> Ну и к тому же вообще нигде этот код не вызывается.
Вызывается вdrv_platform_init()
в SDK Zigbee. Аdrv_platform_init()
вызывается вmain()
.
Этот кусок не мой. Это стандартный, из SDK. Я его даже не трогал.@Slacky - вот у вас в коде каждую итерацию while(1) опрашивается ADC
При этом никакой переинициализации ADC после старта не делается. Т.е. ADC трогать незя.watermeter_zed/src/common/main.c at main · slacky1965/watermeter_zed
Watermeter ZigBee TLSR8258. Contribute to slacky1965/watermeter_zed development by creating an account on GitHub.github.com
}else{
/****** If flash do not exist the two-point gpio calibration value,use the one-point gpio calibration value ********/
/****** Method of calculating one-point gpio calibration Flash_gpio_Vref value: ********/
/****** Vref = [1175 +First_Byte-255+Second_Byte] mV = [920 + First_Byte + Second_Byte] mV ********/
gpio_calib_vref = 920 + adc_vref_calib_value[0] + adc_vref_calib_value[1];
/****** Check the one-point calibration value whether is correct ********/
if((gpio_calib_vref >= 1047) && (gpio_calib_vref <= 1302)){
adc_set_gpio_calib_vref(gpio_calib_vref);
}
}
/**************************************************************************************
* The following is the detailed user configure information (U_CFG_Info).
*/
/* 16 bytes for pre-install code. */
#if(FLASH_CAP_SIZE_1M || FLASH_CAP_SIZE_2M || FLASH_CAP_SIZE_4M)
#define CFG_PRE_INSTALL_CODE (0xFD000)
#else
#define CFG_PRE_INSTALL_CODE (0x78000)
#endif
CODE_BDB_ u8 bdb_preInstallCodeLoad(u8 *keyType, u8 derivedKey[])
{
u8 invalidInstallCode[SEC_KEY_LEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
u8 installCode[SEC_KEY_LEN];
flash_read(CFG_PRE_INSTALL_CODE, SEC_KEY_LEN, (u8 *)installCode);
if(!memcmp((u8 *)installCode, (u8 *)invalidInstallCode, SEC_KEY_LEN)){
return RET_NOT_FOUND;
}
tl_bdbUseInstallCode(installCode, derivedKey);
*keyType = SS_UNIQUE_LINK_KEY;
return RET_OK;
}