/* 如果pc机发送数据,则pc机要先把时钟线和数据线置为请求发送的状态 */
/* pc机通过下拉时钟线大于100μs来抑制通讯,并且通过下拉数据线发出 请求发送数据的信号,然后释放时钟 */
/* 释放时钟后,即时钟=1,开始进行接收 */
/* Summary: Bus States Data = high, Clock = high: Idle state. 空闲状态,键盘可发送 Data = high, Clock = low: Communication Inhibited. 通讯禁止 Data = low, Clock = high: Host Request-to-Send 主机请求发送 */
void Get_hostcode() //同发送相比,多了一个ACK位 { byte i; byte temp=0; byte temp1=0;
PS2CLK = 1; //置输入状态 PS2DATA = 1;
//while(PS2CLK==0){putbyte(0x11);} //如果检测到数据线为0且主机释放CLK则表示主机有发送请求 if(PS2DATA) { status=NORMAL; return; } else { DELAYUS(40); for(i=0;i<8;i++) //====================================前8个时钟接收8位数据 { PS2CLK=1; //pull up clk DELAYUS(15); //delay 20us PS2CLK=0; //pull down clk CLK第一个低电平后读取第0个数据 DELAYUS(40); //delay 40us PS2CLK=1; //release clk DELAYUS(15); temp=temp>>1; //先读最低位 if(PS2DATA) //主机在1->0改变数据,高电平稳定,所以键盘应该在CLK高电平时读取主机 { temp=temp|0x80; //0x80=10000000,如果DATA位是1则同最高位1相或 } readhost=temp; if(!PS2CLK) //每读完一个位都检测时钟线是否被拉低 { status=R8CLK_LOW; //拉低则终止接收 return; } } temp1=temp; //=============================================================第9个时钟读取奇偶校验位 DELAYUS(15); //delay 20us PS2CLK=0; //pull down clk DELAYUS(40); //delay 40us PS2CLK=1; //release clk DELAYUS(18); parity=PS2DATA; if(!PS2CLK) //每读完一个位都检测时钟线是否被拉低 { status=RpCLK_LOW; //拉低则终止接收 return; } //==============================================================第10个时钟读取停止位 DELAYUS(18); //delay 20us PS2CLK=0; //pull down clk DELAYUS(40); //delay 40us PS2CLK=1; //release clk DELAYUS(18); // ! 未进行停止位校验 STOPBIT=PS2DATA; if(!PS2CLK) //每读完一个位都检测时钟线是否被拉低 { status=RsCLK_LOW; //拉低则终止接收 return; } //============================================================= if(!PS2DATA) { while(!PS2DATA) //如数据为低产生时钟直到数据线为高 { DELAYUS(18); PS2CLK=0; DELAYUS(40); PS2CLK=1; DELAYUS(18); } status=STOPERR; return; }
DELAYUS(15); //输出应答位 PS2DATA=0; //0 nop; nop; nop; nop; nop; PS2CLK=0; DELAYUS(40); PS2CLK=1; //释放时钟 nop; nop; nop; nop; nop; PS2DATA=1; //释放数据线 //**************************************************// ACC=temp; if(P==parity) //进行奇偶校验 { status=CHECKERR; return; } DELAYUS(45); //延时45us,以便PC机进行下一次传输 hostcode=temp; //putbyte(0x99); //putbyte(temp1); //if(STOPBIT) //putbyte(0x91); //else putbyte(0x90); status=GETOK; return; } }
|