FSL_FSL_chao 发表于 2015-2-12 15:01:26

K60和K64的ENET模块的差异

本帖最后由 FSL_FSL_chao 于 2015-2-12 15:01 编辑

最近,在 帮一个客户把他购买的Segger公司的embOS从K60移植到K64上。就在移植的过程中,发现在K60上能正常工作的ENET驱动程序到K64上却不能工作。然而,FSL官方的驱动程序(KSDK1.1)既能在K60上运行,也能在K64上运行,我们也没有看到专门的文档说明K60和K64的同种外设模块之间的差异。那么,究竟是什么原因导致embOS的ENET驱动程序在K64上不能正常运行呢?
经过对程序进行跟踪调试,并且反复比较embOS的驱动程序和FSL官方的驱动程序,以及逐字逐句地研究数据手册,终于发现:原来K64的ENET模块并非完全照搬K60的,而是缩减了一些功能,具体的有两点差异,说明如下:
1.        K60的ENET模块既支持小端模式(little endian),也支持大端模式(big endian),它可以通过寄存器ENET_ECR中的DBSWP位来进行设置;

        而K64的只能支持小端模式,虽然它的寄存器ENET_ECR中也有DBSWP位,但是这一位必须设置为“1”,手册上原文如下:

        另外,在K64的ENET模块介绍中,也多次这样提示只支持小端模式。

问题小结:FSL的官方驱动程序设置的是小端模式,所以在K60和K64上都能正常运行;而embOS的驱动程序设置的是大端模式(大概是为了跟K60的早期版本兼容吧,因为早期版本没有DBSWP位,只能支持大端模式),所以在K64上就不能工作了。

2.       K60的发送数据缓冲区的起始地址虽然在手册上写的是必须按8字节对齐(原文如下),但是实际调试时发现不对齐也能工作;而K64的却是“说到做到”了,不对齐就不干活了。(从以下两者描述中,也能看到大小端模式的不同)

       K60发送缓冲区的起始地址描述

        K64发送缓冲区的起始地址描述
问题小结:embOS的驱动程序(准确地说应该是IP协议栈,因为发送数据缓冲区的指针是从上层传递给ENET驱动程序的)在设计的时候可能忽略了这个要求,所以它虽然在K60上能正常工作,但是一到“较真”的K64上就不行了。

by Zhiqiang Fu(b17589@freescale.com)---IMM FAE China


daicp 发表于 2015-3-7 16:44:36

大赞                  

lileistone 发表于 2015-3-7 18:57:56

听说K64和K60的SPI模块也有少许差异,请问是否属实?如果是,可否也帮忙总结一下?

powerk6 发表于 2015-3-20 02:54:18

不错,学习了

jinyi7016 发表于 2015-3-21 23:32:44

还有这差异啊,学习了
页: [1]
查看完整版本: K60和K64的ENET模块的差异