2416开发板上网卡芯片lan9220的时序配置问题
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的时序配置问题相关推荐
- 02 QEMU默认支持的所有开发板、芯片列表
QEMU默认支持的所有开发板.芯片列表 作者 日期 将狼才鲸 2021-11-12 所属的Gitee源码和工程地址:才鲸嵌入式 / 开源安防摄像机(嵌入式软件) 一.QEMU相关文档 QEMU官方文档 ...
- X210开发板(S5PV210芯片)uboot移植DM9000驱动移植
前言 本文是介绍在uboot中如何移植DM9000的驱动,并不深入去讲解DM9000芯片的操作时序和内部寄存器,想要读懂驱动代码要仔细阅读DM9000芯片的数据手册.移植的基础是手里有DM9000芯片 ...
- 用stm32开发时是直接买现成的开发板还是芯片?开发板学习,芯片硬件设计
视情况而言,买开发板用于评估和学习,然后买芯片做硬件设计 开发板 开发板上手即可使用,并附带很多模块. 拿到开发板后即可直接根据开发板提供的原理图进行程序编写,学习. 优点:简单快捷,上手快,拿到手就 ...
- linux开发板最好芯片,既然是中国十大最有影响力的芯片之一 一定要有个好开发板...
原标题:既然是中国十大最有影响力的芯片之一 一定要有个好开发板 要评选中国影响力十大芯片,ESP8266必在其中.虽然开发文档有些混乱,各种生态纷杂,但它的低价,给了开发者更低门槛,也让更多人都参与到 ...
- Linux字符型驱动开发—基于友善之臂2416开发板
驱动程序(Device Driver)是一种可以使计算机和设备通信的特殊程序,相当于内核和硬件之间的接口,操作系统只能通过这个接口,才能控制硬件设备的工作.驱动程序接受上层软件(应用程序.内核)的请求 ...
- 【AT91SAM7X-EK开发板】芯片的加密与解除加密
前言 [AT91SAM7X-EK开发板]板载AT91SAM7X256,这个芯片,可以烧写加密字节,防止通过JTAG,回读烧写的程序文件. AT91SAM9X256,芯片加密后,芯片可以连接,但无法通过 ...
- arduinopn532模块_NFC开发板/nfc芯片标签/PN532开发板/RFID读卡器/NFC模块/Arduino
带40 kB ROM和1 kB RAM的80C51微控制器内核 高度集成的模拟电路,解调和译码响应 输出缓冲驱动器通过非常少量的外部无源器件连接天线 集成了RF场检测器 集成了数据模式检测器 支持IS ...
- i.MX8芯片介绍(米尔电子iMX8系列核心板及开发板学习笔记)
众所周知,NXP公司推出iMX8芯片已有很长一段时间.iMX8系列家族也越来越多,目前有iMX8 .iMX8M.iMX8M Mini.i.MX8M Nano4款芯片应用处理器.近期对米尔电子iMX8系 ...
- 嵌入式开发,从开发板到产品的过程是什么样的?
始终搞不懂,比如在51单片机.AVR或者树莓派等等的单片机开发板上开发出一套系统之后,怎样进一步发展成为一个具体产品的?这个过程是什么样子的? 举个例子说:我在51单片机上完成了一个四轴飞行器,那我总 ...
最新文章
- 使用TypeScript映射和条件类型使React组件更出色
- 汇编语言的div指令 ax dx bx
- new Date() 在 ie 浏览器中兼容性的问题
- 面试--js实现继承的几种方式
- mysql5717开发设置怎么调回来_MYSQL5.7.17设置初始密码(转)
- Nginx 从零搭建
- 蓝牙管理软件_Mac蓝牙检测软件----BlueSense
- 第十一次个人例行报告
- DPDK 内存池rte_mempool实现(二十三)
- A.DongDong破密码
- boost::mp11::mp_defer相关用法的测试程序
- 《剑指offer》非递归法判定二叉树是否是对称的
- 车辆姿态相关的传感器概述
- 没错,Java 人的下半场才刚开始!
- MySQL5.7默认打开ONLY_FULL_GROUP_BY模式问题与解决方案
- Linux命令备忘实例——排序和基本统计命令
- android环信退出登录,环信退出登陆的的问题
- 离散数学与计算机的发展,计算机学科发展中离散数学的作用与运用
- AppScan介绍和安装
- Linux快速入门之 内存映射、共享内存(12)