找回密码
 立即注册
查看: 995|回复: 9

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

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2024-12-27 15:57:04

26

主题

166

回帖

1221

积分

金牌会员

积分
1221
发表于 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的例程看一下。

回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:38
  • 最近打卡:2025-04-30 14:38:57

25

主题

977

回帖

3599

积分

超级版主

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

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


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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6843

积分

论坛元老

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

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

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2024-12-27 15:57:04

26

主题

166

回帖

1221

积分

金牌会员

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

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

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2024-12-27 15:57:04

26

主题

166

回帖

1221

积分

金牌会员

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

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6843

积分

论坛元老

积分
6843
发表于 2024-1-9 11:53:29 | 显示全部楼层
aho*** 发表于 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的话可以去看看。
回复 支持 反对

使用道具 举报 送花

0

主题

3

回帖

28

积分

新手上路

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

“用户应用(AP)程序里如果有使用中断的话,用户ISP里面就不能使用中断。”STC8H芯片是无法实现ISP程序也使用中断吗?我需要两段程序都实现中断,怎么解决这个问题呢?
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2025-05-02 08:32:59

718

主题

1万

回帖

1万

积分

管理员

积分
15630
发表于 2024-6-25 15:30:59 | 显示全部楼层
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6843

积分

论坛元老

积分
6843
发表于 2024-6-25 16:04:34 | 显示全部楼层
ZT*** 发表于 2024-6-25 14:56
“用户应用(AP)程序里如果有使用中断的话,用户ISP里面就不能使用中断。”STC8H芯片是无法实现ISP程序也 ...

AP里面使用中断需要进行地址偏移,而用户ISP的中断不要进行地址偏移,这样就产生了矛盾。建议参考例子,用户ISP里面不用中断,使用查询模式即可。
回复 支持 反对

使用道具 举报 送花

0

主题

3

回帖

28

积分

新手上路

积分
28
发表于 2024-6-26 11:55:57 | 显示全部楼层
乘风*** 发表于 2024-6-25 16:04
AP里面使用中断需要进行地址偏移,而用户ISP的中断不要进行地址偏移,这样就产生了矛盾。建议参考例子, ...

您看这样是否可行:在执行ISP程序时,默认在使用中断前就将地址偏移改为0,当要切换到app程序前一刻,将地址偏移改为AP需要的偏移。
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-3 00:53 , Processed in 0.156554 second(s), 111 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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