923|1

45

帖子

0

资源

一粒金砂(中级)

ART-Pi评测 应用RL-TCPnet实现以太网收发功能及DTU [复制链接]

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

image-20210617220129-1.png

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

image-20210617220146-2.png 配置后编译代码发现了如下错误,应该是属于编译器方面的问题,工程一直默认是AC6,这个at()使用不符合语法。

image-20210617220203-3.png 搜索后发现安富莱论坛有相关问题,并且版主给出了解决方法,代码修改如下,这是其中一个方案

__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编译器,不会报这个错误,如非必要直接切换编译器使用可能更方便些,毕竟点点鼠标比改代码来的方便,哈哈。

image.png 还要根据自己的链路上图几项内容配置好,代码的细节不展示了,需要修改的地方整理好了,网络基本也可以通了。目睹一下真容,使用杜邦线连接的模块,与电脑网线直连,<1ms妥妥的。

image.png 到这里还要结合上一篇串口应用,进行简单的数据透传。主要利用消息队列传递内容,为后续的指令传递做好预备工作。基于现有的工程,只需要创建消息队列,串口收到数据就往里填,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定时发送测试一段时间后,收发计数依然对的上,用来做一些指令的传递还是没问题的。

image.png


回复

6301

帖子

0

资源

五彩晶圆(初级)

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

楼主用LAN8720的模块玩的还行,学习了


回复
您需要登录后才可以回帖 登录 | 注册

最新文章 更多>>
    关闭
    站长推荐上一条 1/10 下一条

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

    北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

    电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2021 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表