В силу ряда причин пришлось вручную на портах делать 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).
Прошу пояснить причины являения.