Миландр https://forum.milandr.ru/ |
|
Время переключения портов https://forum.milandr.ru/viewtopic.php?f=33&t=2867 |
Страница 1 из 1 |
Автор: | wedmeed [ 2015-ноя-13 15:05 ] | |||
Заголовок сообщения: | Время переключения портов | |||
В силу ряда причин пришлось вручную на портах делать i2c-подобный интерфейс, причем с управлением не по открытому стоку, а драйверами. Таким образом та линия, которая выполняет функции SDA, должна часто переключаться со входа на выход и обратно (выставление и получение ответных битов), моменты переключения режимов известны и хорошо контролируются. Оказалось: если до перевода линии с выхода на вход выдавалась единица, то эта единица "зависает" на порту в течении некоторого времени около 120-180 мкс. если до перевода линии с выхода на вход выдавался ноль, то линия переводится сразу. для теста написана следующая программа, на которая дергается тестовая линия с минимальной обвеской: Код: Выделить всё //вывод через bit-band #define bito(pb,pin,st) *((volatile unsigned int *)(0x42000000 + ((unsigned long)pb - 0x40000000)*32 + pin*4)) = st //ввод через bit-band #define biti(pb,pin) *((volatile unsigned int *)(0x42000000 + ((unsigned long)pb - 0x40000000)*32 + pin*4)) int main(void){ MDR_RST_CLK->PER_CLOCK |= (1 << 23); MDR_PORTC->FUNC &= ~0x00000c00; //функция порта MDR_PORTC->ANALOG |= 0x000000a0; //цифровая функция MDR_PORTC->PWR |= 0x00000C00; //максимальная скорость MDR_PORTC->OE |= 0x000000a0; //выход __disable_irq(); MDR_PORTC->PULL |= (1<<(5))|(1<<(5+16)); //подтяжка чтобы видеть когда вывод "отпускается драйвером /**/bito(MDR_PORTC,5,0); STdelay(200); //ожидание с просмотром системного таймера, сюда не выкладываю, чтобы не засорять //ситуация 1 /**/bito(MDR_PORTC,5,1); /**/bito(&MDR_PORTC->OE,5,0); STdelay(200); //ситуация 2 /**/bito(&MDR_PORTC->OE,5,1); /**/bito(MDR_PORTC,5,1); /**/STdelay(1); /**/bito(MDR_PORTC,5,0); /**/bito(&MDR_PORTC->OE,5,0); __enable_irq(); while(1); } Осцилограммы с порта прикреплены. На них видим, что выходной драйвер отпускает линию из 1-цы (ситуация 1) только через 120 мкс, хотя он был сразу переведен в режим входа. Ноль отпускается сразу (ситуация 2). Прошу пояснить причины являения.
|
Страница 1 из 1 | Часовой пояс: UTC+03:00 |
Powered by phpBB® Forum Software © phpBB Limited https://www.phpbb.com/ |