2416开发板上网卡芯片lan9220的时序配置问题

最近在学习某品牌的2416(不好评论)开发板,其他都还好,就这个网卡把我折磨得够呛。lan9220这款网卡芯片功能极其强大,能耗控制,远程唤醒,高度集成PHY与MAC, 10Mbps/100Mbps等,但是建议各位在非极端情况下不要采用此款芯片,至少在与2416搭配时不要采用此芯片。

发现的硬伤(2416与lan9220搭配时),未在其他开发板上测试,仅供参考:

现象1:lan9220触发的中断信号使用2416的GPG7,外部中断15,当我们采用下降沿进行触发时,会出现抖动,造成触发2次中断,2次中断还特别怪异,第一次外部中断状态置1,内部中断PND与SRC都置1,当我们清除后,第二次进入中断,只有内部中断PND与SRC置1,外部中断状态全0.(这个与朋友讨论结论:有可能是2416的电源没有保护好,不管了,反正我们搞软件的)。(注:此时我们仅开通了内部中断5管理的外部中断15,其他的8到14全部关闭状态中。

现象2:当使能发送时(TX_EN),如果再次使能接受使能(RX_EN),TX_EN的使能会被错误的关闭。

现象3:HBI层的寄存器能正常访问,MAC层的寄存器组,对MAC_CSR_CMD的写必须使用busy mode(使用说明没提到),PHY层的寄存器组反应速度比较慢,这也是我今天要说明的东西。

首先在lan9220的手册上提到的一些时序问题,我们就不再这里讨论了,我们来说说他漏掉的一些时序问题。

因为lan9220的mac层与phy层的寄存器是不能直接被访问的,都是逐级调用寄存器来进行来访问的,但我对mac进行按照说明书上的步骤进行访问时出现一个现象是:

本来phy_id1的默认值是7  id2默认值是c0c3的,但是他们都被错误的读取了。我的程序如下:

static unsigned long HBI_read(unsigned char offset)

{

return __REG(LAN9220_BASEADDR | (offset & 0xFF));

}

static void HBI_write(unsigned char offset, unsigned long value)

{

__REG(LAN9220_BASEADDR | (offset & 0xFF)) = (RAW_U32)value;

}

static unsigned long mac_read(unsigned int index)

{

unsigned long reg = 0;

while (HBI_read(MAC_CSR_CMD) & (0x1 << 31)) {

delay(1);

}

HBI_write(MAC_CSR_CMD, (0x1 << 31) | (0x1 << 30) | (index & 0xFF));

reg = HBI_read(MAC_CSR_DATA);

while (HBI_read(MAC_CSR_CMD) & (0x1 << 31)) {

delay(1);

}

return reg;

}

static void mac_write(unsigned int index, unsigned long value)

{

while (HBI_read(MAC_CSR_CMD) & (0x1 << 31)) {

delay(1);

}

HBI_write(MAC_CSR_DATA, value);

HBI_write(MAC_CSR_CMD, (0x1 << 31) | (index & 0xFF));

while (HBI_read(MAC_CSR_CMD) & (0x1 << 31)) {

delay(1);

}

}

static unsigned long phy_read(unsigned int index)

{

unsigned short reg = 0;

while (mac_read(MII_ACC) & 0x1);

mac_write(MII_ACC, (0x1) | (index << 6) | (0x01 << 11));

reg = mac_read(MII_DATA) & 0xFFFF;

while (mac_read(MII_ACC) & 0x1);

return reg;

}

static void phy_write(unsigned int index, unsigned short value)

{

while (mac_read(MII_ACC) & 0x1);

mac_write(MII_DATA, (unsigned long)(value & 0xFFFF));

mac_write(MII_ACC, (0x1) | (0x1 << 1) | (index << 6) | (0x01 << 11));

while (mac_read(MII_ACC) & 0x1);

}

static void delay(int cnt)

{

while (cnt--)

{

HBI_read(BYTE_TEST);

}

}

但我对mac_read/mac_write进行debug时,添加打印信息,缺又偶然的得到了正确的反馈信息,说明对phy层寄存器的操作需要添加一定延时,来满足寄存器相应。大概流程如下:

DATA---》delay--->cmd--->wait for complete

写操作

Cmd--->delay----->data---->delay---->wait for complete

读操作

注意,在这2组操作之间也需要一定的延时来插入。

大概就这样吧。

转载于:https://blog.51cto.com/qingluo/1178466

2416开发板上网卡芯片lan9220的时序配置问题相关推荐

  1. 02 QEMU默认支持的所有开发板、芯片列表

    QEMU默认支持的所有开发板.芯片列表 作者 日期 将狼才鲸 2021-11-12 所属的Gitee源码和工程地址:才鲸嵌入式 / 开源安防摄像机(嵌入式软件) 一.QEMU相关文档 QEMU官方文档 ...

  2. X210开发板(S5PV210芯片)uboot移植DM9000驱动移植

    前言 本文是介绍在uboot中如何移植DM9000的驱动,并不深入去讲解DM9000芯片的操作时序和内部寄存器,想要读懂驱动代码要仔细阅读DM9000芯片的数据手册.移植的基础是手里有DM9000芯片 ...

  3. 用stm32开发时是直接买现成的开发板还是芯片?开发板学习,芯片硬件设计

    视情况而言,买开发板用于评估和学习,然后买芯片做硬件设计 开发板 开发板上手即可使用,并附带很多模块. 拿到开发板后即可直接根据开发板提供的原理图进行程序编写,学习. 优点:简单快捷,上手快,拿到手就 ...

  4. linux开发板最好芯片,既然是中国十大最有影响力的芯片之一 一定要有个好开发板...

    原标题:既然是中国十大最有影响力的芯片之一 一定要有个好开发板 要评选中国影响力十大芯片,ESP8266必在其中.虽然开发文档有些混乱,各种生态纷杂,但它的低价,给了开发者更低门槛,也让更多人都参与到 ...

  5. Linux字符型驱动开发—基于友善之臂2416开发板

    驱动程序(Device Driver)是一种可以使计算机和设备通信的特殊程序,相当于内核和硬件之间的接口,操作系统只能通过这个接口,才能控制硬件设备的工作.驱动程序接受上层软件(应用程序.内核)的请求 ...

  6. 【AT91SAM7X-EK开发板】芯片的加密与解除加密

    前言 [AT91SAM7X-EK开发板]板载AT91SAM7X256,这个芯片,可以烧写加密字节,防止通过JTAG,回读烧写的程序文件. AT91SAM9X256,芯片加密后,芯片可以连接,但无法通过 ...

  7. arduinopn532模块_NFC开发板/nfc芯片标签/PN532开发板/RFID读卡器/NFC模块/Arduino

    带40 kB ROM和1 kB RAM的80C51微控制器内核 高度集成的模拟电路,解调和译码响应 输出缓冲驱动器通过非常少量的外部无源器件连接天线 集成了RF场检测器 集成了数据模式检测器 支持IS ...

  8. i.MX8芯片介绍(米尔电子iMX8系列核心板及开发板学习笔记)

    众所周知,NXP公司推出iMX8芯片已有很长一段时间.iMX8系列家族也越来越多,目前有iMX8 .iMX8M.iMX8M Mini.i.MX8M Nano4款芯片应用处理器.近期对米尔电子iMX8系 ...

  9. 嵌入式开发,从开发板到产品的过程是什么样的?

    始终搞不懂,比如在51单片机.AVR或者树莓派等等的单片机开发板上开发出一套系统之后,怎样进一步发展成为一个具体产品的?这个过程是什么样子的? 举个例子说:我在51单片机上完成了一个四轴飞行器,那我总 ...

最新文章

  1. 使用TypeScript映射和条件类型使React组件更出色
  2. 汇编语言的div指令 ax dx bx
  3. new Date() 在 ie 浏览器中兼容性的问题
  4. 面试--js实现继承的几种方式
  5. mysql5717开发设置怎么调回来_MYSQL5.7.17设置初始密码(转)
  6. Nginx 从零搭建
  7. 蓝牙管理软件_Mac蓝牙检测软件----BlueSense
  8. 第十一次个人例行报告
  9. DPDK 内存池rte_mempool实现(二十三)
  10. A.DongDong破密码
  11. boost::mp11::mp_defer相关用法的测试程序
  12. 《剑指offer》非递归法判定二叉树是否是对称的
  13. 车辆姿态相关的传感器概述
  14. 没错,Java 人的下半场才刚开始!
  15. MySQL5.7默认打开ONLY_FULL_GROUP_BY模式问题与解决方案
  16. Linux命令备忘实例——排序和基本统计命令
  17. android环信退出登录,环信退出登陆的的问题
  18. 离散数学与计算机的发展,计算机学科发展中离散数学的作用与运用
  19. AppScan介绍和安装
  20. Linux快速入门之 内存映射、共享内存(12)

热门文章

  1. matlab fig格式图片转化为png格式
  2. 完美设置“Word表格中文字上下居中”
  3. Vivado中Debug的用法总结
  4. 【 Vivado 】时钟组(Clock Groups)
  5. 【 C 】队列 简记
  6. RabbitMQ核心概念
  7. 7系列高速收发器总结 GTP IP核使用篇
  8. android 自定义控件TextInputSelectBox用法
  9. leetcode 二分查找 Search in Rotated Sorted ArrayII
  10. 踩到一个Emit的坑,留个纪念