RL-TCPnet移植到enc28j60

参考安富莱的教程<安富莱_STM32-V5开发板_RL-TCPnet网络教程(V1.0)>

一、移植前的准备

a、一个完整的STM32简单LED灯的工程

b、编译环境Keil4.74

c、查看RL-TCPnet要点,了解移植相关需求

一、RL-TCPnet的底层提供了两种方式  中断和查询 ,我使用的是enc28j60 使用的是查询方式

查询方式提供三个函数实现

1、void init_ethernet(void) 

初始化以太网控制器

void init_ethernet(void) 
{
SPI1_Init();
enc28j60Init(own_hw_adr);

2、void send_frame (OS_FRAME *frame)

发送数据包给以太网控制器

void send_frame (OS_FRAME *frame)
{
U32 len;
U32 *dp,*sp;
U8 pdata[ETH_MTU];


sp  = (U32 *)&frame->data[0];
dp  = (U32 *)&pdata[0];


for (len = (frame->length + 3) >> 2; len; len--) 
{
   *dp++ = *sp++;
  }
enc28j60PacketSend(frame->length,pdata);
 
}

3、void poll_ethernet (void)

从以太网控制器读取数据

void poll_ethernet (void)
{
OS_FRAME *frame;
U8 pdata[ETH_MTU];
U32 RxLen ;
U32 *dp,*sp;


RxLen=enc28j60PacketReceive(ETH_MTU, pdata);
sp  = (U32 *)&pdata[0];


if(RxLen!=0)
{  
frame = alloc_mem (RxLen);
RxLen = (RxLen + 3) >> 2;
dp = (U32 *)&frame->data[0];
for (  ; RxLen; RxLen--)
{
    *dp++ =  *sp++;
  }
frame->length=RxLen-1;
put_in_queue (frame);
}
else return;
}




二、移植

a、将我们裸机模板中制作好的RL-ARM文件夹复制粘贴到准备好的工程模板中

RL-TCPnet移植到enc28j60RL-TCPnet移植到enc28j60

RL-ARM文件夹中有如下七个文件夹:

RL-TCPnet移植到enc28j60

Config文件夹用于存放RTX及其中间件的配置文件。

 Driver文件夹用于存放中间件的驱动文件,也就是底层移植文件。

 RL-CAN文件夹用于存放CAN总线的源码文件。

 RL-FlashFS文件夹用于存放文件系统RL-FlashFS的库文件。

 RL-RTX文件夹用于存放RTX的源码文件。 

RL-TCPnet文件夹用于存放网络协议栈RL-TCPnet的库文件。

 RL-USB文件夹用于存放USB协议栈RL-USB的库文件。

 这些文件全部来自MDK4.74的安装目录,库文件位于路径:C:\Keil_v474\ARM\RV31下,而驱动和配置文件位于路径:C:\Keil_v474\ARM\RL下。  第2步:添加RL-TCPnet的库文件、配置文件


2、添加RL-TCPnet的库文件、配置文件和驱动文件到工程。

添加完毕后的效果如下:

RL-TCPnet移植到enc28j60

3、也是最后一步,添加相应的头文件路径。

在原来工程模板的基础上面新添加的三个路径:

RL-TCPnet移植到enc28j60RL-TCPnet移植到enc28j60

至此,RL-TCPnet的移植工作就完成了,剩下就是系统配置和应用了。



3、RL -TCPTCP net 配置说明 配置说明 (Net_Config.c et_Config.c et_Config.c)


主要是配置IP地址、网关、和子网掩码

RL-TCPnet移植到enc28j60RL-TCPnet移植到enc28j60

取消DHCP

RL-TCPnet移植到enc28j60

RL-TCPnet移植到enc28j60

三、编写一个简单的UDP测试

/*
*********************************************************************************************************
* 函 数 名: tcp_callback
* 功能说明: TCP Socket的回调函数
* 形    参: socket   UDP Socket类型
*             remip    远程设备的IP地址
*             remport  远程设备的端口号
*             buf      远程设备发来的数据地址
*             len      远程设备发来的数据长度,单位字节
* 返 回 值: 默认返回0即可,一般用不上
*********************************************************************************************************
*/
U16 udp_callback(U8 socket, U8 *remip, U16 remport, U8 *buf, U16 len) 
{
char buffer[50];
U16 i;


/* 确保是udp_soc的回调 */
if (socket != udp_soc)
{
return (0);
}


/* 发消息的远程IP,打印IP和端口号 */
sprintf(buffer, "远程连接IP: %d.%d.%d.%d", remip[0], remip[1], remip[2], remip[3]);
printf_debug("%s  port:%d\r\n", buffer, remport);


/* 接收到的数据长度,单位字节 */
printf_debug("Data length = %d\r\n", len);
/* 打印接收到的消息 */

printf_debug(" %s\r\n", buf);

memcpy(Recbuf,buf,len);
RecLen = len;
return (0);
}


void UDP_SendData(uint8_t *dat,uint16_t len,uint8_t *ip,uint16_t Port)
{
uint8_t *sendbuf;
uint8_t res = 0;
sendbuf = udp_get_buf(len);
if(sendbuf != NULL)
{
memcpy(sendbuf,dat,len);
printf("准备要发送的数据:%s\n",sendbuf);
res = udp_send(udp_soc,Rem_IP,PORT_NUM,sendbuf,len);
if(res == TRUE)
{
printf("发送数据成功\n");
}else
{
printf("发送数据失败\n");
}
}
}


/*
*********************************************************************************************************
* 函 数 名: TCPnetTest
* 功能说明: TCPnet应用
* 形    参: 无
* 返 回 值: 无
*********************************************************************************************************
*/
void TCPnetTest(void)
{  

/* 初始化网络协议栈 */
init_TcpNet();

/* 获取一个UDP Socket  */
udp_soc = udp_get_socket (0, UDP_OPT_SEND_CS | UDP_OPT_CHK_CS, udp_callback);
if (udp_soc != 0) 
{
/* 打开UDP端口号 */
udp_open (udp_soc, LocalPort_NUM);
}


/* 创建一个周期是100ms的软定时器 */
    bsp_StartAutoTimer(0, 100);

while (1) 
{


/* TCP轮询 */
tcpnet_poll();
LED_Flash();
if(RecLen > 0)
{
printf("接收到数据长度:%d %s\n",RecLen,Recbuf);

UDP_SendData(Recbuf,RecLen,Rem_IP,PORT_NUM);
RecLen = 0;
}
}
}


主函数代码

int main(void)
{
bsp_Init();
bsp_InitDMAUart1();


bsp_StartTimer(1,500);


TCPnetTest();
}


四、测试 

下载到单片机,由于我设置的是静态IP 而且IP地址是 192.168.1.15  ping 的结果如下

RL-TCPnet移植到enc28j60RL-TCPnet移植到enc28j60


udp测试   把接收到的数据返回


RL-TCPnet移植到enc28j60RL-TCPnet移植到enc28j60



串口显示

RL-TCPnet移植到enc28j60

RL-TCPnet移植到enc28j60

五、完整工程代码

http://download.****.net/download/chen244798611/10105111RL-TCPnet完整工程