Миландр
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);
}
Снаружи к выводу подключен только вход шинного преобразователя 3,3в->5в, поэтому в свободном состоянии напряжение на линии меньше 1.6в.

Осцилограммы с порта прикреплены. На них видим, что выходной драйвер отпускает линию из 1-цы (ситуация 1) только через 120 мкс, хотя он был сразу переведен в режим входа. Ноль отпускается сразу (ситуация 2).

Прошу пояснить причины являения.

Вложения:
Комментарий к файлу: реакция на OE(1->0) при RXTX==1
[ attachment ]
1.jpg [ 696.19 КБ | 5495 просмотров ]
Комментарий к файлу: реакция на OE(1->0) при RXTX==0
[ attachment ]
2.jpg [ 782.31 КБ | 5495 просмотров ]

Страница 1 из 1 Часовой пояс: UTC+03:00
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/