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> if(P1^6 == 0)这种IO访问居然编译没报错,如果是真的建议你重装keil. 正常访问你需要重定义或者调用已声明的IO才可以,比如P17 ,CH554.H定义的是SCK,或者你sbit SCK1 =P1^7; 然后访问的时候,应该是if(SCK == 0)或者if(SCK1 == 0)这种方法。
另外你的第二个使用,明显就是芯片程序跑飞了,程序最后要加返回,这个你可能也不是特别了解,你随便找个网上的汇编看看,最后都要加个 END,while(1)作用跟它差不多。
所以要么你程序最后加while(1);要么你最后写个while(1)把TIN判断包含进去。
看了你的帖子,我觉得吧,应该叫交流贴,是你自己的问题,名字起的好像芯片有BUG一样,不太合适。
因为芯片本身没有任何问题,性价比,外设,USB资源很丰富,而且内置晶振,你程序的问题,其实我觉得仔细看看都不是问题。 SuiBianLiuLiu 发表于 2017-11-21 09:34
然后访问的时候,应该是if(SCK == 0)或者if(SCK1 == 0)这种方法。
另外你的第二个使用,明显就是芯片程序 ...
是,我的第二个只是测一下,管脚到底好用不好用,所以没想那么多,确实应加while SuiBianLiuLiu 发表于 2017-11-21 09:26
if(P1^6 == 0)这种IO访问居然编译没报错,如果是真的建 ...
确实没报错,嘿嘿 SuiBianLiuLiu 发表于 2017-11-21 09:40
看了你的帖子,我觉得吧,应该叫交流贴,是你自己的问题,名字起的好像芯片有BUG一样,不太合适。
因为芯 ...
奥,是这样我说了评测发八篇的,但碰到问题也得发,否则你的篇数不够,关系到信誉问题,至于芯片是好芯片,群众的眼睛是雪亮地。也不是我一个人说的算地。等到问题解决了,我好好夸夸芯片哈 我也在评测USB HOST!沁恒的CH554确实牛!这个价位的MCU支持USB HOST。
我是把PC键盘接入CH554,昨天实验没问题,今天准备写帖子时结果发现不正常了。后面我也是准备弄复合设备。要向你好好学习啊。 操作键盘不正常了吗?截图发出来看看呢? yang_alex 发表于 2017-11-21 13:13
我也在评测USB HOST!沁恒的CH554确实牛!这个价位的MCU支持USB HOST。
我是把PC键盘接入CH554,昨 ...
:handshake太客气了,我还没想到接入真的键盘,你已经比我想得远多了 SuiBianLiuLiu 发表于 2017-11-21 13:28
操作键盘不正常了吗?截图发出来看看呢?
昨天测试正常,通过串口转发收到的USB数据。是HID协议。(有个小插曲,开始设成9600波特率,结果收到的数据自己总觉得有问题,后来尝试改为115200波特率,就恍然大悟,明显是HID鼠标键盘协议吗!)
今天再测就发现串口驱动不正常,串口收不到数据。有可能跟我昨晚做的其他实验有关。正在找原因。 SuiBianLiuLiu 发表于 2017-11-21 09:28
正常访问你需要重定义或者调用已声明的IO才可以,比如P17 ,CH554.H定义的是SCK,或者你sbit SCK1 =P1^7;
按你的方法解决了,唉,话说也是老司机了,今天在这儿载了一下。丢人啊{:1_137:} 程序默认的波特率是57600吧。 SuiBianLiuLiu 发表于 2017-11-21 19:08
程序默认的波特率是57600吧。
YES:time: SuiBianLiuLiu 发表于 2017-11-21 19:08
程序默认的波特率是57600吧。
对,默认波特率是57600.我现在正是满头雾水了。现在插上PC键盘就是没反应。先插PC键盘再上电,或者反过来,上电后,插上PC键盘。两种情况串口都收不到信息。 你看看你的串口能不能正常输出,T和R短接一下,试试自发自收,没问题的话。
看看程序里面是不是屏蔽了打印,我记得DEBUG.H里面可以关闭打印调试的,有个 PRINTF的宏定义。 楼主,能分享一下您的这个程序给我参考一下吗?程序里面的HIDMouse和HIDKey是您自己定义的嘛?我是一个小菜鸟来的:Cry::titter:
页:
[1]