ART-Pi评测 应用RL-TCPnet实现以太网收发功能及DTU
[复制链接]
关于RTX和RL-TCPnet的应用,不得不提一下安富莱电子,不少经验和技能的积累都来自于对armfly的关注,引用要有出处。这篇文章主要是网络组件的应用。使用MDK的好处是可以方便添加RTX和其组件,反之,为了使用RTX使用MDK是最方便的。首先还是根据原理图更新ETH接口的引脚初始化
工程代码更新以后,主要就是RL-TCPnet的移植。RTE环境依然继承了这些功能,选择CMSIS Driver,这也就是硬件层的接口,然后勾选Network中的相关选项。我手里没有ART-Pi的扩展板,但是有个LAN8720的模块,正好ARM 有提供标准的驱动,测试下是否可以使用。还可以使用Eric2013改进的具有软件复位的驱动,同样符合CMSIS Driver驱动规范。并且剥离了驱动层的相关文件,更利于更换PHY后或修改电路后的移植工作的进行。
配置后编译代码发现了如下错误,应该是属于编译器方面的问题,工程一直默认是AC6,这个at()使用不符合语法。
搜索后发现安富莱论坛有相关问题,并且版主给出了解决方法,代码修改如下,这是其中一个方案
__attribute__((section(".ARM.__at_0x30040000"))) ETH_DMADescTypeDef DMARxDscrTab[ETH_RX_DESC_CNT]; /* Ethernet Rx DMA Descriptors */
__attribute__((section(".ARM.__at_0x30040060"))) ETH_DMADescTypeDef DMATxDscrTab[ETH_TX_DESC_CNT]; /* Ethernet Tx DMA Descriptors */
__attribute__((section(".ARM.__at_0x30040200"))) uint8_t Rx_Buff[ETH_RX_DESC_CNT]
另外一个方案呢,就是使用AC5编译器,不会报这个错误,如非必要直接切换编译器使用可能更方便些,毕竟点点鼠标比改代码来的方便,哈哈。
还要根据自己的链路上图几项内容配置好,代码的细节不展示了,需要修改的地方整理好了,网络基本也可以通了。目睹一下真容,使用杜邦线连接的模块,与电脑网线直连,<1ms妥妥的。
到这里还要结合上一篇串口应用,进行简单的数据透传。主要利用消息队列传递内容,为后续的指令传递做好预备工作。基于现有的工程,只需要创建消息队列,串口收到数据就往里填,tcp检测到队列数据就发送到客户端,也就是测试用的PC上位机。反之,tcp收到数据直接串口发送出去,这个环回逻辑就实现了基础的DTU功能。部分代码如下:
创建线程的同时初始化一个队列
net_MsgQueue = osMessageQueueNew(32, sizeof(MSGQUEUE_OBJ_t), NULL);
串口收到数据扔进队列
if((isISRFlag & USART_FLAG_RXNE) != RESET){
toTcp.Buffer[toTcp.Size] = UART4->RDR;
toTcp.Size += 1;
}
if((isISRFlag & USART_FLAG_IDLE) != RESET){
//__HAL_UART_CLEAR_IDLEFLAG(&huart3);
SET_BIT(UART4->ICR,UART_CLEAR_IDLEF);
osMessageQueuePut(net_MsgQueue, &toTcp, 0U, 0U);
toTcp.Size = 0;
}
tcp服务器拿到数据发送到客户端
if(osMessageQueueGet(net_MsgQueue, &DataRecv, NULL, 0U) == osOK){
iCount = DataRecv.Size;
do
{
if(netTCP_SendReady(tcp_sock) == true )
{
maxlen = netTCP_GetMaxSegmentSize (tcp_sock);
iCount -= maxlen;
if(iCount < 0)
{
maxlen = iCount + maxlen;
}
sendbuf = netTCP_GetBuffer (maxlen);
memcpy(sendbuf,DataRecv.Buffer,DataRecv.Size);
netTCP_Send (tcp_sock, sendbuf, maxlen);
}
}while(iCount > 0);
osMessageQueueReset(net_MsgQueue);
}
经过一些排错和调试后,就得到了如下测试结果。间隔50ms定时发送测试一段时间后,收发计数依然对的上,用来做一些指令的传递还是没问题的。
|