BinWin 发表于 2021-6-17 22:08

ART-Pi评测 应用RL-TCPnet实现以太网收发功能及DTU

<p>&nbsp;<span style="font-size:11.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">关于RTX和RL-TCPnet的应用,不得不提一下安富莱电子,不少经验和技能的积累都来自于对armfly的关注,引用要有出处。这篇文章主要是网络组件的应用。使用MDK的好处是可以方便添加RTX和其组件,反之,为了使用RTX使用MDK是最方便的。首先还是根据原理图更新ETH接口的引脚初始化</span></span></p>

<p></p>

<p><span style="font-size:11.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">工程代码更新以后,主要就是RL-TCPnet的移植。RTE环境依然继承了这些功能,选择CMSIS Driver,这也就是硬件层的接口,然后勾选Network中的相关选项。我手里没有ART-Pi的扩展板,但是有个LAN8720的模块,正好ARM 有提供标准的驱动,测试下是否可以使用。还可以使用Eric2013改进的具有软件复位的驱动,同样符合CMSIS Driver驱动规范。并且剥离了驱动层的相关文件,更利于更换PHY后或修改电路后的移植工作的进行。</span></span></p>

<p><span style="font-size:11.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">配置后编译代码发现了如下错误,应该是属于编译器方面的问题,工程一直默认是AC6,这个at()使用不符合语法。</span></span></p>

<p><span style="font-size:11.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">搜索后发现安富莱论坛有相关问题,并且版主给出了解决方法,代码修改如下,这是其中一个方案</span></span></p>

<pre>
<code class="language-cpp">__attribute__((section(".ARM.__at_0x30040000"))) ETH_DMADescTypeDefDMARxDscrTab; /* Ethernet Rx DMA Descriptors */
__attribute__((section(".ARM.__at_0x30040060"))) ETH_DMADescTypeDefDMATxDscrTab; /* Ethernet Tx DMA Descriptors */
__attribute__((section(".ARM.__at_0x30040200"))) uint8_t Rx_Buff</code></pre>

<p><span style="font-size:11.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">另外一个方案呢,就是使用AC5编译器,不会报这个错误,如非必要直接切换编译器使用可能更方便些,毕竟点点鼠标比改代码来的方便,哈哈。</span></span></p>

<p><span style="font-size:11.0pt"><span lang="zh-CN" style="font-family:&quot;Microsoft YaHei&quot;">还要根据自己的链路上图几项内容配置好,代码的细节不展示了,需要修改的地方整理好了,网络基本也可以通了。目睹一下真容,使用杜邦线连接的模块,与电脑网线直连,</span><span lang="en-US" style="font-family:Calibri">&lt;1</span><span lang="en-US" style="font-family:&quot;Microsoft YaHei&quot;">ms</span><span lang="zh-CN" style="font-family:&quot;Microsoft YaHei&quot;">妥妥的。</span></span></p>

<p><span style="font-size:11.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">到这里还要结合上一篇串口应用,进行简单的数据透传。主要利用消息队列传递内容,为后续的指令传递做好预备工作。基于现有的工程,只需要创建消息队列,串口收到数据就往里填,tcp检测到队列数据就发送到客户端,也就是测试用的PC上位机。反之,tcp收到数据直接串口发送出去,这个环回逻辑就实现了基础的DTU功能。部分代码如下:</span></span></p>

<p><span style="font-size:11.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">创建线程的同时初始化一个队列</span></span></p>

<pre>
<code class="language-cpp">net_MsgQueue = osMessageQueueNew(32, sizeof(MSGQUEUE_OBJ_t), NULL);
</code></pre>

<p><span style="font-size:11.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">串口收到数据扔进队列</span></span></p>

<pre>
<code class="language-cpp">if((isISRFlag &amp; USART_FLAG_RXNE) != RESET){       
                toTcp.Buffer = UART4-&gt;RDR;       
                toTcp.Size += 1;
}

if((isISRFlag &amp; USART_FLAG_IDLE) != RESET){
       
        //__HAL_UART_CLEAR_IDLEFLAG(&amp;huart3);
        SET_BIT(UART4-&gt;ICR,UART_CLEAR_IDLEF);
       
        osMessageQueuePut(net_MsgQueue, &amp;toTcp, 0U, 0U);
        toTcp.Size = 0;
}
</code></pre>

<p><span style="font-size:11.0pt"><span style="font-family:&quot;Microsoft YaHei&quot;">tcp服务器拿到数据发送到客户端</span></span></p>

<pre>
<code> if(osMessageQueueGet(net_MsgQueue, &amp;DataRecv, NULL, 0U) == osOK){
               
                iCount = DataRecv.Size;
                do
                {
                        if(netTCP_SendReady(tcp_sock) == true )
                        {
                                maxlen= netTCP_GetMaxSegmentSize (tcp_sock);

                                iCount -= maxlen;
                               
                                if(iCount &lt; 0)
                                {
                                       
                                        maxlen = iCount + maxlen;
                                }
                               
                                sendbuf = netTCP_GetBuffer (maxlen);
                                memcpy(sendbuf,DataRecv.Buffer,DataRecv.Size);
                               
                                netTCP_Send (tcp_sock, sendbuf, maxlen);
                               
                        }
                       
                }while(iCount &gt; 0);
                osMessageQueueReset(net_MsgQueue);
}</code></pre>

<p><span style="font-size:11.0pt"><span lang="zh-CN" style="font-family:&quot;Microsoft YaHei&quot;">经过一些排错和调试后,就得到了如下测试结果。间隔</span><span lang="en-US" style="font-family:Calibri">50</span><span lang="en-US" style="font-family:&quot;Microsoft YaHei&quot;">ms</span><span lang="zh-CN" style="font-family:&quot;Microsoft YaHei&quot;">定时发送测试一段时间后,收发计数依然对的上,用来做一些指令的传递还是没问题的。</span></span></p>

<p></p>

Jacktang 发表于 2021-6-19 08:59

<p>添加RTX和其组件使用MDK确实是最方便</p>

<p>楼主用LAN8720的模块玩的还行,学习了</p>
页: [1]
查看完整版本: ART-Pi评测 应用RL-TCPnet实现以太网收发功能及DTU