This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] RTOS/TM4C1290NCPDT:通过 ISR 进行 USB 通信

Guru**** 2449030 points
Other Parts Discussed in Thread: SYSBIOS

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/623053/rtos-tm4c1290ncpdt-usb-communication-through-isr

器件型号:TM4C1290NCPDT
Thread 中讨论的其他器件:SYSBIOS

工具/软件:TI-RTOS

你好。  我正在尝试让 USB 设备与我们的设备进行通信。  现在、我们只是在寻找通过 USB 电缆发送字符的器件。  从长远看、我们希望这也是更新我们板的一种方法、但现在、我们的目标是使板正常通信。  一切都是正常运行的、只是通信无法正常工作。 我从 usbserialdevice_EK_TM4C129XL_TI 示例借用了代码、以使项目脱离实际。  那么、这里是我对 USB 和 ISR 的初始化

void Init_USB0 (void)
{

USBRingBufInit (&RingBuffer3、Rx3Buffer、1024);

session3.pRingBuffer =&RingBuffer3;
session3.pfnUSBSend =&USB0_Send;
USBCDCDCD_INIT ();
USBIntDisableControl (USB0_BASE、USB_INTCTRL_RESET |
USB_INTCTRL_DISCONNECT |
USB_INTCTRL_RESUME |
USB_INTCTRL_SUSPEND |
USB_INTCTRL_SOF);
USBIntDisableINT (USB0_BASE、USB_INTEP_ALL);
USBInt0 (USBIntDisable)端点0 (USBIntINTCTRL_SOT);USBIntDisable (USBInt0)

USBIntEnableEndpoint (USB0_BASE、USB_EP_1);

USBIntRegister (USB0_BASE、USB0_ISR);
} 

USBCDCDCD_init()转至示例代码,没有任何更改。  我禁用了控制器和端点中断、因为我只需要在线路上有东西时才需要中断。

void USB0_ISR (void)
{
uint32_t ui32Status;

ui32Status = USBEndpointStatus (USB0_BASE、USB_EP_1);

if (ui32Status = USB_DEV_TX_TXPKTRDY)
{
USBRingBufWriteOne (&RingBuffer3、USBpoint_Data1、USBEP_size

)、USB_read_data (USB0_size)、USB_read_data)
USBDevEndpointDataAck (USB0_BASE、USB_EP_1、TRUE);
USBDevEndpointStatusClear (USB0_BASE、USB_EP_1、ui32Status);
USB0DeviceIntHandler ();

} 

顺便说一下、我们在环形缓冲器中处理所有字节。  这就是现有代码的编写方式、最容易遵循该方法。  以下是 READ_DATA 和 DATA_SIZE 的声明

uint8_t read_data[1024];
uint32_t * data_size;

最后、我的代码的发送部分:

void USB0_Send (const uint8_t * pui8Buffer、uint32_t ui32Count)
{
unsigned int buffsize;
while (ui32Count--)
{
Available Size = USBBufferAvailable Available Available (&txBuff);
while (&txbuSize = 0){
&txbuffer = USBBufferAvailable


(&buffle+
);* WriteBufferBuseBuffable (&t+)+);while (&txBufferWrite+)+、USB8+缓冲区缓冲区(&buffleep)+)

} 

目前、我的代码甚至还没有达到这一点、因此我没有努力使该器件变得更好。  请告诉我是否还有其他我忘记提到的东西。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    此外、非零时的 ui32Status 为 x00000004。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Stephen、

    首先、作为 FYI、我编辑了您的帖子、以使代码块更清晰。 这是通过在发布时使用语法"高亮显示"功能来完成的(对于答复、您需要单击"使用富格式"进行访问)。 它是具有"<>"的符号。

    您之前说过、您查看了 usbserialdevice_EK_TM4C1294XL_TI_TivaTM4C1294NCPDT 示例以从中借用代码、但不清楚您的起始基准是什么、预先使用了什么等 您是否可以将 TI 示例移植到您的 MCU、然后在您开始工作后进行修改? 这将是处理此问题的简单得多的方法。 如果您需要进行任何修改、则只需要进行可能的引脚排列。

    我对 TI-RTOS USB 示例并不是很熟悉、您发布的内容在很大程度上偏离了它... 很难说出您在哪里可能会对所提供的信息出错。

    此外、一般性注意事项是、因为您没有提到它... 是否确保使用 Board_initUSB 或 EK_TM4C1294XL_initUSB 初始化 USB 硬件?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Ralph、

    为了确保我理解正确、您希望我尝试修改 usbserialdevice_EK_TM4C1294XL_TI 代码以了解我要做的事情、并查看其不起作用的位置? 当我使用示例代码时、它对我来说开箱即用、无需修改或任何其他操作。 我在这里得到的代码是原始代码、可满足我们当前电路板的需求。

    感谢最后一点的澄清。 我已确保电路板正常工作。 最初、在我开始修改之前、请确保消息"TI-RTOS 控制 USB"。 通过器件来确保其已正确初始化。

    此外、当我在寄存器中循环浏览 USB0_ISR 时、我在 FIFO1中记下了我要查找的字节、因此基本上我看到了这些字节、我不知道如何抓取它们!

    最后 、感谢您编辑我的帖子以方便阅读。 它看起来更好。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Stephen:

    如果该示例有效、我建议尽可能多地移植该示例。

    我看到您的示例与 TI-RTOS 示例之间没有太大的相关性。 例如、我看不到任何环形缓冲器或 USB 端点 API。

    我建议简化移植过程。 即使这些步骤是您的最终目标、也应首先将 RTOS 项目的相关部分集成到您当前的项目中。 在这种情况下、然后逐一添加/更改功能、以便在出现故障时、您可以准确地知道故障发生在什么地方。

    就读取数据而言、通常需要 USBBufferRead API。 我在您的发布代码中看不到任何类似的东西、甚至没有类似的东西。 查看包括 rxData API 在内的 USBCDCDCD_receiveData 函数。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Ralph、

    感谢您迄今提供的帮助。  我返回到 USB 器件的初始化。  

    void Init_USB0 (void)
    {
    Task_Params taskParams;
    USBRingBufInit (&RingBuffer3、Rx3Buffer、4096);
    session3.pRingBuffer =&RingBuffer3;
    session3.pfnUSBSend =&USB0_Send;
    USBCDCD_init();
    Task_Params_init (&taskParams);
    taskParams.STACKSIZE = TASKSTACKSIZE;
    taskParams.stack =_task0Stack;
    taskParams.priority = 1;
    Task_constructure(&task0Struct,(Task_funcPTR) transmitFxn,&taskParams,NULL );
    
    taskParams.stack =_task1Stack;
    Task_construct(&task1Struct,(Task_FuncPtr) receiveFxn、&taskParams、NULL);
    } 

    与代码示例类似:

    OID receiveFxn (UARg arg0、UARg arg1)//此段需要进入 ISR
    {
    接收到 unsigned int;
    while (true){
    设备未连接到 USB 时*/
    USBCDCD_waitForConnect (BIOS_wait_forever);
    接收= USBCDCDCD_receiveData (readBuffData、1、BIOS_WAIT_FOREVE);
    USBRingBufWriteOne (&RingBuffer3、readBuffData[0]);
    }
    }
    void transmitFxn (UArg0、UArg0 arg1)//此部分需要进入发送
    {
    while (true){
    
    设备未连接到 USB 时*/
    USBCDCD_waitForConnect (BIOS_wait_forever);
    
    USBCDCD_sendData (text、sizeof (text)、BIOS_wait_forever);
    // GPIO_TOGGLE (Board_LED0);
    
    /*定期发送数据*/
    Task_sleep(2000);
    }
    } 

    这对我来说已经正常运转、正如我们所期望的那样。  我的问题是、当我尝试将它放入我的 ISR 中、而不是在开始时对其进行初始化时。  我得到此错误:

    TI.SYSBIOS.KNL.Task:第635行:断言失败:A_badThreadType:无法从 Hwi 或 Swi 线程创建/删除任务。

    void USB0_ISR (void)
    {
    Task_Params taskParams;
    Task_Params_init (&taskParams);
    taskParams.STACKSIZE = TASKSTACKSIZE;
    taskParams.stack =&task0Stack;
    taskParams.priority = 1;
    Task_constructure(&task0Struct,(Task_funcPTR) transmitFxn,&taskParams,NULL );
    
    taskParams.stack =&task1Stack;
    Task_construct(&task1Struct,(Task_FuncPtr) receiveFxn、&taskParams、NULL);
    
    USB0DeviceIntHandler();
    
    }
    
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Stephen、

    这是因为您不能在 HWI/SWI 内部使用 task_con构 调用。

    请参阅以下链接中的"调用上下文"表、以参考您可以/不能在 ISR 中执行的操作、然后根据此内容修改代码: software-dl.ti.com/.../Event.html
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢 Ralph 的所有帮助。 现在、我让它运行并运行大部分时间。  现在、这就是两个器件之间的通信方式。  再次感谢。