极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 178930|回复: 98

【翻译教程】enc28J60 和 Arduino (1)——ping通你的Arduino

  [复制链接]
发表于 2012-9-27 18:25:43 | 显示全部楼层 |阅读模式
本帖最后由 zcbzjx 于 2013-3-6 22:24 编辑

    看见使用enc28j60的同学越来越多,问题也越来越多,郝老板发的教程不能说不好,但是如果按照那个教程去学习,对于今后弄较大程序会走些弯路,既然我已经绕了这么大的弯终于绕回来了,我想有必要写点东西。
    由于我文笔较差,所以在网上找个对我帮助最大的教程,英文好的直接去这儿看。
    教程总共7章,我慢慢弄,有些章节我可能要根据其他应用做更改。
    所有教程实验环境为arduino UNO+Arduino1.01 IDE




    从现在起,我要开始一个如何在arduino上使用ENC28J60以太网控制器的系列教程。

介绍

     Arduino的官方以太网盾是基于Wiznet W5100芯片, Arduino IDE 的Ethernet库也是针对这个芯片。

    一种广泛使用的以太网控制器是Microchip的ENC28J60,在互联网上你可以找到基于该芯片设计的盾或模块,通常比官方的以太网盾便宜。

    Testato建议我说明这两个控制器之间的差异:主要的不同,之所以Arduino的团队选择了W5100芯片,是该芯片片集成了成熟且经过验证的TCP/IP协议栈,节省了MCU资源。

文库

    很多公司和玩家开发了Arduino的Microchip enc28j60的库,我这些教程使用的库是JeeLabs Café编写的EtherCard库。

   JeeLabs Café把它开源在了GitHub上,先下载一个zip文件的最新版本:

    打开Arduino IDE安装主文件夹(比如  D:\arduino-1.0.1\),解压缩下载的文件到 libraries 子文件夹。在ZIP压缩包中,所有的库文件都在一个名为“jcw-ethercard- xxx”的文件夹中,重命名该文件夹为“EtherCard”:

    运行IDE,检查库是不是已经加载:


网络参数

在把网络控制器连接到网络之前,你需要了解一些参数:

    MAC地址又叫物理地址,是由48比特长,12位的16进制数字组成,0到23位是厂商向IETF等机构申请用来标识厂商的代码,也称为“编制上唯一的标识符”(Organizationally Unique Identifier)。是识别LAN(局域网)结点的标志。地址的24到47位由厂商自行分派,是各个厂商制造的所有网卡的一个唯一编号;
    IP地址就是给每个连接在Internet上的主机分配的一个32bit地址。按照TCP/IP协议规定,IP地址用二进制来表示,每个IP地址长32bit,比特换算成字节,就是4个字节。例如一个采用二进制形式的IP地址是“00001010000000000000000000000001”,这么长的地址,人们处理起来也太费劲了。为了方便人们的使用,IP地址经常被写成十进制的形式,中间使用符号“.”分开不同的字节。于是,上面的IP地址可以表示为“10.0.0.1”。IP地址的这种表示法叫做“点分十进制表示法”,这显然比1和0容易记忆得多,它用于在本地网络中识别设备;
    子网掩码是一个32位地址,是与IP地址结合使用的一种技术。它的主要作用有两个,一是用于屏蔽IP地址的一部分以区别网络标识和主机标识,并说明该IP地址是在局域网上,还是在远程网上。二是用于将一个大的IP网络划分为若干小的子网络。子网掩码通畅也用“点分十进制表示法”。
     网关实质上是一个网络通向其他网络的IP地址,它通常是分配给一个可以到达不同网络的设备(路由器等)。

    你需要编一个与你所在的网络其他设备不同的MAC地址,在这个例子中,我们通常会选择一个尚未分配的组织机构代码(如:DD-DD-DD)开头的MAC地址。

    网络控制器的网络参数(地址,子网掩码,网关)与您的本地网络中的其他设备的配置相比: IP地址应该是唯一的,子网掩码和网关应该是相同的。


    如果你的网络中有DHCP服务器,它会自动对新设备的网络参数进行配置。

ping!

    检查一个设备是否正确联网,最简单的方法是ping它。在一个联网的计算机上输入
ping 你要查看设备的IP地址

    让我们来编写一个简单例子回答ping请求:
  1. #include <EtherCard.h>
  2. static byte mymac[] = {0x74,0x69,0x69,0x2D,0x30,0x31};
  3. static byte myip[] = {192,168,1,10};
  4. byte Ethernet::buffer[700];

  5. void setup () {

  6.   Serial.begin(57600);
  7.   Serial.println("PING Demo");

  8.   if (ether.begin(sizeof Ethernet::buffer, mymac, 10) == 0)
  9.     Serial.println( "Failed to access Ethernet controller");

  10.   if (!ether.staticSetup(myip))
  11.     Serial.println("Failed to set IP address");
  12. }

  13. void loop() {

  14.   ether.packetLoop(ether.packetReceive());
  15. }
复制代码

说明:
  1. #include <EtherCard.h>
  2. static byte mymac[] = {0x74,0x69,0x69,0x2D,0x30,0x31};
  3. static byte myip[] = {192,168,1,10};
  4. byte Ethernet::buffer[700];
复制代码
首先,你需要包括以EtherCard库,并定义一些变量:MAC地址(mymac[]),IP地址(myip[])和用来存储传入和传出的数据缓冲(Ethernet::buffer[700])。
  1. ether.begin(sizeof Ethernet::buffer, mymac, 10)
复制代码
用begin()方法开始网络连接,需要3个参数,分别为缓冲大小、MAC地址和Arduino的片选(CS)引脚(通常为10,这个参数可以不写,如果不写的话默认为8(2560默认也是8),所以要根据你的电路进行设置)。
    顺便说下接线,特别是模块的,很多同学容易弄错,必要接的7根,Vcc接3.3V(电路接好通电后,一定要用万用表量一下,至少要3V以上);CS根据程序接;SI接D11;SO接D12;SCK接D13;RESET接RESET;GND接GND。
    arduino 2560接线:Vcc接3.3V(电路接好通电后,一定要用万用表量一下,至少要3V以上);cs根据程序接;SI接D51;SO接D50;SCK接D52;RESET接RESET;GND接GND。有些2560可能3.3V电压不够,如果调试Vcc可接5V电压(建议不要长时间运行,芯片会比较热)。
  1. ether.staticSetup(myip)
复制代码
用staticSetup()方法配置静态的IP地址,参数有3个,分别为ip地址、网关和DNS,IP地址是必须的,网关和DNS是可选的。大家看下这个函数的参数定义。
  1. static bool staticSetup (const uint8_t* my_ip =0,
  2.                             const uint8_t* gw_ip =0,
  3.                              const uint8_t* dns_ip =0);
复制代码
  1. ether.packetLoop(ether.packetReceive());
复制代码
in the loop, 你只需要2条命令:
packetReceive()方法: 从网络接收一个新传入的数据包;
packetLoop() 方法:对具体收到的信息作出回应,包含“ping” 请求(ICMP echo 请求)。

现在你的arduino联网了:


返回目录

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2012-9-27 23:02:16 | 显示全部楼层
顺序还不错,支持一下!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-9-27 23:06:52 | 显示全部楼层
顺序是什么意思?
回复 支持 反对

使用道具 举报

发表于 2012-9-27 23:08:07 | 显示全部楼层
zcbzjx 发表于 2012-9-27 23:06
顺序是什么意思?

呵呵,是步骤的意思,你这样的说法,对初学者可能好掌握一点的意思!
回复 支持 反对

使用道具 举报

发表于 2012-9-27 23:33:03 | 显示全部楼层
好贴。。强烈加精。。。
回复 支持 反对

使用道具 举报

发表于 2012-9-28 00:18:23 | 显示全部楼层
用力顶!!!;老师来的太及时了!!正在学习这个库!!!终于有一盏指路的明灯了!!!
回复 支持 反对

使用道具 举报

发表于 2012-9-28 07:28:28 | 显示全部楼层
好资料,研究下,我有这个芯片
回复 支持 反对

使用道具 举报

发表于 2012-9-28 08:26:24 | 显示全部楼层
张老师一贯威武!
回复 支持 反对

使用道具 举报

发表于 2012-9-28 10:00:28 | 显示全部楼层
谢谢老师分享了~!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-9-28 14:36:30 | 显示全部楼层
更新了2560的接线方法。经护林人测试无问题。
回复 支持 反对

使用道具 举报

发表于 2012-9-30 11:55:04 | 显示全部楼层
本帖最后由 darkorigin 于 2012-9-30 11:57 编辑

建议贴出来接线顺序,记得坛子里某位大神贴过,我实际使用那个接法成功连接鸟,嘎嘎~~~

呼呼 找到了,是弘毅大神的教程贴
图片必须的
http://www.geek-workshop.com/thread-200-1-1.html

回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-9-30 16:23:45 | 显示全部楼层
darkorigin 发表于 2012-9-30 11:55
建议贴出来接线顺序,记得坛子里某位大神贴过,我实际使用那个接法成功连接鸟,嘎嘎~~~

呼呼 找到了,是 ...

接线顺序贴了哦,虽然没有图,哥哥仔细看了么,
回复 支持 反对

使用道具 举报

发表于 2012-9-30 23:15:39 | 显示全部楼层
zcbzjx 发表于 2012-9-30 16:23
接线顺序贴了哦,虽然没有图,哥哥仔细看了么,

厄 仔细看了下确实有,呵呵。 当时看的时候似乎有点囫囵吞枣了。哈哈~~
教程确实不错。很实用,谢谢哦
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-10-11 14:54:43 | 显示全部楼层
更新接线,根据最新的EtherCard库,cs有了变换,无论2560或是uno默认(begin()方法无第3个参数)都是8;也可以设置任意其他的I/O口,在第3个参数说明就行。

uno我已经测试过,2560我没有,根据代码看应该是这样,希望有2560的同学测试下。
回复 支持 反对

使用道具 举报

发表于 2012-10-12 11:55:49 | 显示全部楼层
ping!
请求这个实验的一开始,我就出现Failed to access Ethernet controller,是我连接错误还是板子有问题
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-23 21:10 , Processed in 0.046018 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表