主题中讨论的其他器件:TM4C123GH6PM
工具/软件:Code Composer Studio
我正在尝试基于 TM4C123GH6PM 设计和构建不依赖 ICDI 的器件、我一直在努力在串行器件模式下实现 USB。 我在这一项目上取得了一些进展,我在下文(在我所做的工作部分)中作了说明,我希望能够帮助其他有类似困难的人。 下文一段概述了问题。 我们衷心感谢您的任何建议。
谢谢、
插孔
我遇到的问题: 如下所述、我已成功运行随 TivaWare 提供的 USB 示例。 但是、我将 USB 功能迁移到现有程序的尝试未成功。 在构建过程中、与 USB 相关的 API (如下所示)数量为"未解析符号"。 我怀疑这些符号是在原始示例中链接或导入的程序中定义的。 我已将似乎相关的文件从示例文件夹复制到我的新项目文件夹中、并尝试链接到不同的程序、但无法执行此操作。
未定义 的首次引用
符号
------ --------
USBBufferEventCallback ./USB_serial_structs.obj
USBBufferFlush ./main.obj
USBBufferInit ./main.obj
USBDCDCInit ./main.obj
USBDCDCPacketRead ./USB_serial_structs.obj
USBDCDCPacketWrite ./USB_serial_structs.obj
USBDCDCRxPacketAvailable ./USB_serial_structs.obj
USBDCDCTxPacketAvailable ./USB_serial_structs.obj
USBDeviceIntHandlerInternal ./usbdhandler.obj
USBStackModeSet ./main.obj
我所做的:我的方法是遵循 LaunchPad Workshop 工作簿中的 USB 示例(实验7)、我找到了可以更新该工作簿的要点。 在工作手册的第1-16页、指示用户从 TI 网页下载 Windows 端 USB 示例。 但是、链接已断开、所提供的 URL 中没有任何内容。 通过搜索 e2e 论坛、我确定可以从 http://www.ti.com/tivaware 下载该应用。 接下来、用户需要下载并安装与 Windows 10兼容的新驱动程序。 您需要的是补丁文件(SW-TM4C-2.1.4.178.patch-1.0.zip)、这些文件也可从 TIvaware 网站访问。
USB_DEV_BULK 示例的工作原理如所述、但使用大容量器件模式实现通信需要我充分了解 Windows 应用程序以对其进行修改或编写自己的文件。 由于我已经对串行通信有所熟悉、因此我决定查看 USB_DEV_serial 示例。
Tivaware USB_DEV_serial 程序随附的自述文件可能更具说明性、因为该程序的目的、所需的硬件和连接不会向用户介绍。 2016年3月、JustGreg 在 e2e TM4C 微控制器论坛上发布了一个问题:"USB_DEV_serial example - please expling it is working"。 通过该主题中的信息(以及我自己的观察结果)、我可以弄清编写程序是为了允许两台计算机通过设备进行通信。 计算机 A 连接到调试 USB 端口、计算机 B 连接到设备端口。 当计算机 A 发送串行数据时、ICDI 通过 uart0将其传递给器件微控制器。 然后、器件微控制器通过器件 USB 端口将数据传递到计算机 B。 在2016线程中、JustGreg 指出、串行函数不需要此程序中的任何 UART 相关代码。
我简化了示例程序、提供了一个能够回波通过器件 USB 端口引入的数据的有效程序。 为此、我删除了所有与 UART 相关的代码、并在 RXHandler 方法中插入了以下代码:
案例 USB_EVENT_RX_Available:
{
uint32_t ui32Read;
uint8_t ui8Char;
bool 读取= true;
if (g_BSendingBreak) //如果当前正在发送 break,则不接收更多数据。
{ 返回; }
while (read = true){ //保持循环直到缓冲区为空
ui32Read = USBBufferRead ((tUSBBuffer *)&g_sRxBuffer、&ui8Char、1);
if (ui32Read) //我们是否得到了一个字符?
{ //将字符回显到 COM 端口
USBBufferWrite ((tUSBBuffer *)&g_sTxBuffer、
(uint8_t *) ui8Char、1);
G_ui32TxCount++; //更新字节计数。
}
否则{ //如果缓冲区中没有剩余字符
读取= false; //退出函数。
返回;
}
}
中断;
}