ddllxxrr 发表于 2017-11-20 22:23

CH554评测:七,改下复合设备例程问题解决

<div class='showpostmsg'> 本帖最后由 ddllxxrr 于 2017-11-21 17:42 编辑

这周我改了下,USB的复合设备,就是键盘同鼠标复合设备那个,原理很简单,我用P1.6和P1.7两个管脚当键盘,当P1.6为低时鼠标向
上,当P1.7低时鼠标向下。
在主函数里声明管脚

          Port1Cfg(1,6);
          Port1Cfg(1,7);


然后始终在执行

         if(Ready)
      {
          while(1)
                           {                        
                                        HIDValueHandle();
                                        }      
      }

而在HIDValueHandle中,是这样:

oid HIDValueHandle()
{
    UINT8 i;
      if(P1^6 == 0)
      {

                                       i = 1;
                              }
               else if(P1^7 == 0)
                              {

                                        i = 2;
                                       
                              }
      else
          i = 0;                                       
               switch(i)
      {
//êó±êêy¾YéÏ′«ê¾ày
      case 1:                                                      //×ó¼ü
            HIDMouse = -1;
            Enp2IntIn();
                                    i=0;

            break;
      case 2:                                                      //óò¼ü
            HIDMouse = 1;
            Enp2IntIn();
                                    i=0;

            break;
//¼üÅìêy¾YéÏ′«ê¾ày
      case 'A':                                                         //A¼ü
            FLAG = 0;
            HIDKey = 0x04;                                             //°′¼ü¿aê¼
            Enp1IntIn();
            HIDKey = 0;                                                //°′¼ü½áêø
            while(FLAG == 0)
            {
                ;    /*μè′yéÏò»°ü′«êäíê3é*/
            }
            Enp1IntIn();
            break;
      case 'P':                                                         //P¼ü
            FLAG = 0;
            HIDKey = 0x59;
            Enp1IntIn();
            HIDKey = 0;                                                //°′¼ü½áêø
            while(FLAG == 0)
            {
                ;    /*μè′yéÏò»°ü′«êäíê3é*/
            }
            Enp1IntIn();
            break;
      case 'Q':                                                         //Num Lock¼ü
            FLAG = 0;
            HIDKey = 0x53;
            Enp1IntIn();
            HIDKey = 0;                                                //°′¼ü½áêø
            while(FLAG == 0)
            {
                ;    /*μè′yéÏò»°ü′«êäíê3é*/
            }
            Enp1IntIn();
            break;
      default:                                                          //ÆäËû
            UEP1_CTRL = UEP1_CTRL & ~ MASK_UEP_T_RES | UEP_T_RES_NAK;   //ĬèÏó|′eNAK
            UEP2_CTRL = UEP2_CTRL & ~ MASK_UEP_T_RES | UEP_T_RES_NAK;   //ĬèÏó|′eNAK
            break;
      }
}

我编译完后,可以看到鼠标自动向上移动,说明可以以每次每格的速度移动鼠标,但是我的问题是
我没有给管脚拉低,它确自动向上移动,我用万用表量了,确实是5V电压,但我用杜绑线拉低时也没有见它下来。

请问大家这是为什么?????

奇怪的是,我单独试按键程序如下:
void main( )
{
    UINT16 j = 0;
    CfgFsys( );                                                                //CH554ê±ÖóÑ¡ÔñÅäÖà  
    mDelaymS(20);
    mInitSTDIO( );                                                             //′®¿ú03õê¼»ˉ
    printf("start ...\n");
          Port1Cfg(1,6);                                                             //P14éèÖÃ3éàà51Ë«Ïòģ꽠        

    if(TIN4 == 0)
                {
                  printf("press\n");
    }
}

而我用串口监视,确又是好的,即可以输出"PRESS",而我不接地时输出“Start。。。”


上传个视频:一插上就向上,但我还没有连接任何的导线。http://v.youku.com/v_show/id_XMz ... j.8428770.3416059.1
http://v.youku.com/v_show/id_XMzE3MjU4MTE4NA==.html?spm=a2h3j.8428770.3416059.1


上述问题解决了
首先谢谢回贴个位:我把程序改为
if(MISO == 0)
      {

                                       i = 1;
                              }
               else if(SCK == 0)
                              {

                                        i = 2;
                                       
                              }
      else
          i = 0;                                       
就好了,上下可以随便动了。

此内容由EEWORLD论坛网友ddllxxrr原创,如需转载或用于商业用途需征得作者同意并注明出处







</div><script>                                        var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                                       
                                        if(parseInt(discuz_uid)==0){
                                                                                                (function($){
                                                        var postHeight = getTextHeight(400);
                                                        $(".showpostmsg").html($(".showpostmsg").html());
                                                        $(".showpostmsg").after(loginstr);
                                                        $(".showpostmsg").css({height:postHeight,overflow:"hidden"});
                                                })(jQuery);
                                        }                </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

SuiBianLiuLiu 发表于 2017-11-21 09:26

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(P1^6 == 0)这种IO访问居然编译没报错,如果是真的建议你重装keil.

SuiBianLiuLiu 发表于 2017-11-21 09:28

正常访问你需要重定义或者调用已声明的IO才可以,比如P17 ,CH554.H定义的是SCK,或者你sbit SCK1 =P1^7;

SuiBianLiuLiu 发表于 2017-11-21 09:34

然后访问的时候,应该是if(SCK == 0)或者if(SCK1 == 0)这种方法。
另外你的第二个使用,明显就是芯片程序跑飞了,程序最后要加返回,这个你可能也不是特别了解,你随便找个网上的汇编看看,最后都要加个 END,while(1)作用跟它差不多。
所以要么你程序最后加while(1);要么你最后写个while(1)把TIN判断包含进去。

SuiBianLiuLiu 发表于 2017-11-21 09:40

看了你的帖子,我觉得吧,应该叫交流贴,是你自己的问题,名字起的好像芯片有BUG一样,不太合适。
因为芯片本身没有任何问题,性价比,外设,USB资源很丰富,而且内置晶振,你程序的问题,其实我觉得仔细看看都不是问题。

ddllxxrr 发表于 2017-11-21 12:19

SuiBianLiuLiu 发表于 2017-11-21 09:34
然后访问的时候,应该是if(SCK == 0)或者if(SCK1 == 0)这种方法。
另外你的第二个使用,明显就是芯片程序 ...

是,我的第二个只是测一下,管脚到底好用不好用,所以没想那么多,确实应加while

ddllxxrr 发表于 2017-11-21 12:20

SuiBianLiuLiu 发表于 2017-11-21 09:26
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(P1^6 == 0)这种IO访问居然编译没报错,如果是真的建 ...

确实没报错,嘿嘿

ddllxxrr 发表于 2017-11-21 12:24

SuiBianLiuLiu 发表于 2017-11-21 09:40
看了你的帖子,我觉得吧,应该叫交流贴,是你自己的问题,名字起的好像芯片有BUG一样,不太合适。
因为芯 ...

奥,是这样我说了评测发八篇的,但碰到问题也得发,否则你的篇数不够,关系到信誉问题,至于芯片是好芯片,群众的眼睛是雪亮地。也不是我一个人说的算地。等到问题解决了,我好好夸夸芯片哈

yang_alex 发表于 2017-11-21 13:13

我也在评测USB HOST!沁恒的CH554确实牛!这个价位的MCU支持USB HOST。


我是把PC键盘接入CH554,昨天实验没问题,今天准备写帖子时结果发现不正常了。后面我也是准备弄复合设备。要向你好好学习啊。

SuiBianLiuLiu 发表于 2017-11-21 13:28

操作键盘不正常了吗?截图发出来看看呢?

ddllxxrr 发表于 2017-11-21 13:48

yang_alex 发表于 2017-11-21 13:13
我也在评测USB HOST!沁恒的CH554确实牛!这个价位的MCU支持USB HOST。


我是把PC键盘接入CH554,昨 ...

:handshake太客气了,我还没想到接入真的键盘,你已经比我想得远多了

yang_alex 发表于 2017-11-21 14:27

SuiBianLiuLiu 发表于 2017-11-21 13:28
操作键盘不正常了吗?截图发出来看看呢?

昨天测试正常,通过串口转发收到的USB数据。是HID协议。(有个小插曲,开始设成9600波特率,结果收到的数据自己总觉得有问题,后来尝试改为115200波特率,就恍然大悟,明显是HID鼠标键盘协议吗!)

今天再测就发现串口驱动不正常,串口收不到数据。有可能跟我昨晚做的其他实验有关。正在找原因。

ddllxxrr 发表于 2017-11-21 17:38

SuiBianLiuLiu 发表于 2017-11-21 09:28
正常访问你需要重定义或者调用已声明的IO才可以,比如P17 ,CH554.H定义的是SCK,或者你sbit SCK1 =P1^7;

按你的方法解决了,唉,话说也是老司机了,今天在这儿载了一下。丢人啊{:1_137:}

SuiBianLiuLiu 发表于 2017-11-21 19:08

程序默认的波特率是57600吧。

ddllxxrr 发表于 2017-11-22 09:02

SuiBianLiuLiu 发表于 2017-11-21 19:08
程序默认的波特率是57600吧。

YES:time:

yang_alex 发表于 2017-11-22 11:55

SuiBianLiuLiu 发表于 2017-11-21 19:08
程序默认的波特率是57600吧。

对,默认波特率是57600.我现在正是满头雾水了。现在插上PC键盘就是没反应。先插PC键盘再上电,或者反过来,上电后,插上PC键盘。两种情况串口都收不到信息。

SuiBianLiuLiu 发表于 2017-11-24 09:22

你看看你的串口能不能正常输出,T和R短接一下,试试自发自收,没问题的话。
看看程序里面是不是屏蔽了打印,我记得DEBUG.H里面可以关闭打印调试的,有个 PRINTF的宏定义。

Knight20 发表于 2018-12-23 17:21

楼主,能分享一下您的这个程序给我参考一下吗?程序里面的HIDMouse和HIDKey是您自己定义的嘛?我是一个小菜鸟来的:Cry::titter:

zhuyebb 发表于 2018-12-23 19:06

页: [1]
查看完整版本: CH554评测:七,改下复合设备例程问题解决