|
АЦП LPC1758 (недопустимое значение регистра ADTRIM) |
|
|
|
Jun 28 2016, 03:31
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Столкнулся с проблемой с АЦП в давно выпускаемом устройстве на LPC1758. Модифицировали прошивку и перестало работать АЦП - выдаёт всё время 0xFFF (АЦП 12-битный). Заливаешь старую прошивку - АЦП работает, значения меняются, новую - не работает. Код инициализирующий периферию (ноги, PLL, другие порты и т.п.) - в новой прошивке абсолютно без изменений, код работающий с АЦП - тоже старый (файлы исходников байт-в-байт одинаковы). После разборок выяснилось, что при старте ПО содержимое регистра ADTRIM разное: при старте старой прошивки там как и указано в даташите ==0xF00, при старте новой прошивки там почему то ==0. Т.е.: ставлю процедуру инициализации АЦП в ассемблерный стартап-файл, третьей командой (первые две - запреты прерываний), в этой процедуре включаю тактирование АЦП и сразу считываю регистр ADTRIM - и вижу что в старой прошивке там опять как должно быть ==0xF00, а в новой =0. Про этот регистр в даташите говорится, что он записывается boot-кодом и после записи калибровочных значений в младшие 8 бит, boot-код должен в биты 8-11 записать единицы, заблокировав тем самым модификацию этого регистра. Получается, что boot-код каким-то образом определяет какая прошивка (старая версия или новая) и записывает или не записывает туда эти единицы в биты 8-11. Много раз перешивал то старую прошивку, то новую (и размер их сделал одинаковыми на всякий случай) - после каждой перепрошивки в ADTRIM было 0xF00 для старой и 0 - для новой. Бред какой-то!!! Если при старте устройства, обнаружив что в битах 8-11 нули, записать туда единички (что должен делать boot-код), то АЦП начинает работать нормально. Даташиты и ерраты все перерыл - на этот счёт там тишина. Пока сделал костыль: если в битах 8-11 нули - пишу туда сам при старте ПО единицы. Но не понятно что писать в биты 0-7 (там калибровочные значения). И непонятно что будет дальше в других экземплярах МК? Кто-нибудь сталкивался с этой проблемой?
|
|
|
|
|
 |
Ответов
|
Jun 28 2016, 08:18
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(ViKo @ Jun 28 2016, 14:02)  У STM есть datasheet, в нем все времена описаны. Где искать у NXP, не знаю. Где-то есть. Предлагаю удостовериться, что все в пределах нормы. Перенесите инициализацию на позже... Я же уже несколько раз написал: В старом ПО - работает. В новом - нет. Код включающий АЦП и считывающий - один и тот же, что в старом что в новом ПО. Место его вызова - одно и то же. От точки старта ПО до места этого вызова и в том и в другом ПО выполняются всего две ассемблерные команды (запреты прерывания), на эти команды переход происходит с вектора сброса из таблицы прерывания. Повторяемость - 100%-ная. Времён для этого регистра в принципе нет, и единственное что про него написано - что его содержимое инициализируется в bootcode. Более того - это код (чтения с АЦП) проходил и по шагам тоже под JTAG-ом, т.е. - задержки между шагами огромные, и симптомы остались те же. И ещё раз повторю: регистр ADTRIM нигде у меня в ПО не считывается не пишется, да и в принципе не может писаться так как от вектора сброса до точки включения тактирования периферии АЦП прошагал под JTAG-ом (много раз причём) - сразу как только включается АЦП и его регистры оказываются читаемыми JTAG-ом, из ADTRIM считывается или 0 или 0xF00. И очень похоже, что именно значение 0 приводит к неработоспособности АЦП.
|
|
|
|
|
Jun 28 2016, 08:56
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Цитата(jcxz @ Jun 28 2016, 11:18)  Я же уже несколько раз написал: Я прочитал столько же несколько раз. Но лучше один раз увидеть. Это не "Top secret", несколько ассемблерных команд, до и после "перестройки"? Да не для регистра времен...! Для всего АЦП! Понятно, что 0 приводит к неработоспособности. Это же, типа, масштаб опорного напряжения. 0 откуда взялся? В-общем, новая прошивка портит ADTRIM. Неважно, когда, главное, как.
|
|
|
|
|
Jun 28 2016, 09:38
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(ViKo @ Jun 28 2016, 14:56)  Понятно, что 0 приводит к неработоспособности. Это же, типа, масштаб опорного напряжения. 0 откуда взялся? В-общем, новая прошивка портит ADTRIM. Неважно, когда, главное, как. Код AppStart: CPSID i CPSID f BL InitADC ... InitADC: PUSH {R7,LR} MOVS R0,#+12 BL _Z17PeripheralPowerOn12PERIPH_PCONP;включение тактирования периферии ADC LDR.N R0,??DataTable2_7;; 0x40034000 LDR.N R1,??DataTable2_8;; 0x206110 STR R1,[R0, #+0];разрешаем АЦП установкой бита разрешения и конфигурим частоту и канал ;здесь периферия ADC включена; читаем регистры АЦП, хоть программно, хоть через окно Watch отладчика (запсукаем преобразование записью соотв бита Старт) Метка AppStart находится в векторе сброса. И на неё же становится PC при подключении JTAG. Этот участок кода - абсолютно одинаков, что в старом ПО, что в новом (ну разве что адреса расположения различаются). Процедура _Z17PeripheralPowerOn12PERIPH_PCONP - тоже абсолютно одинакова в обоих ПО. Она просто устанавливает бит включения тактирования АЦП через битбанд-область. Но если в конце указанного фрагмента запустить преобразование, то результаты получаются разными. И если считать регистр ADTRIM - значения тоже разные. Отсюда вывод - значение ADTRIM устанавливается bootcode-ом, почему то в разные значения. Каким-то образом bootcode для одной прошивки устанавливает значение ADTRIM=0, для другой - ADTRIM=0xF00. Почему - вот вопрос?? mac-файл для подключения JTAG-а я тоже никакой не задавал.
|
|
|
|
Сообщений в этой теме
jcxz АЦП LPC1758 (недопустимое значение регистра ADTRIM) Jun 28 2016, 03:31 ViKo Может быть, вы не выдерживаете какие-то времена, п... Jun 28 2016, 05:28 jcxz Цитата(ViKo @ Jun 28 2016, 11:28) Может б... Jun 28 2016, 05:53 Alechek Значит, запукать дебагер с брякой на запись даных ... Jun 28 2016, 06:11 jcxz Цитата(Alechek @ Jun 28 2016, 12:11) Знач... Jun 28 2016, 06:45 ViKo А если InitADC выполнить позже, поменять с чем-ниб... Jun 28 2016, 10:08 jcxz Цитата(ViKo @ Jun 28 2016, 16:08) А если ... Jun 28 2016, 10:55  Alechek Цитата(jcxz @ Jun 28 2016, 15:55) В даташ... Jun 28 2016, 13:27   jcxz Цитата(Alechek @ Jun 28 2016, 19:27) Слаб... Jun 28 2016, 13:40    Alechek Цитата(jcxz @ Jun 28 2016, 18:40) Происхо... Jun 29 2016, 04:40     jcxz Цитата(Alechek @ Jun 29 2016, 10:40) Втор... Jun 29 2016, 07:02 zltigo Абстрагируйтесь от этого несчастного ADTRIM - ADC,... Jun 28 2016, 14:49 jcxz Цитата(zltigo @ Jun 28 2016, 20:49) Абстр... Jun 29 2016, 04:04  zltigo QUOTE (jcxz @ Jun 29 2016, 07:04) Возможн... Jun 29 2016, 04:27  KRS Цитата(jcxz @ Jun 29 2016, 07:04) И по ка... Jun 29 2016, 06:07 Obam " А зачем тогда среди сигналов JTAG есть сигн... Jun 29 2016, 08:13 jcxz Цитата(Obam @ Jun 29 2016, 14:13) " ... Jun 29 2016, 08:17  Obam Цитата(jcxz @ Jun 29 2016, 12:17) И...?
... Jun 29 2016, 08:55 Alechek И
Цитата("UM10360")The flash boot loader... Jun 29 2016, 09:06 jcxz Цитата(Alechek @ Jun 29 2016, 15:06) ... Jun 29 2016, 09:36 Alechek По \TRST периферия НЕ СБРАСЫВАЕТСЯ.
А вот дал... Jun 29 2016, 10:26 jcxz Цитата(Alechek @ Jun 29 2016, 16:26) По ... Jun 29 2016, 10:37  KRS Цитата(jcxz @ Jun 29 2016, 13:37) Наверно... Jun 30 2016, 08:34   jcxz Цитата(KRS @ Jun 30 2016, 14:34) IMHO луч... Jun 30 2016, 08:54    jcxz Цитата(KRS @ Jun 30 2016, 14:34) IMHO луч... Jul 10 2016, 06:01 Alechek Сейчас занимаюсь с LPC1754. В настройках JLINK сто... Jun 29 2016, 18:34 jcxz Цитата(Alechek @ Jun 30 2016, 00:34) Сейч... Jun 30 2016, 03:07
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|