查看: 5173|回复: 11

[其他] PS/2开机自检无法成功???

[复制链接]
  • TA的每日心情
    奋斗
    2021-2-4 16:14
  • 签到天数: 139 天

    连续签到: 1 天

    [LV.7]常住居民III

    14

    主题

    212

    帖子

    0

    高级会员

    Rank: 4

    积分
    881
    最后登录
    2021-2-4
    发表于 2017-5-16 15:25:46 | 显示全部楼层 |阅读模式
    我用的是飞思卡尔MKL27Z64VLH4,经过测试,我用单片机模拟PS/2时序,可以接收到电脑PS/2口发过来的数据,也可以通过PS/2口向电脑发送数据,但就是在两者交互过程后,开机还是无法让单片机识别为PS/2设备。有没有大神知道,怎样用飞思卡尔单片机实现PS/2开机自检(开机后可以在设备管理器中看到PS/2设备)???
    我找了很长时间,都没发现问题,求助大神!谢谢!
    我知道答案 目前已有11人回答
    今天天气不错!签到!
    回复

    使用道具 举报

    该用户从未签到

    712

    主题

    6371

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    24875
    最后登录
    2025-7-18
    发表于 2017-5-17 09:24:57 | 显示全部楼层
    PS/2协议不了解,你可以参考一些协议资料
    http://download.csdn.net/detail/qq_16070043/7437883
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    5 小时前
  • 签到天数: 2924 天

    连续签到: 15 天

    [LV.Master]伴坛终老

    23

    主题

    4139

    帖子

    82

    金牌会员

    Rank: 6Rank: 6

    积分
    13767
    最后登录
    2025-7-20
    发表于 2017-5-17 17:53:43 | 显示全部楼层
    这个得按PS2的套路来。
    把你对PS2通信流程的理解放上来,帮你分析一下
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2021-2-4 16:14
  • 签到天数: 139 天

    连续签到: 1 天

    [LV.7]常住居民III

    14

    主题

    212

    帖子

    0

    高级会员

    Rank: 4

    积分
    881
    最后登录
    2021-2-4
     楼主| 发表于 2017-5-18 14:12:34 | 显示全部楼层
    toofree 发表于 2017-5-17 17:53
    这个得按PS2的套路来。
    把你对PS2通信流程的理解放上来,帮你分析一下

    好的,我先只说开机自检的部分。因为我在51单片机上已经实现开机自检,同样的思想移植到飞思卡尔上识别不到,所以感觉很奇怪。要实现开机自检就要和电脑进行交互,需要接收电脑的信息,也需要向电脑回复信息,而且PS/2的识别只在刚开机的时候(貌似是BIOS挂载这个PS/2驱动)。我按照PS/2的时序把接收电脑和向电脑发送数据,这两个函数都模拟出来了。当然都单独测试过,没有问题。然后通过判断接收电脑的数据,再回复电脑相应的命令即可,完成这个交互就可以识别到了,在飞思卡尔上我就是按照51上成功实现的命令来进行回复的。。。最后就是不成功,求解答!!!
    今天天气不错!签到!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2021-2-4 16:14
  • 签到天数: 139 天

    连续签到: 1 天

    [LV.7]常住居民III

    14

    主题

    212

    帖子

    0

    高级会员

    Rank: 4

    积分
    881
    最后登录
    2021-2-4
     楼主| 发表于 2017-5-18 14:40:32 | 显示全部楼层
    l546863256 发表于 2017-5-18 14:12
    好的,我先只说开机自检的部分。因为我在51单片机上已经实现开机自检,同样的思想移植到飞思卡尔上识别不 ...

    当然,也有可能怀疑我写的接收电脑命令和向电脑发送命令,这两个函数是否正确,这是我的检测方法:
    1.先检测向电脑发送命令的函数。先用一个PS/2键盘在电脑开机时识别到,看下设备管理器,确定挂载上PS/2设备后,拔下PS/2键盘,换上另外一个准备好的PS/2接口的线(PS/2的线只有四根起作用,时钟线,数据线,VCC和GND),把准备好的线接上单片机,只需要接三根,时钟线,数据线和GND。另外PS/2键盘是5V供电,单片机时3.3V,所以中间用了一个MOS管搭的芯片(实现3.3和5V信号之间的相互转换),单片机时钟线和数据线的两个IO口都接上10K的上拉电阻。做好这些准备根据PS/2第二套码值发送字母A(0x1C),测试成功,在换做BCDEFG都可以发出来,一起发多个字母电脑都可以接收到。我是这样判断向电脑发送数据没有问题。
    2.检测接收电脑的函数。我用了一个工具Bus Hound。查阅资料得知,PS/2键盘最开始用的芯片是:电脑用的是 i8042,其它键盘里面也有一个控制芯片i8048.在电脑上通过控制0x60数据端口和0x64命令端口来控制PS/2键盘,也就是通过这两个端口和电脑i8042通信。在Bus Hound上刚好有这两个端口,我通过Bus Hound的0x60数据端口写入数据,相当于模拟电脑发送数据,我用单片机接收后用串口打印出来,发现打印的数据和我发送的数据一样。我是这样验证接收函数的。
    以上是我检测我的接收函数和发送函数的方法,如果有处理不当的地方,还请指教,谢谢!
    今天天气不错!签到!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    5 小时前
  • 签到天数: 2924 天

    连续签到: 15 天

    [LV.Master]伴坛终老

    23

    主题

    4139

    帖子

    82

    金牌会员

    Rank: 6Rank: 6

    积分
    13767
    最后登录
    2025-7-20
    发表于 2017-5-18 15:06:06 | 显示全部楼层
    l546863256 发表于 2017-5-18 14:40
    当然,也有可能怀疑我写的接收电脑命令和向电脑发送命令,这两个函数是否正确,这是我的检测方法:
    1.先 ...

    电脑开机后,标准的PS2键盘能识别,然后拔下标准PS2键盘,替换上你的模拟PS2键盘,确定你的键盘也可以正确打字。这个过程只能说明你的模拟PS2与电脑的PS2接口数据波特率可正确匹配,别的说明不了。

    PS2主机和从机上电握手过程中,用到了好几条指令。这些指令,从机必须做出回应;而且这些指令不见得就一按某一顺序,跟兼容性有一定关系。那么你要做的就是,不论主机发送什么指令,你的从机都必须能够做出回应。如果你解析不了主机的指令,那么有可能是数据错误,那就要回应指令,让主机重发。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    5 小时前
  • 签到天数: 2924 天

    连续签到: 15 天

    [LV.Master]伴坛终老

    23

    主题

    4139

    帖子

    82

    金牌会员

    Rank: 6Rank: 6

    积分
    13767
    最后登录
    2025-7-20
    发表于 2017-5-18 15:14:14 | 显示全部楼层
    本帖最后由 toofree 于 2017-5-18 15:20 编辑

    在你的指令处理中,把以下指令全部解析。 PS2 KB command.JPG
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2021-2-4 16:14
  • 签到天数: 139 天

    连续签到: 1 天

    [LV.7]常住居民III

    14

    主题

    212

    帖子

    0

    高级会员

    Rank: 4

    积分
    881
    最后登录
    2021-2-4
     楼主| 发表于 2017-5-18 15:41:06 | 显示全部楼层
    toofree 发表于 2017-5-18 15:06
    电脑开机后,标准的PS2键盘能识别,然后拔下标准PS2键盘,替换上你的模拟PS2键盘,确定你的键盘也可以正 ...

    我是这样处理接收到的数据的:
    /*
    处理主机命令函数
    */
    void manage( u8 ljmp )
    {
            switch( ljmp )
            {
               case PS2_RESET:         //主机通知设备复位 0xFF
               send_byte(ANSWERER);    //应答主机 0xFA
               send_byte(BAT);                                 //0xAA
               send_byte(ID);                                         //0x00
               break;

               case GETID:         //主机通知设备设备获得ID 0xF2
               send_byte(ANSWERER);  //0xFA
               send_byte(ID);                                 //0x00
               break;

               case ENABLE_SEND :    //使能数据报告  0xF4
               send_byte(ANSWERER);  //0xFA   
               break;

               case DISABLE_SEND :   // 禁止数据报告 0xF5
               send_byte(ANSWERER);//  0xFA
               break;   

               case SATATUS_REQUEST://主机通知设备告诉状态信息  0xE9
               send_byte(ANSWERER);  //0xFA
               send_byte(ID);                          //0x00
               send_byte(SATATUS3);  //0x02
               send_byte(SATATUS4);  //0x64
               break;

               case PS2_ERROR:         //设备接收错误,通知主机重发  0x55
               send_byte(RESEND);                  //0xFE
               break;  

               default:            //其它命令都回复0XFA
               send_byte(ANSWERER);  //0xFA
               break;   
            }

    }


    里面有重发判断,如果接到的数据有错误,我会让它返回0x55,然后通知主机重发。顺序无所谓吧,我都有判断的
    今天天气不错!签到!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2021-2-4 16:14
  • 签到天数: 139 天

    连续签到: 1 天

    [LV.7]常住居民III

    14

    主题

    212

    帖子

    0

    高级会员

    Rank: 4

    积分
    881
    最后登录
    2021-2-4
     楼主| 发表于 2017-5-18 16:39:16 | 显示全部楼层
    l546863256 发表于 2017-5-18 15:41
    我是这样处理接收到的数据的:
    /*
    处理主机命令函数

    这是主函数做的事情
    while (true)
        {
                    if ( Wait_PS2_PC() )  //检查数据线是否有数据,低电平:有数据准备接收;高电平:无数据
                    {
                            order = receive_byte();  //接收电脑的数据保存到一个变量中
                            manage( order );               //根据接收到的电脑数据,回复相应的命令
                    }


    是不是兼容性不好,导致无法识别?这个兼容性具体指的是什么?

    今天天气不错!签到!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    5 小时前
  • 签到天数: 2924 天

    连续签到: 15 天

    [LV.Master]伴坛终老

    23

    主题

    4139

    帖子

    82

    金牌会员

    Rank: 6Rank: 6

    积分
    13767
    最后登录
    2025-7-20
    发表于 2017-5-18 17:25:09 | 显示全部楼层
    l546863256 发表于 2017-5-18 16:39
    这是主函数做的事情
    while (true)
        {

    不要在manage()中发送数据,这个里面你写BUF或FIFO。然后在主循环中发送。
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-20 08:42 , Processed in 0.113689 second(s), 30 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表