《瑞萨RA产品家族初学者指南》系列文章已收录成合集!
10. 使用“灵活配置软件包”通过
USB端口发送数据
本章目录
使用FSP配置器设置USB端口
创建代码
在主机端设置接收器
10.2 创建代码
现在,添加初始化USB端口和执行端口写入所需的代码。由于本练习需要输入大量的内容,建议您通过瑞萨网站从本手册对应的网页下载该实验的解决方案,这样只需按照说明进行操作,而无需手动输入代码。
https://www.renesas.cn/cn/zh/document/gde/1520091
如果决定自行编写所有内容,首先在“Project Explorer”(项目资源管理器)中通过双击打开hal_entry.c文件。为了确保程序正常运行,需要定义多个全局变量。首先,在hal_entry()函数的头部之前声明USB驱动程序状态的枚举。其类型应该是usb_status_t,可以将其命名为usb_event。接下来,添加一个usb_setup_t类型的结构(在r_usb_basic_api.h中进行声明),并将其命名为usb_setup。我们稍后将在解码某些USB事件时使用该变量,该变量将在USB事件循环内进行初始化。
接下来,我们需要一个变量来保存USB模块的编号。将其设置为uint8_t类型,命名为g_usb_module_number,并为其赋值“0x00”。最后,声明类型为usb_class_t的USB类类型的结构,将其命名为g_usb_class_type,并为其赋值“0x00”。如果要了解我们使用的各种类型的详细信息,请参见《Renesas灵活配置软件包 (FSP) 用户手册》,该手册可以从FSP的GitHub网站下载。
添加这些内容后,此部分代码现在应如下所示:
我们自己的代码也依赖于一些静态全局变量。请添加到USB全局变量下方:
命名为send_str的字符数组用于保存我们要通过USB发送的文本。将其初始化为“LED on ”,因为将LED2切换到“ON”后,将首次使用该变量。下一个变量为s1_pressed,其类型为uint8_t,并需要声明为volatile,因为其值在用户按钮S1的回调例程中将更改为true。默认情况下,其值为false,将由IRQ10中断的回调例程设置为true,表示已按下该按钮,因此通知主程序该事件已发生。
如果没有将该变量声明为volatile,C编译器的优化程序可能不会在每次使用该变量时重新读取其值,因此hal_entry()内部的循环可能无法识别到更改。
第三个变量用于保存LED2的电平,在启动时应该初始化为BSP_IO_LEVEL_HIGH。每次激活S1时,切换该变量的值。
至此,我们已经声明了所有的全局变量,可以继续编写hal_entry()函数内的代码。首先,我们需要一个静态变量,用于保存虚拟UART通信端口的设置,如比特率、停止位和数据位的数量以及奇偶校验类型。该变量的类型应该是usb_pcdc_linecoding_t,建议将其命名为g_line_coding。将“在此添加您自己的代码”占位符替换为声明。稍后将在USB事件处理程序循环中初始化该变量。
接下来,编写代码以打开并启用外部IRQ10,将其连接到评估板的S1。与第9章一样,使用IRQ FSP驱动程序的相应函数:
启用中断后,需要打开USB并获取类类型和模块编号。为此,使用r_usb_basic上的g_basic0USB驱动程序模块的相关函数,并将控制结构传递给这些函数,将引用传递给配置结构(适用于Open() 函数)和相关的变量。温馨提示,e2 studio中的代码补全功能和开发人员帮助可帮助您编写这些代码行。
中断和USB端口的初始化现已完成。接下来编写的所有代码都应该放置在while(1)循环内,因为这部分程序将循环执行。首先,我们编写用于获取和处理端口的USB相关事件的代码。USB驱动程序关联多个事件,但为了简洁起见,仅处理USB_STATUS_REQUEST事件。如果要全面了解事件处理程序,请参见《灵活配置软件包 (FSP) 用户手册》中的USB外设通信设备类(r_usb_pcdc)文档。在此,可以找到此类处理程序的代码示例以及流程图。
现在,您的第一个任务是通过调用R_USB_EventGet()函数来初始化usb_event变量,然后编写处理程序,只有发生USB_STATUS_REQUEST事件时才能执行该处理程序。在if – then – else结构中,首先设置USB端口,然后确定是否请求线路设置。如果是,通过传递g_line_coding变量来配置虚拟UART设置。
如果否,则查询主机是否要接收UART设置。如果是,请将其发送给主机。最后,如果发生事件,在此不进行处理,直接确认。
下面是我们的处理程序版本的完整代码:
可以看到,在处理程序中LINE_CODING_LENGTH出现两次。由于我们还没有定义INE_CODING_LENGTH的值,请返回到文件的顶部,并将其定义为无符号值0x07。
返回到while(1)循环中,添加在激活S1后更改LED2电平的代码,以s1_pressed的true值表示。类似于第9章中写入的内容,但此时需要将要通过USB发送的字符串复制到send_str变量,并将s1_pressed变量设置为false:
最后要添加的代码是用于外部IRQ10的回调函数的代码。将其放置在hal_entry ()函数的括号后面。通过复习第9章,了解回调函数的一些详细信息。首先,需要导入g_bsp_leds结构,并用其初始化我们的本地Leds变量。然后将s1_pressed设置为true,表示事件已发生,接下来将新值写入引脚寄存器。最后,利用r_usb_basic模块的R_USB_Write() API,通过USB端口发送该字符串。
还记得USB描述符g_usb_descriptor吗?现在该描述符将发挥作用。USB需要有关器件、其配置和供应商信息的准确描述。该文件十分复杂,具有长达484行代码。有关该描述符的说明,请参阅《FSP用户手册》的r_usb_basic部分,有关如何构建该描述符的详细说明,请参见通用串行总线规范2.0版(复制下方网址到浏览器中打开查看):
http://www.usb.org/developers/docs/
但这里有两个捷径:一个是在本手册的网站上下载本手册练习的源文件
https://www.renesas.cn/cn/zh/products/microcontrollers-microprocessors/ra-cortex-m-mcus/ra-book
另一个是使用FSP配置器放置在项目ra目录下的模板。其名称为r_usb_pcdc_descriptor.c.template,可以在“项目资源管理”中转到ra → fsp → src → r_usb_pcdc文件夹进行访问(参见图10-10)。将该文件复制到hal_entry.c所在的src文件夹中,并将其重命名为r_usb_descriptor.c。修改供应商ID和产品ID,以便与您自己的产品ID相匹配。如果尚未获得这些数据,暂时使用值0x045BU和0x5310U。到这一步已经完成了要进行的设置和要编写的代码。
图10-10:FSP配置器自动创建USB描述符的模板
最后还需要编译项目。第一次执行此操作需要较长时间,因为需要对项目中包含的所有FSP模块的代码进行编译。在项目编译完成后,如果没有任何错误和警告,即可连接EK-RA6M4评估板并启动调试会话。打开“Debug”(调试)透视图,双击“Resume”(恢复)以启动程序。作为快速测试手段,按一次S1,以查看LED2是否切换。
10.3 在主机端设置接收器
在程序运行的情况下,将第二根USB type A转Micro-B电缆连接到评估板的系统控制和生态系统访问区域左下方标有J11的USB端口。将另一端插入Windows工作站,稍等片刻,直到Windows识别该电路板,对其进行枚举并安装驱动程序。
启动终端仿真器程序。在本练习的开发过程中,用到了Tera Term,它是一款非常实用的工具。
复制以下网址在浏览器中打开查看:
https://ttssh2.osdn.jp/
在Tera Term中,可以看到列出的CDC串行端口。在图10-11中显示为COM3,但在其他PC上可能有所不同。如果不确定,使用Windows的“Device Manager”(设备管理器)来查找电路板所连接的端口。
图10-11:如果Windows正确识别该电路板,它将在Tera Term中列为串行连接
如果没有列出该电路板,或者“Device Manager”(设备管理器)指示错误,则驱动程序可能有问题。请复制以下网址到浏览器中打开,参见瑞萨知识库中有关此主题的最新支持条目以解决此问题:
https://en-support.renesas.com/knowledgeBase/18959077
在已建立连接并运行Tera Term的情况下,多次按下S1,应该可以看到绿色LED2切换,其输出到终端的状态如图10-12所示。
图10-12:在传输运行的情况下,每次按下S1时,终端程序都会显示LED2的状态
您已成功完成本练习!
本章要点:
使用FSP配置器和USB中间件便于增加对USB端口的支持。
要进行USB传输,必须具有USB描述符文件。
全部0条评论
快来发表一下你的评论吧 !