В принципе, глобально - вопрос был в том, может ли устройство корректно передать компу масив символов, не умея принимать комманды от ПК и реагировать на них. (скажем, если в середине набора символов есть код нажатия NumLock, ПК сразу начнет передачу комманды "включить/погасить индикатор на клавиатуре"). Может устройство просто проигнорировать команду, переждать несколько мс, а потом передавать оставшиеся символы. Я так понимаю, Dimmy это удалось. Относительно передачи байтов, я примерно так и делаю, как говорил Dimmy - перед сбросом в 0 клока проверяю уровень на нем, если 1 - передаю байт заново :
//--------------------------------------------------------- //Send 1 byte //--------------------------------------------------------- void PS_2Send (uchar byte) { unsigned char n; unsigned char SendBuff[11];
PrepareByteToSend(SendBuff,byte); for(n=0;n<10;n++) // try 10 times { WaitNoSignal(); //ждем,чтоб Clock=1 ~200 мс if (PS_2SendBit(SendBuff[0]) == false) continue; if (PS_2SendBit(SendBuff[1]) == false) continue; if (PS_2SendBit(SendBuff[2]) == false) continue; if (PS_2SendBit(SendBuff[3]) == false) continue; if (PS_2SendBit(SendBuff[4]) == false) continue; if (PS_2SendBit(SendBuff[5]) == false) continue; if (PS_2SendBit(SendBuff[6]) == false) continue; if (PS_2SendBit(SendBuff[7]) == false) continue; if (PS_2SendBit(SendBuff[8]) == false) continue; if (PS_2SendBit(SendBuff[9]) == false) continue; if (PS_2SendBit(SendBuff[10]) == false) continue; PS_Delay_us(50); break; } return; }
//--------------------------------------------------------- //Send one bit //--------------------------------------------------------- bool PS_2SendBit (uchar b ) { PS2_PORT|=(1<<PS2_CLK); // clock high PS_Delay_us(15);
if (b == 1) PS2_PORT|=(1<<PS2_DATA); else PS2_PORT&=~(1<<PS2_DATA); PS_Delay_us(22); //us;
PS2_DDR&=~(1<<PS2_CLK); //CLK as In if (!(PS2_PIN&(1<<PS2_CLK))) return (false); //low level on PS2_CLK PS2_DDR|=(1<<PS2_CLK); //CLK as Out PS2_PORT&=~(1<<PS2_CLK); PS_Delay_us(40); //us;
PS2_PORT|=(1<<PS2_CLK); return (true); }
Так называемый АСК, выдаваемый хостом - это запрет на передачу на время обработки им полученной комманды (буфера у него нет). Можно ли его наличие считать признаком приема байта и какие у него тогда должны быть временные параметры ?
|