Хочу поделиться аналогичным случаем. Вчера обнаружил, что мое устройство "теряет" данные в EEPROM, если девайс выключить на некоторое время. Если прибор не выключать, то при загрузке данных нет никаких проблем. Что самое интересное, данные, которые загружались всегда были правильными, независимо от состояния CRC8. Меня очень сильно насторожил сей факт, как так, данные визуально в порядке, а CRC показывает сбой? В итоге выяснилась неприятная ошибка в реализации расчета CRC: контрольная сумма считается табличным методом. crc8Table - массив коэффициентов, используемый при расчете, хранится во FLASH.
Чтобы считать данные, мы должны применить такую конструкцию
Код
*crc8 = pgm_read_byte(crc8Table + (*crc8 ^ byte));
Я же, по ошибке, написал это
Код
*crc8 = crc8Table[*crc8 ^ byte];
Естественно, при расчете программа читала данные не из постоянной неизменяемой FLASH, а из SRAM, где данные рандомны.
Таким образом, при постоянно включенном питании данные в той области SRAM, откуда читались коэффициенты были постоянны (ну так, видимо получилось), а при выключении с последующим включением, данные были другими, соответсвенно CRC8 считалась по новым коэффициетам и не совпадала с записанной. Вот и получалось, что после выключения прибор терял настройки. На самом деле причина была в совершенно другом месте, а не в BOD, EEPROM и тп.
Вот так вот...
Выбор.