51单片机iic通信例程_linux移植8位单片机

51单片机iic通信例程_linux移植8位单片机移植好的源码下载:http://download.csdn.net/detail/lxj_com2006/3746433Keil3C518.18注册版下载:http://download.csdn.net/detail/lxj_com2006/3746501网络抓包工具下载:http://download.csdn.net/detail/lxj_com2006/3746594

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

移植好的源码下载:http://download.csdn.net/detail/lxj_com2006/3746433

Keil3 C51 8.18注册版下载:http://download.csdn.net/detail/lxj_com2006/3746501

网络抓包工具下载:http://download.csdn.net/detail/lxj_com2006/3746594

欢迎交流:QQ 67016879 EMAIL: lxj_com@163.com

目录

1       概述:… 1

2       代码文件结构图:… 2

2.1        文件列表:… 2

2.2        代码流程图:… 3

3       系统开销:… 3

4       网卡硬件原理图:… 5

5       SPI接口驱动:… 6

6       ENC28J60驱动:… 7

7       uIP协议栈TCP应用demo:… 8

7.1        uIP代码结构:… 8

7.2        main.c代码说明:… 9

8       应用程序接口uip_appcall():… 10

8.1        uip_send使用举例:… 12

9       配置参数:… 12

9.1        用户设定:… 13

9.2        固定(仅供测试):… 14

10         uIP协议栈事件列表:… 14

11         常见问题:… 15

 

 

1      概述:

网络上关于uIP协议栈的文章不少,大多是讲解自带的http服务器为例子,没有过多的说明作为CS客户端在实际中的应用。

 

本文主要讲述ENC28J60和uIP协议栈作为CS模式在客户端的应用,即采用主动连接与服务器进行用户数据交互,保持长连接,支持自动重连。

        

编译器:Keil3 C51 8.18

uIP版本:0.9

ENC28J60:ENC28J60-I/SO  28-Lead SOIC

单片机:SST89E516RD(1K RAM,64K program ROM 支持在线仿真,兼容51单片机)

                   STC89C58RD+ (512 RAM  32K program ROM)烧录测试

 

特点:查询方式收包,定时更新ARP缓存表,协议栈、收、发共用缓存(内存开销少)

事件回调函数uip_appcall()

支持ICMP/TCP/UDP,端口监听,主/被动连接

2      代码文件结构图:

2.1    文件列表:

51单片机iic通信例程_linux移植8位单片机

2.2    代码流程图:

51单片机iic通信例程_linux移植8位单片机

3      系统开销:

对于一个完成的TCP /IP协议栈来说,uIP算占用资源比较少的,根据实际应用,本例将去除了demo程序中自带的http服务器,fs部分,将连接数、监听端口表、ARP缓存表大小都设置为1,关掉日志,统计信息,重组包,把系统开销降到更低。

 

下表描述uIP系统主要开销情况(估算):

RAM(内存空间):334字节左右

 

其它全局变量60(左右)

连接状态 28*1,ARP缓存表11*1,

协议栈收,发共用缓存233+2(可设置,由单片机内存而定

 

对应代码位置:

 51单片机iic通信例程_linux移植8位单片机

注:实际用户数据空间需要减去40(等其它扩展)字节的TCP/IP头,剩下安全字节179左右,而TCP包用户数据可以达到1460字节,uIP设置了分割包大小为安全字节(见iris抓包),服务端(如:windows)会自动将大包拆分成小包发送<=179每包,所以服务端发送大于179字节的用户数据时,客户端需要重新组包。

 

uIP用户数据单包大小:

 51单片机iic通信例程_linux移植8位单片机

IRIS抓包(设置用户数据分割片大小):

51单片机iic通信例程_linux移植8位单片机

 

 

 

SP(栈空间):40字节左右(最大时)

 

uIP充分考虑到节约内存,大部分接口函数用宏实现,即加大程序的存储空间换取更小的栈空间,协议栈核心函数基本由uip_process()一个函数完成,几乎只有几个局部变量,函数调用参数也很少,除uip_appcall外(由用户决定),其它几个子函数无嵌套调用。

 

 

ROM(程序空间):12K左右

 

uIP自带http演示程序编译后bin文件大小在20K左右,本例去掉了http部分,已经压缩到12K左右,所以选型单片机时ROM至少在16K以上

 

网卡IO脚:最少占用才4个,最多7个(包括RST)

 

 

如果自己新建工程使用本例代码,请将工程属性“Target->Memocy Mode”设置成:Large: variables in XDATA,即使用最大外部内存,否则将产生编译错误,提示内存不足,因为uIP的RAM开销超过了单片机内部内存128字节(超出mov寻址范围),所以需要movx来完成更多内存访问,有些单片机都内置了外存,打开此选项,Keil C51  C编译器会自动完成外部内存访问。

51单片机iic通信例程_linux移植8位单片机

 

4      网卡硬件原理图:

下图为ENC28J60网卡的参考设计图,SCK,CS,SO,SI直接PIN TO PIN接到单片机(SI和SO不需要反接,不同于串口的是SPI的SO,SI都是相对于slave而言的),有些单片自带SPI接口,例如本例中使用的SST89E516RD,但我们程序中仍然采用IO口模拟SPI方式,通用性更好。

51单片机iic通信例程_linux移植8位单片机

5      SPI接口驱动:

本例SPI接口采用单片机IO口模拟,只需根据实际的硬件电路设计(IO口需要上/下拉电阻),在spi.h文件中修改IO脚定义即可,需要注意的是ENC28J60采用SPI0模式,即时钟信号上升沿接收数据,下降沿发送数据,本例中SPI通讯时序已经调通,可以直接使用,至少要接SCK,CS,SI,SO即可,INT没有使用,可以不接,如果接上,ENC28J60驱动代码已经开启了接收中断,程序中可以接收到,但在使用中断模式时,请考虑收,发包的同步情况,比如:网卡支持全双工模式,正在发送包时,又收到一个包产生中断,而uIP协议栈是共用缓存的(为节约内存),如果再次去调用协议栈,会将协议栈缓存出错。

spi.h

51单片机iic通信例程_linux移植8位单片机

SPI相关讯息请参考其它资料,本例略。

 

6      ENC28J60驱动:

ENC28J60除初始化enc28j60_init()外,还需要提供两个主要原生数据收发接口函数给uIP协议栈:enc28j60PacketReceive()网卡收数据,enc28j60PacketSend()网卡发数据。

 

本例中ENC28J60驱动已经调试成功,可以直接使用,在此只做简单说明,更详细请参考相关手册。

51单片机iic通信例程_linux移植8位单片机

 

注:ENC28J60初始化会等待网卡应答,错误无法进入系统。

7      uIP协议栈TCP应用demo:

7.1    uIP代码结构:


51单片机iic通信例程_linux移植8位单片机

7.2    main.c代码说明:

51单片机iic通信例程_linux移植8位单片机

51单片机iic通信例程_linux移植8位单片机

8      应用程序接口uip_appcall():

对于处理应用数据的用户,对uIP整个流程做一个了解即可,uIP将处理后的结果全部都回调到uip_appcall()函数统一处理,所以重点需要完成的工作全部在uip_appcall()函数中,以下介绍一个demo代码:

 

已开启主动连接功能uip.h 行300  #define UIP_ACTIVE_OPEN 1

 51单片机iic通信例程_linux移植8位单片机

51单片机iic通信例程_linux移植8位单片机

8.1    uip_send 使用举例:

uip_send(uip_appdata,sprintf((char*)uip_appdata,”%s”,”Hello,Iconnected to you! thanks”));

 

uip_send(“idle”,4);

 

注:uip_send并没有真正将数据发送到物理网卡,也不保证数据正确到达,仅将数据存储到uIP协议栈中,由uIP来决定发送到物理网卡(空闲时),结果将产生回调,根据事件代码进行相应处理,如:收到ACK,可继续下一包,超时重连,重发等。

9      配置参数:

实际应用中MAC地址,IP地址,网关地址,服务器地址,端口号,应该是可以动态设置的,而MAC,IP地址(除VLAN外)在同一网络中必须是唯一的,否则导致网络不可用。

 

MAC地址可以在烧录程序时让烧录程序(或烧录器)自动加一,写到ROM固定位置,出厂时就设定好,但是MAC地址是有标准的,去IEEE申请还没有这个必要,可以借用其它厂家的,或是用01:02:34:56:78:90:AB这样累加的地址,但MAC地址冲突或不可用这种情况是会有的,比如有些交换机是会拒接一些MAC地址的,还有就是与部分网卡MAC冲突等。

 

本机IP,服务器IP,网关,端口号这些地址必须是可供用户修改的,出厂时无法确定用户的网络环境,需要提供UI供用户修改并保存到E2PROM或其它Flash中。

 

以下为各自参数配置代码位置:

9.1    用户设定:

初始化时将从E2PROM或flash中读取的设置参数替换以下处即可:

 51单片机iic通信例程_linux移植8位单片机

9.2    固定(仅供测试):

以下是固定地址,由编译时决定,出厂后无法修改,不建议使用:

51单片机iic通信例程_linux移植8位单片机

10            uIP协议栈事件列表:

见uip.h 行:493-600,大部分事件已在demo代码中描述。

uipotp.h uIP协议栈的配置参数

11            常见问题:

测试中发现windows操作系统,会出现TCP checksum错误,导致丢包现象,是由于网卡硬件校验原因:

 

解决办法:

网卡配置->高级->Rx Checksum Offload/Tx Checksum Offload,很可能你的这两处
设置是Enable,将之调整成Disable即可,代价是网络性能降低。

一般由操作系统的TCP/IP协议栈完成TCP/UDP/IP校验和的计算工作,这两处设置成
Enable之后,协议栈不再进行校验和的计算,而是由网卡自己完成。如果在前述位置
没有发现Rx Checksum Offload/Tx Checksum Offload项,有两种可能,一种是网卡
本身不支持这种功能,另一种是网卡驱动未提供配置项,后一种情形居多。

 51单片机iic通信例程_linux移植8位单片机

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/179576.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 说说你对servlet 的理解或者 servlet 是什么?「建议收藏」

    说说你对servlet 的理解或者 servlet 是什么?「建议收藏」说说你对servlet的理解或者servlet是什么?Servlet(ServletApplet),全称JavaServlet,是用Java编写的服务器端程序。而这些Servlet都要实现Servlet这个接口。其主要功能在于交互式的浏览和修改数据,生成动态Web内容。Servlet运行于支持Java的应用服务器中。 HttpServlet重写doGet和doPost

  • 修改asmx样式

    修改asmx样式今天看到一张图,asmx的WebService。长这样:当时就感觉有意思,这个页面风格和我们平时的不一样,我们平时的WebService长这样:我们如果在WebMetohd上面加注释,即[WebMethod(Description=”注释”)],那么长这样:那么问题就来了,第一张图里面的样式是如何实现的呢?在浏览器上进入调试模式观察,可以发现它的html和我们的有点不…

  • 诛仙3 私服架设 仿官网「建议收藏」

    诛仙3 私服架设 仿官网「建议收藏」背景:想情怀一把,抑或想怀旧一下,利用官网的乐趣+私服的金钱,打造一个全新的玩法,这就是我的追求。当然了,好东西是要分享的。 全套工具在百度云盘中: 链接:http://pan.baidu.com/s/1i5HG9YP密码:zg7i…

  • WSAStartup()函数的使用

    WSAStartup()函数的使用intWSAStartup(__inWORDwVersionRequested,__outLPWSADATAlpWSAData);WSAStartup格式:intPASCALFARW

  • Visual Studio Code前端开发工具「建议收藏」

    1.1常用的前端开发工具介绍常用的前端开发工具有IDEA、VisualStudioCode、WebStorm、HBuilder等。目前比较火的前端开发工具有WebStorm以及VsCode,下面重点介绍VsCode。 前端提示最好的是Hbuilder开发工具。1.2VsCode简介 VSCode(VisualStudioCode)是微软出的一款轻量级代码编辑器…

  • js清除浏览器缓存的几种方法(项目总结)「建议收藏」

    js清除浏览器缓存的几种方法(项目总结)「建议收藏」以前很少关注这方面的问题,直达我们的技术经理找我们说要换框架,为什么换框架呢,因为缓存的问题,原来的项目是用版本号作为刷新的依据的。因为微信公众号上有这样一个机制,使用版本好的话,有时做不到及时刷新,所以就用了vue.js,因为它有这样的功能就是如果某个文件里面的数据改变了,那么vue.js就会把这个文件的名字也相应的改掉,所以缓存里面的东西就用不了了,这样就做到了及时刷新,向后台请求数据。…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号