当前位置:首页 > 单片机 > 单片机
[导读]网络通信的作用不用多说,而这次进行的工作即是对以太网通信过程中,需要用到的硬件部分进行初始化,也介绍了发送和接收数据的方法。由于较为复杂,所以使用了ASF框架。但是也会对用到的库函数的实现做一个介绍。一、

网络通信的作用不用多说,而这次进行的工作即是对以太网通信过程中,需要用到的硬件部分进行初始化,也介绍了发送和接收数据的方法。

由于较为复杂,所以使用了ASF框架。但是也会对用到的库函数的实现做一个介绍。

一、 MAC、PHY和MII

IEEE 802.3是现在常用的以太网标准,它定义了物理层(Physical Layer,PHY)和介质访问控制层(Media Access Control,MAC)的标准。另外,在OSI模型中,MAC则处于数据链路层的底层。

而在硬件实现上,M4使用的GMAC外设实现了802.3中MAC的功能。开发板携带型号为KSZ8051MNL的PHY芯片以及RJ45接口则实现了物理层的功能:

MAC和PHY之间交互的接口则是介质独立接口(Media Independent Interface,MII)。MII包含一个数据通信接口,以及一个管理接口(Management Data Input/Output ,MDIO)。由于PHY的接口是面向MAC的,所以我们需要通过MAC来对PHY进行管理及数据交互。

另外,更早制定的Ethernet II帧则是现在以太网传输中常使用的帧格式。

二、 GMAC的DMA缓冲区

GMAC使用了一个DMA接口。和M4的通用DMAC一样,它也可以自动进行多次传输,但是方式稍微有点区别。GMAC的DMA 对发送和接收使用不同的缓冲区列表,而缓冲区描述符列表是一个数组,而不是DMAC所使用的链表。数组的起始位置保存在寄存器(GMAC_RBQB、GMAC_TBQB)中,且缓冲区描述符中有一个字段(Wrap)指示其是否为数组中的最后一个描述符。如接收缓冲区:

在工作过程中,DMA会顺序访问每个缓冲区描述符,而在访问最后一个描述符时,就会重新开始遍历。

对于接收缓冲,列表中每一个缓冲区的长度是一样的,这个长度由DMA配置寄存器(GMAC_DCFGR)中的DRBS字段指定。在DMA将数据写入接收缓冲时,也会设置描述符相应的字段,以表明每帧的起始与结束;同时,也会标注相关的信息,如是否为广播帧等。

对于发送缓冲,其帧长度、是否需要添加CRC等控制信息也均在描述符中表示。在准备好数据后,向GMAC_NCR寄存器写入TSTART字段即可触发发送操作。

三、 使用ASF初始化GMAC

由于PHY是通过MAC访问的,所有在设置PHY前要完成GMAC的设置。

GMAC约有94个寄存器,其中约有40个为统计寄存器,约15个寄存器与1588和PTP相关,约15个寄存器与特殊地址和ID有关。另外,在有些状态寄存器中,需要向特定位写入1才会清除该位的状态。

使用的ASF模块为Ethernet GMAC,然后conf_eth.h中可以设置MAC地址,IP地址,子网掩码,网关以及缓冲区大小等参数。

然后调用gmac_dev_init( )函数即可对GMAC进行初始化:

123456789101112131415161718pmc_enable_periph_clk(ID_GMAC);// MAC地址uint8_t mac_address[] ={ ETHERNET_CONF_ETHADDR0, ETHERNET_CONF_ETHADDR1,ETHERNET_CONF_ETHADDR2,ETHERNET_CONF_ETHADDR3,ETHERNET_CONF_ETHADDR4, ETHERNET_CONF_ETHADDR5};// GMAC选项gmac_options_t gmac_option;gmac_option.uc_copy_all_frame = 0; // 不拷贝所有帧gmac_option.uc_no_boardcast = 0; // 不忽略广播memcpy(gmac_option.uc_mac_addr,mac_address, sizeof(mac_address)); //拷贝MAC地址// GMAC驱动设置gmac_device_t gmac_dev;gs_gmac_dev.p_hw = GMAC; // 指定GMAC寄存器基址// 初始化GMACgmac_dev_init(GMAC, &gmac_dev, &gmac_option);

gmac_dev_init(Gmac* p_gmac, gmac_device_t* p_gmac_dev, gmac_options_t* p_opt)函数完成了以下的工作:

禁用发送接收,禁用GMAC所有中断;清除统计寄存器,以及发送接受状态寄存器。

设置GMAC_NCFGR寄存器。根据p_opt,判断是否拷贝所有帧,以及是否忽略广播。同时,追加GMAC_NCFGR_PEN和GMAC_NCFGR_IRXFCS位。(我觉得这里应该是个BUG,从其注释判断需要追加的应该是GMAC_NCFGR_RFCS位)

设置好DMA缓冲,然后调用gmac_init_mem( )对缓冲区描述符等进行初始化。这个函数里也会使能发送和接收,同时也会启用一系列的中断。设置完成后,DMA缓冲的信息将储存在p_gmac_dev中。

将MAC地址写入特别地址寄存器1。

四、PHY的地址

在MDIO通信过程中,每个PHY都会有一个4位的地址。而开发板携带的KSZ8051MNL芯片,可以在上电或复位时,根据引脚设置地址的低3位:

在开发板中,上电时PHYAD[2:0]的值为001,即其地址为0x1。

特别指出,地址0可作为该芯片的广播地址,而开发板也做了这样的配置。另外,在ASF中,错误地将PHY的地址定义成了0。这样能正确工作的原因仅是0为广播地址,而开发板只有一个PHY芯片。严谨起见,将这个地址修改为正确的值:

1234#ifdef BOARD_GMAC_PHY_ADDR#undef BOARD_GMAC_PHY_ADDR#endif#define BOARD_GMAC_PHY_ADDR 1

五、在ASF中使用PHY

使用的模块为Ethernet Physical Transceiver。需要在conf_board.h 中声明宏:

12/* 使用 ETH PHY: KSZ8051MNL */#define CONF_BOARD_KSZ8051MNL

初始化。

在PHY上电后,需要等待一段时间让其运行稳定。之后就可以对其进行初始化了:

12345if(ethernet_phy_init(GMAC, BOARD_GMAC_PHY_ADDR,sysclk_get_cpu_hz())!= GMAC_OK) {puts("PHY Initialize ERROR!r");return-1;}

在该ethernet_phy_init( )函数中,完成了以下工作:

设置MDIO的时钟MDC。

通过MDIO向PHY发送重置命令。

检查地址是否正确。检查的逻辑是先读取PHY的PHYID1的内容,再判断读出的内容是否正确。KSZ8051MNL芯片中,该寄存器的值是0x22。

如果地址无效的话,因为MDIO有效地址只有32个,就遍历这些地址。然后使用检查出的新地址重新发送一次重置命令。

如果初始化成功,则返回GMAC_OK。

自协商。

然后需要让PHY协商通信速率、双工模式:

123456ethernet_phy_auto_negotiate(GMAC, BOARD_GMAC_PHY_ADDR);if(ethernet_phy_set_link(GMAC, BOARD_GMAC_PHY_ADDR, 0)!= GMAC_OK) {puts("Set link ERROR!r");return-1;}

ethernet_phy_auto_negotiate()函数就会完成PHY的协商工作,然后根据协商的结果设置GMAC的速率、双工模式。ethernet_phy_set_link()函数则会检查链路的状态,同时可以根据参数(第3个)应用PHY的自协商结果至GMAC中。

中断处理。

ASF的GMAC模块需要获取相关的中断,以进行相关的工作:如更新发送缓冲区描述符相关的信息,或是调用用户定义的回调函数等。

12345// 需要在NVIC中启用相关中断voidGMAC_Handler(void){gmac_handler(&gs_gmac_dev);}

数据接收。

先准备好一个缓冲,然后就可以调用gmac_dev_read()读取出接收到的帧的内容。

12345//#define GMAC_FRAME_LENTGH_MAX 1536uint8_t eth_buffer[GMAC_FRAME_LENTGH_MAX];uint32_t frm_size;gmac_dev_read(&gmac_dev, (uint8_t *) eth_buffer,sizeof(eth_buffer), &frm_size);

数据发送。

1gmac_dev_write(&gmac_dev, (uint8_t *)eth_buffer, frm_size, NULL);

通过该函数即可使用GMAC发送数据,第4个参数是发送完成后的回调函数。该回调函数时是在gmac_handler()中被调用的。


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
换一批
延伸阅读

特朗普集团近日取消了其新推出的T1智能手机“将在美国制造”的宣传标语,此举源于外界对这款手机能否以当前定价在美国本土生产的质疑。

关键字: 特朗普 苹果 AI

美国总统特朗普在公开场合表示,他已要求苹果公司CEO蒂姆·库克停止在印度建厂,矛头直指该公司生产多元化的计划。

关键字: 特朗普 苹果 AI

4月10日消息,据媒体报道,美国总统特朗普宣布,美国对部分贸易伙伴暂停90天执行新关税政策,同时对中国的关税提高到125%,该消息公布后苹果股价飙升了15%。这次反弹使苹果市值增加了4000多亿美元,目前苹果市值接近3万...

关键字: 特朗普 AI 人工智能 特斯拉

3月25日消息,据报道,当地时间3月20日,美国总统特朗普在社交媒体平台“真实社交”上发文写道:“那些被抓到破坏特斯拉的人,将有很大可能被判入狱长达20年,这包括资助(破坏特斯拉汽车)者,我们正在寻找你。”

关键字: 特朗普 AI 人工智能 特斯拉

1月22日消息,刚刚,新任美国总统特朗普放出重磅消息,将全力支持美国AI发展。

关键字: 特朗普 AI 人工智能

特朗普先生有两件事一定会载入史册,一个是筑墙,一个是挖坑。在美墨边境筑墙的口号确保边境安全,降低因非法移民引起的犯罪率过高问题;在中美科技产业之间挖坑的口号也是安全,美国企业不得使用对美国国家安全构成威胁的电信设备,总统...

关键字: 特朗普 孤立主义 科技产业

据路透社1月17日消息显示,知情人士透露,特朗普已通知英特尔、铠侠在内的几家华为供应商,将要撤销其对华为的出货的部分许可证,同时将拒绝其他数十个向华为供货的申请。据透露,共有4家公司的8份许可被撤销。另外,相关公司收到撤...

关键字: 华为 芯片 特朗普

曾在2018年时被美国总统特朗普称作“世界第八奇迹”的富士康集团在美国威斯康星州投资建设的LCD显示屏工厂项目,如今却因为富士康将项目大幅缩水并拒绝签订新的合同而陷入了僵局。这也导致富士康无法从当地政府那里获得约40亿美...

关键字: 特朗普 富士康

今年5月,因自己发布的推文被贴上“无确凿依据”标签而与推特发生激烈争执后,美国总统特朗普签署了一项行政令,下令要求重审《通信规范法》第230条。

关键字: 谷歌 facebook 特朗普

众所周知,寄往白宫的所有邮件在到达白宫之前都会在他地进行分类和筛选。9月19日,根据美国相关执法官员的通报,本周早些时候,执法人员截获了一个寄给特朗普总统的包裹,该包裹内包含蓖麻毒蛋白。

关键字: 美国 白宫 特朗普
关闭