MyTetra Share
Делитесь знаниями!
GPIO выход в режиме OpenDrain
Время создания: 30.12.2021 12:23
Текстовые метки: stm32, GPIO
Раздел: Компьютер - Аппаратное обеспечение - Микроконтроллеры ARM
Запись: xintrea/mytetra_syncro/master/base/1640856202tua79evhar/text.html на raw.github.com

Читая даташит при подготовке схемы я напоролся на интересный момент. Есть выводы которые можно использовать в режиме OpenDrain (т.е. открытый сток). Для тех кто не врубился — СТМ32 питается максимум 3.3В (3.6В вообще-то, но интегральный стабилизатор проще найти на 3.3). Большинство логики работает на 5В (так и у меня — плата с МК отдельно, а основная плата уже есть). Как бы тут сильно экономится кол-во элементов для согласования уровней (будь это специализированная микросхема или транзистор). Я довольный, с расчетом на это поставил резисторы подтяжки к +5В. При заводке выяснилось что OpenDrain не такой уж хороший…


Даташит обещает нереальное счастье, и предлагает вот такую картинку:







В даташите написано что P-MOS транзистор в режиме OpenDrain отключается напрочь. Соответственно навешиваем резистор 10К на +5В и вроде профит… Немного тонкости задачи: у меня кучка входов (реально кучка) которые надо периодически опрашивать, я не стал «городить городки» на матричных считывателях а поставил регистры 74HC165 и периодически их опрашивая имею на входе некую последовательность бит, которую кастанув к структуре можно крутить и вертеть как удобно. Соответственно мне для управления надо 5В для гарантии (при 3.3 В тоже работает, но об этом позже). Пробуем настроить:



#define SW_DAT          GPIO_Pin_0

#define SW_CP           GPIO_Pin_1

#define SW_CE           GPIO_Pin_2

#define SW_PL           GPIO_Pin_3


GPIO_InitTypeDef mGPIO_InitStructure;


RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);


memset(&mGPIO_InitStructure, 0, sizeof(mGPIO_InitStructure));

mGPIO_InitStructure.GPIO_Pin    = SW_CP|SW_PL|SW_CE;

mGPIO_InitStructure.GPIO_Mode   = GPIO_Mode_OUT;

mGPIO_InitStructure.GPIO_OType  = GPIO_OType_OD;

mGPIO_InitStructure.GPIO_PuPd   = GPIO_PuPd_NOPULL;

mGPIO_InitStructure.GPIO_Speed  = GPIO_Speed_50MHz;


GPIO_Init(GPIOC, &mGPIO_InitStructure);



Дальше битбанг в виде цикла с клоками и считываем данные. Отладчик показал что считываем мы постоянно единички. Ясно, что-то не так — лезем осциллом. И ничего не видим. Вернее видим, но явно не то что хотели. Смотрим осциллом по выходам (в частности клок):





Если честно у меня сперва был ступор. Потом я посмотрел крупнее — стало видно затянутый передний фронт — понятно. Скорость нарастания выходного сигнала плохая. Ставим задержки в ПО (надо же выяснить насколько все плохо). Получаем следующую картинку:





Как бы сдвиговые регистры нормально реагируют на клоки длительностью 10-50 нСек, и задержка в виде 2 мкСек на каждый клок, как-то не очень… Крутил настройки по-разному — толку нет. Передний фронт плохой. Кроме того, если посмотреть на вторую осциллограмму — видно в верхней части сигнала горизонтальную ступеньку — это сработал защитный диод на VFT (около 4 Вольт). С этого момента МК начинает греться (несильно, но греется). Попытка уменьшить подтяжку с 10К до 5К каких-либо положительных результатов не принесла. Уменьшать дальше — не вижу смысла — растет потребление тока. В финальной версии буду городить городки на транзисторах или на микросхемах — для согласования уровней. Для входа такой проблемы нет — все нормально работает. Резюмирую — на больших частотах использование OpenDrain не представляется возможным (если кто выяснит обратное — прошу комментить — ибо удобно, но не в таком виде как оно есть сейчас). Толерантность входов к 5 вольтам подтверждается.


Так же в этом разделе:
 
MyTetra Share v.0.59
Яндекс индекс цитирования