发 帖  
原厂入驻New
[问答] Pic24Fj512gb606 USB HID和UART1和UART2无法同时工作
91 编译器 UART
分享
大家好,我使用pic24fj512gb606和Mplab x ide v3.55和XC16 1.26编译器和MLA 2017。my.(主机)在控制传输中刚刚通过usb hid类从android设备接收数据,并且只中断连接和拆卸(根据MLA 2017版本-usb hid与主机示例项目)。USB到MyBoice成功地从设备接收数据。接收到的数据通过UART1模块发送到其他板上,只对少量的数据命令进行工作。之后,UART模块自动禁用(我想)。但是USB仍然处于连接和正常运行状态。如果当uart挂起时软件重置,usb模块也重置。我在while循环中以及在timer1中断中正确地检查了usb.(每5ms检查一次usb任务)。挂起只发生在接收数据时。当usb处于附加状态和正常运行状态时没有问题。我使用32兆赫晶体PLL除法8。我没有对mla库代码usb_host_android.c和usb_host.c i进行任何修改,只是将示例项目转换为我的特定图片。这是硅错误或USB传输设置错误。UART单独工作正常,USB单独工作。谢谢。
0
2020-4-13 07:39:44   评论 分享淘帖 邀请回答

相关问题

17个回答
它是接收还是发射不起作用?在接收程序中处理错误吗?Ruben
2020-4-13 07:53:52 评论

举报

当从usb机箱接收时,仅不附加状态uart通信(发送和接收两者)不,我没有处理错误。当我通过USB接收数据时,经常会出现端点忙错误。
2020-4-13 08:07:17 评论

举报

我指的是UART代码。它是中断驱动的吗?哦,永远不要放弃,Ruben
2020-4-13 08:15:56 评论

举报

是的,UART RX是中断驱动而不是TX。IF(x)中的更改不能解决这个问题。
2020-4-13 08:33:32 评论

举报

那么,UART RX中断中的错误是否被处理了?Ruben
2020-4-13 08:51:11 评论

举报

正是No. Uart RX单独,以及与USB连接和正常运行状态(非数据传输)UART RX工作完美。只有当我开始从USB设备接收数据时,它才会挂起。甚至是一个单一的读数。简单的UART,没有USB工作。没有UART的USB单独工作良好。在挂板后用调试器运行时,我只是强制再次运行它。只有uart模式位是0x0000,也就是它得到重置。之后,该板恢复。但USB被禁用,并要求重新连接。你很难理解这个问题吗?
2020-4-13 09:06:49 评论

举报

UART RX进入接收器空闲模式RIDLE=1
2020-4-13 09:16:01 评论

举报

你的USB任务能在中断上下文中运行吗?在计时器1可能中断?为什么你要响应一个定时器中断调用UbTasks-()?如果你打算使用USB堆栈,就不需要了。Ruben
2020-4-13 09:35:54 评论

举报

我确实理解这个问题,我问这些问题是为了帮助你们。我认为这是最初似乎无关的结果。例如,如果您的usb任务在中断上下文中运行,并且中断优先级高于UART RX中断,则可能会丢失UART中的数据(您调用的函数在USB接收函数中花费相对较长的时间-UART2Put())。这将导致需要处理的溢出错误。另一个需要注意的是堆栈空间。如果在原始演示中添加了函数,请确保堆栈中有足够的空间。/ Ruben
2020-4-13 09:50:12 评论

举报

谢谢你的帮助,Ruben,是的,我犯了那个错误。我的UART具有比USB中断优先级(6)低的中断优先级(4)。现在我把这个USB中断优先级改为3.3,因为USB侧我只使用这个人机界面。UART将发送比USB数据大的数据。现在它固定了。USB运行良好。对于USB的低优先级有什么问题吗?谢谢。
2020-4-13 10:03:47 评论

举报

USB中断不应该是一个问题,因为(根据你的第一篇文章)它只用于连接和拆卸,而不是在轮询模式下使用USB。问题是你调用USB任务时,(1){}循环和定时器中断。(至少我可以从你的帖子中读到)。你为什么那样做?Ruben
2020-4-13 10:18:47 评论

举报

我刚刚说过,我的任务的一些状态需要花费很多时间,超过一毫秒,有时状态将等待200毫秒500毫秒3000毫秒。while循环中的usb任务没有得到处理。但是usb tasks可能至少需要1毫秒,对吧?(不清楚这一点)。因此,我将USB任务置于定时中断,以周期性地调用。这样做是好办法吗?
2020-4-13 10:31:47 评论

举报

不,这不是一个好办法。想想看,有一个风险,即USB任务正在运行,然后被计时器中断,也叫USB任务!如果无法以与USB任务(使用非阻塞状态机的协作多任务处理)相同的方式完成任务,所以.(1)循环不会频繁地调用USBTasks,可以尝试在中断模式下而不是轮询模式下运行USB堆栈。参见usb_config.h,USB_INTERRUPT定义而不是USB_POLLING。并确保在任何中断函数中不调用任何阻塞代码(直到完成长时间操作才返回的代码,如UART2Put())。l您自己的任务(从.(1)循环中调用)会尽快返回,这对于USB堆栈来说在1-2ms以内。这主要可以通过状态机来完成,其中工作被划分为多个状态,如果某个状态需要等待某件事情,则它立即返回,并在下次调用状态机时再次进行检查。而不是使用UARTnPUT。如果您不想在中断模式下使用UART TX,那么如果UART准备发送下一个字符,也可以一次只发送一个字符。
2020-4-13 10:39:40 评论

举报

是的,关于USB任务,你是对的。但是我的应用程序只用状态机运行。由于一些噪声,我需要在状态内部等待,直到噪声稳定下来,等待必须存在。在我的配置文件中有NUBBJPOLLIN定义,所以我在回环中删除了USB任务。谢谢。
2020-4-13 10:48:22 评论

举报

你好,你永远不应该处于等待事件的阻塞状态(在这种情况下,噪音会稳定下来)。这肯定是多个issuesRegards的来源。
2020-4-13 10:54:50 评论

举报

+1不要等待进入状态机。只需创建一个额外的“等待”状态,并继续维护您的其他请求。
2020-4-13 11:01:31 评论

举报

如上所述,我在状态机中这样做的方法是计算一行信号切换到相反电平的行数。1在同一状态下为每个状态机调用计数。如果信号返回,计数被重置。当达到阈值时,信号被考虑为已切换的代码的其余部分,并且状态被改变,要么设置事件,要么在同一状态机中执行您想要执行的操作。然后更改状态以检查另一个级别。每个状态调用都很短,除非在设置信号时执行一些冗长的操作(然后您需要将此操作分解为几个状态)。
2020-4-13 11:10:13 评论

举报

只有小组成员才能发言,加入小组>>

109个成员聚集在这个小组

加入小组

创建小组步骤

关闭

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

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