找回密码
 立即注册
查看: 293|回复: 5

USB HID 如何用中断模式发送数据

[复制链接]
  • TA的每日心情
    慵懒
    2023-12-2 09:55
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    15

    主题

    86

    回帖

    655

    积分

    高级会员

    积分
    655
    发表于 2024-1-9 09:33:23 | 显示全部楼层 |阅读模式
    官方的范例是在循环中查询接收和发送的,我想改为中断模式
    将官方STC8H8K64U系列用户ISP范例(USB模式)代码中的这一句void usb_isr() //interrupt USB_VECTOR注释去掉后改为void usb_isr() interrupt USB_VECTOR,出现报错如下:

    *** WARNING L15: MULTIPLE CALL TO FUNCTION
        NAME:    _USB_WRITE_FIFO/USB
        CALLER1: USB_ISR/USB
        CALLER2: ?C_C51STARTUP

    找了其他USB HID例程里面是简单的原路返回(其实官方不应该用这个原路返回做标准例程,根本不实用,新手不知如何改成发送自己的内容),然后根据USB键盘的例程,修改发送代码如下:


    void usb_IN()
    {
    //    usb_write_reg(INDEX, 1);
    //    while (usb_read_reg(INCSR1) & INIPRDY);
    //    usb_bulk_intr_in(UsbInBuffer, 64, 1);
    //    bUsbInBusy = 1;

            unsigned char i;
            while(bUsbInBusy);
            IE2 &= ~EUSB;
            bUsbInBusy = 1;
            usb_write_reg(INDEX, 1);
            for (i=0; i<64; i++)
            {
                     usb_write_reg(FIFO1, UsbInBuffer);
            }
            usb_write_reg(INCSR1, INIPRDY);
            IE2 |= EUSB;
    }

    这样是不报错了,但不知这样是否正规,有没有隐患,请大佬们帮忙看一下,或者帮忙推荐一个正式的发送自己内容的USB HID的例程看一下。

    回复 送花

    使用道具 举报

  • TA的每日心情
    开心
    3 天前
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    16

    主题

    725

    回帖

    2612

    积分

    超级版主

    积分
    2612
    发表于 2024-1-9 10:12:10 | 显示全部楼层
    *** WARNING L15: MULTIPLE CALL TO FUNCTION
    上面的错误的原因是多个模块调用同一个非可重入的函数所导致的
    原本的查询方式,USB_WRITE_FIFO这个函数只被主函数调用
    你改为中断方式后,就可能同时被主函数和中断函数调用

    解决办法是将函数声明为可重入就可以了,如下:
    截图202401091011104074.jpg


    你的方法也可以
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 09:01
  • 签到天数: 153 天

    [LV.7]常住居民III

    27

    主题

    1400

    回帖

    4362

    积分

    论坛元老

    积分
    4362
    发表于 2024-1-9 10:38:06 | 显示全部楼层
    用户应用(AP)程序里如果有使用中断的话,用户ISP里面就不能使用中断。
    因为用户ISP里面"isr.asm"设置了中断地址偏移,这样用户AP程序才能正常使用中断。
    所以在线升级的ISP范例都是使用查询模式。

    此外,原路返回是最简单的验证收发是否正常的方法,只要收到内容跟发送内容一致,就说明收发正常。
    而且只要看看发送函数的原型就知道几个参数的用途,将发送缓冲区跟长度进行修改就能发送自己想要的数据。
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    慵懒
    2023-12-2 09:55
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    15

    主题

    86

    回帖

    655

    积分

    高级会员

    积分
    655
     楼主| 发表于 2024-1-9 11:12:13 | 显示全部楼层
    zhp 发表于 2024-1-9 10:12
    *** WARNING L15: MULTIPLE CALL TO FUNCTION
    上面的错误的原因是多个模块调用同一个非可重入的函数所导致 ...

    看来一开始发错版块了,在这里很快就有大佬回复,谢谢!
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    慵懒
    2023-12-2 09:55
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    15

    主题

    86

    回帖

    655

    积分

    高级会员

    积分
    655
     楼主| 发表于 2024-1-9 11:15:56 | 显示全部楼层
    乘风飞扬 发表于 2024-1-9 10:38
    用户应用(AP)程序里如果有使用中断的话,用户ISP里面就不能使用中断。
    因为用户ISP里面"isr.asm"设置了中断 ...

    好的,明白。
    新接触USB,自己去改的话心里没底,最好能有实用的例程,原路返回实用性几乎没有,自己改又有重入的报错,直接给个实用的例程对新手更友好
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 09:01
  • 签到天数: 153 天

    [LV.7]常住居民III

    27

    主题

    1400

    回帖

    4362

    积分

    论坛元老

    积分
    4362
    发表于 2024-1-9 11:53:29 | 显示全部楼层
    ahong 发表于 2024-1-9 11:15
    好的,明白。
    新接触USB,自己去改的话心里没底,最好能有实用的例程,原路返回实用性几乎没有,自己改又 ...

    这里有最简单的USB应用教程:
    视频回放, 2023/7/3期, USB 零基础实战,CAN应用,STC32位8051实战宣讲会
    https://www.stcaimcu.com/forum.php?mod=viewthread&tid=2990

    以及最权威的USB标准教学课程:
    视频教学:【USB 原理及实战,16课时】,大学标准课程
    https://www.stcaimcu.com/forum.php?mod=viewthread&tid=4526
    (出处: 国芯论坛-STC全球32位8051爱好者互助交流社区)

    学习USB的话可以去看看。
    回复 支持 反对 送花

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-5-31 02:32 , Processed in 0.062568 second(s), 52 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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