eldarkg / emdr1986x-std-per-lib

Milandr MCU 1986x Standard Peripherals Library. Mirror:
https://code.launchpad.net/~eldar/emdr1986x-std-per-lib/+git/emdr1986x-std-per-lib
47 stars 28 forks source link

ADC divider #45

Closed DmitrijProF closed 6 years ago

DmitrijProF commented 6 years ago

There is a problem with ADC divider.

In Datasheet:

Таблица 294 – Описание бит регистра ADC1_CFG:

Cfg_REG_DIVCLK[3:0] Выбор коэффициента деления частоты процессора: 0000 – CPU_CLK = HCLK; 0001 – CPU_CLK = HCLK/2; 0010 – CPU_CLK = HCLK/4; 0011 – CPU_CLK = HCLK/8; … 1011 – CPU_CLK = HCL K/2048 Остальные CPU_CLK = HCLK

In MDR32F9Qx_adc.h:

#define ADC_CLK_div_None   (((uint32_t)0x0) << ADC1_CFG_REG_DIVCLK_Pos) /*!< The input ADC clock devides by 1.     */
#define ADC_CLK_div_2      (((uint32_t)0x1) << ADC1_CFG_REG_DIVCLK_Pos) /*!< The input ADC clock devides by 2.     */
…                        
#define ADC_CLK_div_32768  (((uint32_t)0xF) << ADC1_CFG_REG_DIVCLK_Pos) /*!< The input ADC clock devides by 32768. */

So, if you use divider greater then 2048 ADC will be clocked from HCLK directly. Checked experimentally.

eldarkg commented 6 years ago

@DmitrijProF See 1986VE1T datasheet (Таблица 304 – Описание бит регистра ADCx_CFG)

eldarkg commented 6 years ago

@DmitrijProF You can use preprocessor to enable this fields for not all MCU.

DmitrijProF commented 6 years ago

Current SPL is for 1986VE9x, 1986VE3T, 1901VC1T and 1986VE1T. In datasheets maximum divider is:

We manually checked divider greater then 2048 for 1986VE1T. Result was the same as for 1986VE9x: ADC was clocked directly from system clock. So, it seems there is a bug in 1986VE1T datasheet.

eldarkg commented 6 years ago

@DmitrijProF you should to report about this issue to milandr support and repost what they say

DmitrijProF commented 6 years ago

Finally!

From: Отдел технической поддержки ЦП ИС АО ПКК Миландр To: DmitrijProF

  1. В спецификации на микроконтроллер 1986ВЕ1Т в таблице 304 (описание бит регистра ADCx_CFG) указано, что максимальный коэффициент деления входной частоты (биты 15..12) составляет 32768. Мы проверили это экспериментально на имеющемся в наличии микроконтроллере (ревизия 4, выпуск 1444) и выяснили, что максимальный коэффициент деления - 2048, как и в других близких МК (1986ВЕ9x, 1986ВЕ3Т, 1901ВЦ1Т). При превышении максимального делителя АЦП начинает тактироваться напрямую. В официальной сборке Standard Peripherals Library для этих микроконтроллеров так же определены делители до 32768 (группа ADC Clock Prescaler в файле MDR32F9Qx_adc.h). Является ли это ошибкой спецификации или нашего макетирования?

Вы правы. В спецификации на 1986ВЕ9х это указано в табл. 294 стр. 315. В 1901ВЦ1 тоже тоже самое. В спецификацию на 1986ВЕ1Т будет внесено исправление, задание писателям поставлено. В SPL значения менять не будем, поскольку возможно в ранних ревизиях коэффициент не имел ограничения.

Мне кажется, что было бы правильнее проверить ранние ревизии и сделать условную трансляцию, если в них ограничения действительно не было. Просто ничего не менять, потому что "может быть раньше это было правильно" - это как-то не очень, прямо скажем, в новых ревизиях-то точно есть ограничение. Хотя бы можно выяснить, начиная с какой ревизии это ограничение точно появилось, и в SPL ввести коррекцию аналогично, а для более ранних ревизий - ничего не менять. Тем более, по SPL с помощью doxygen генерируется хелп, которым иногда пользуются, и который запросто введёт в заблуждение по поводу возможных предделителей. На самом деле, не совсем понятно, чем продиктована боязнь менять SPL. SPL ведь сама собой не обновляется у пользователей на машинах. А если пользователь ее обновляет сам, то он должен быть готов, что что-то может сломаться. Ну и будем честны, люди, которые используют старые ревизии процессоров, вряд ли будут SPL обновлять -_-'

...

  1. Информация про делитель <...> передана сотруднику отвечающему за SPL.

What do you think about correcting SPL?

eldarkg commented 6 years ago

@DmitrijProF I'm OK with this corrections. I think we shouldn't make possible to use possibilities that don't support with all MCU in one serie because this break interchangeability of MCU different revisions. I don't understand of support opinion. What about the MDR1986BE4?

DmitrijProF commented 6 years ago

I asked support. Here's response:

В свете обсуждения делителя АЦП в 1986ВЕ1Т возник ещё один вопрос: а как обстоят дела в 1986ВЕ4У? И в его спецификации, и в SPL так же указан диапазон 1-32768. Это ошибка? К сожалению, сам проверить не могу: мы ещё не сталкивались с этими МК, у меня его нет.

Да, в 1986ВЕ4У делитель работает так-же. Тикет писателям завели.

So, there is a bug too. Pull request created.

eldarkg commented 6 years ago

@DmitrijProF thank you