ADI Blackfin DSP处理器-BF533的开发详解19:LAN的网口设计

news2024/12/27 10:50:44

硬件准备

ADSP-EDU-BF533:BF533开发板
AD-HP530ICE:ADI DSP仿真器

软件准备

Visual DSP++软件

硬件链接

在这里插入图片描述

功能介绍

BF533说实话用来做LAN的应用有些许勉强,因为他自己不带网口,要做的话,需要在总线上挂,那么真实来讲,我何不直接用一个自带网口的DSP呢?比如BF537?BF548?BF609?因为我在做BF533的项目的时候,其他的DSP都还没有推出,ADI没有什么带网口的DSP,所以强行用533+一个DM9000来实现的,当下如果让我再去做这个方案的设计,芯片选型会有更多的选择。

20年前那会,我们真的是没条件也得创造条件。。。

这个程序只是打通了底层的硬件链路,并没有去写怎么移植TCP/IP协议的,后面有时间我再单独开一章,好好说一说怎么在嵌入式DSP上去移植TCP/IP协议。

ADSP-EDU-BF533开发板上的网卡模块采用 DM9000EP 实现, DM9000EP 为 DAVICOM 公司生产的网络芯片,它集成了网卡的 MAC 和 PHY,支持 10M/100M 速度。支持 16Bit/32Bit 总线访问带宽。

ADSP-BF533 通过 EBIU 总线采用 16Bit 总线方式与 DM9000EP 连接,其映射地址为 ADSP-BF53x 的 BANK2地址,其映射寄存器如下:

DM9000_PPTR 寄存器(写唯一):
DM9000_PPTRT 寄存器地址:0x20200000
DM9000_PPTR 寄存器是 DM9000EP 的指令寄存器,用于为 DM9000EP 写入指令。
DM9000_PDATA 寄存器(读写):
DM9000_PDATA 寄存器地址:0x20200020
DM9000_PDATA 寄存器是 DM9000EP 的数据寄存器,通过该寄存器读取和发送数据包。

硬件连接示意图

在这里插入图片描述

代码实现功能

代码实现了通过网络接口发送数据包的功能,没有包含任何网络协议。通过网线与计算机连接,使用计算机上的抓包工具,抓取数据包可以查看数据包的数据内容。

调试步骤

  1. 将仿真器(ICE)与 ADSP-EDU-BF53x 开发板和计算机连接好。
  2. 先给 ADSP-EDU-BF53x 开发板上电,再为仿真器(ICE)上电。
  3. 将交叉网线连接于计算机网口和开发板网口。
  4. 运行 VisualDSP++ 5.0 软件,选择合适的 BF533 的 session 将仿真器与软件连接。
  5. 加载 VisualDSP++ 5.0 工程文件 BF53x_LAN.dpj,编译并全速运行。
  6. 运行抓包软件 Commview.exe,通过软件抓取网卡发送的数据包。

通过抓包软件 Commview.exe 的 Pack 窗口可以看到抓取的数据包的数据信息。

在这里插入图片描述

计算机端打印的网卡信息

在这里插入图片描述

使用 COMMVIEW 软件抓取的数据包信息。

程序源码

#include <cdefbf533.h>
#include “dm9000e.h”

#define CONFIG_DRIVER_DM9000
#define CONFIG_COMMANDS 1
#define CFG_CMD_NET 1
#ifdef CONFIG_DRIVER_DM9000
#if (CONFIG_COMMANDS & CFG_CMD_NET)
#define PKTALIGN 32
#define PKTSIZE_ALIGN 1536
#define CFG_HZ 1000

#define DM9000_VID_L 0x28
#define DM9000_VID_H 0x29
#define DM9000_PID_L 0x2A
#define DM9000_PID_H 0x2B
#define DM9000_ID 0x90000A46
#define DM9000_int32_MII 0x00
#define DM9000_10MHD 0x1
#define DM9000_10MFD 0x2
#define DM9000_100MHD 0x3
#define DM9000_100MFD 0x4
#define LOOP_MAC 0x1
#define LOOP_PHY100M 0x2

unsigned short NetRxPackets[PKTSIZE_ALIGN+PKTALIGN];
unsigned char env_enetaddr[6];

#define DM9000_PPTR *(volatile unsigned short *)(0x20200000)
#define DM9000_PDATA *(volatile unsigned short *)(0x20200020)

/****************************************************************************

  • 名称 : GetDM9000ID

  • 功能 : 读取DM9000E ID并打印

  • 入口参数 :无

  • 出口参数 :id_val ID值
    ****************************************************************************/
    unsigned int GetDM9000ID(void)
    {
    unsigned int id_val;

    id_val = ior(DM9000_PID_H);
    printf(“DM9000E ID is %x”,id_val);
    id_val = ior(DM9000_PID_L);
    printf(“%x”,id_val);
    id_val = ior(DM9000_VID_H);
    printf(“%x”,id_val);
    id_val = ior(DM9000_VID_L);
    printf(" %x\n\r",id_val);
    return id_val;
    }
    /****************************************************************************

  • 名称 : iow

  • 功能 : 将值写入指定的寄存器

  • 入口参数 :reg,value

  • 出口参数 :无
    /
    static void iow(int reg, unsigned char value)
    {
    DM9000_PPTR = reg;
    asm(“ssync;”);
    asm(“ssync;”);
    asm(“ssync;”);
    DM9000_PDATA = value & 0xff;
    asm(“ssync;”);
    asm(“ssync;”);
    asm(“ssync;”);
    }
    /

  • 名称 : ior

  • 功能 : 送入要读取的寄存器地址返回当前寄存器值

  • 入口参数 :reg

  • 出口参数 :DM9000_PDATA & 0xff
    /
    static unsigned char ior(int reg)
    {
    DM9000_PPTR = reg;
    asm(“ssync;”);
    asm(“ssync;”);
    asm(“ssync;”);
    return DM9000_PDATA & 0xff;
    }
    /

  • 名称 : eth_reset

  • 功能 : 复位,初始化dm9000E并打印相关设置

  • 入口参数 :无

  • 出口参数 :无
    ****************************************************************************/
    void eth_reset (void)
    {
    int IoMode;
    unsigned char tmp;

    iow(0, 1); // 复位
    delay(50); // delay 100us
    IoMode = ior(0xfe) >> 6; //读取io模式
    if(!IoMode)
    printf(“DM9000 work in 16 bus width\r\n”);
    else if(IoMode == 2)
    printf(“DM9000 work in 8 bus width\r\n”);
    else if(IoMode == 1)
    printf(“DM9000 work in 32 bus width\r\n”);
    else
    printf(“DM9000 work in wrong bus width, error\r\n”);
    iow(0x1e, 0x01);
    iow(0x1f, 0x00); // 使能 PHY
    iow(0xff, 0x80);
    iow(0x01, 0xc); // 清除 TX 状态
    iow(0x5, 0x33); // 使能 RX
    ior(0x6);
    iow(0x2, 1); // 使能TX
    delay(100);
    IoMode = ior(0x01);
    if(IoMode & 0x40)
    printf(“Link on ethernet at:%d Mbps\r\n”, (IoMode & 0x80) ? 10:100);

}
/****************************************************************************

  • 名称 : eth_rx

  • 功能 : 读取网络传输数据

  • 入口参数 :addr

  • 出口参数 :rxlen
    ****************************************************************************/
    int eth_rx (unsigned short *addr)
    {
    int i;
    unsigned short rxlen;
    unsigned short status;
    unsigned char RxRead;
    unsigned char *tmp;

    RxRead = ior(0xf0);
    RxRead = (DM9000_PDATA) & 0xff;
    RxRead = (DM9000_PDATA) & 0xff;
    if (RxRead != 1)
    return 0;
    status = ior(0xf2);//获得状态
    rxlen = DM9000_PDATA; //获得长度
    asm(“ssync;”);
    if (rxlen > PKTSIZE_ALIGN + PKTALIGN)
    printf (“packet too big! %d %d\r\n”, rxlen, PKTSIZE_ALIGN + PKTALIGN);
    for ( i =0; i<rxlen/2;i++)
    addr[i] = DM9000_PDATA;
    asm(“ssync;”);
    return rxlen;
    }

unsigned char txCmd;
/****************************************************************************

  • 名称 : eth_send

  • 功能 : 向网络发送数据包

  • 入口参数 :packet,length

  • 出口参数 :0
    ****************************************************************************/
    void eth_send (volatile void *packet, int length)
    {
    int i;
    volatile unsigned short *addr;
    int tmo;
    unsigned char TxStatus;
    int length1 = length>>1;
    int IoMode;

    TxStatus = ior(0x01);
    TxStatus = TxStatus & 0xc;

    DM9000_PPTR = 0xf8;
    for(i=0;i<2;i++) //延时匹配时序。
    asm(“ssync;”);

    for (addr = packet; length1 > 0; length1 --)
    {
    DM9000_PDATA = *addr++;
    for(i=0;i<3;i++) //延时匹配84nS延时时序。
    asm(“ssync;”);

    }
    iow(0xfd, (length >> 8) & 0xff); //set transmit leng
    iow(0xfc, length & 0xff);
    /* start transmit */
    iow(0x02, txCmd|0x1);

    return 0;
    }

/****************************************************************************

  • 名称 : phy_read

  • 功能 : 读取DM9000E物理寄存器

  • 入口参数 :reg

  • 出口参数 :( ior( 0xe) << 8 ) | ior( 0xd)
    /
    static unsigned short phy_read(int reg)
    {
    iow( 0xc, DM9000_PHY | reg);
    iow( 0xb, 0xc);
    delay(100);
    iow(0xb, 0x0);
    return ( ior( 0xe) << 8 ) | ior( 0xd);
    }
    /

  • 名称 : phy_write

  • 功能 : 写DM9000E物理寄存器

  • 入口参数 :reg,value

  • 出口参数 :无
    /
    static void phy_write( int reg, unsigned short value)
    {
    iow( 0xc, DM9000_PHY | reg);
    iow( 0xd, (value & 0xff));
    iow(0xe, ( (value >> 8) & 0xff));
    iow(0xb, 0xa);
    delay(100);
    iow(0xb, 0x0);
    }
    /

  • 名称 : set_PHY_mode

  • 功能 : 设置网卡工作模式 10M:100M

  • 入口参数 :op_mode

  • 出口参数 :无
    ****************************************************************************/
    static void set_PHY_mode(op_mode)
    {
    int phy_reg4,phy_reg0;
    switch(op_mode)
    {
    case DM9000_10MHD:
    phy_reg4 = 0x21;
    asm(“ssync;”);
    phy_reg0 = 0x0000;
    asm(“ssync;”);
    break;
    case DM9000_10MFD:
    phy_reg4 = 0x41;
    asm(“ssync;”);
    phy_reg0 = 0x1100;
    asm(“ssync;”);
    break;
    case DM9000_100MHD:
    phy_reg4 = 0x81;
    asm(“ssync;”);
    phy_reg0 = 0x2000;
    asm(“ssync;”);
    break;
    case DM9000_100MFD:
    phy_reg4 = 0x101;
    asm(“ssync;”);
    phy_reg0 = 0x3100;
    asm(“ssync;”);
    break;
    } // end of switch
    phy_write( 0, phy_reg0);

    phy_write( 4, 0x0400|phy_reg4);
    }
    /****************************************************************************

  • 名称 : loopback

  • 功能 : 网卡环路测试,设置网卡工作于何种环路测试模式

  • 入口参数 :mode

  • 出口参数 :无
    ****************************************************************************/
    void loopback(int mode)
    {
    switch(mode)
    {
    case LOOP_MAC:
    iow(DM9000_NCR, 0x02);
    phy_write( 0, 0x40);
    break;
    case LOOP_PHY100M:
    iow(DM9000_NCR, 0x04);
    phy_write( 0, 0x40);
    break;
    }
    }

#endif
#endif

unsigned short pack[1024];
unsigned short packLen=0;

void main()
{
int i;

Set_PLL(16,4);	
Init_EBIU();
Init_SDRAM(); 
GetDM9000ID();		
set_PHY_mode(DM9000_100MHD);
eth_reset();
delay(100);   
for(i=0;i<1024;i++)
	pack[i] = i;
while(1)
{  
	for(i=0;i<1000000;i++)
	{
		packLen = 512; 	
		eth_send(pack,packLen);
	} 	
	eth_rx(NetRxPackets);      	    	  	
}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/77176.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

彻底搞懂ESLint与Prettier在vscode中的代码自动格式化

前言 前端代码格式化社区提供了两种比较常用的工具ESLint和Prettier&#xff0c;他们分别提供了对应的vscode的插件&#xff0c;二者在代码格式化方面有重叠的部分&#xff0c;规则不一致时会导致冲突。vscode作为前端开发编辑器已经越来越普遍了&#xff0c;这需要开发者在vs…

ChatGPT与搜索引擎合体,谷歌都不香了,LeCun转发|在线可玩

Alex Pine 发自 凹非寺量子位 | 公众号 QbitAI见惯了列表式搜索引擎&#xff0c;你有没有想过给它换种画风&#xff1f;有人脑洞大开&#xff0c;把艳惊四座的ChatGPT和必应搜索结合起来&#xff0c;搞出了一个智能搜索引擎&#xff1a;既有ChatGPT式的问答&#xff0c;又像普通…

VS——路径说明

$(TargetDir)输出目标的路径 $(TargetPath) 输出文件.exe的路径 $(TargetName) 项目名字 $(TargetFileName) 输出的.exe的名字 $(TargetExt) 文件的扩展名 $(ProjectDir)工程目录 目录根据下面的文件来的 $(IntDir)获取中间文件 $(OutDir)文件输出路径 $(Solu…

神马操作Kafka 竟宣布弃用 Java 8

Kafka 3.0.0 发布了&#xff1a; ​ 编辑切换为居中 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 主要更新如下&#xff1a; The deprecation of support for Java 8 and Scala 2.12 Kafka Raft support for snapshots of the metadata topic and ot…

ADI Blackfin DSP处理器-BF533的开发详解15:RS232串口的实现(含源代码)

硬件准备 ADSP-EDU-BF533&#xff1a;BF533开发板 AD-HP530ICE&#xff1a;ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 实现原理 ADSP-EDU-BF533 开发板上设计了一个 RS232 接口&#xff0c;该接口通过 ADSP-BF53x 上的 UART 接口&#xff0c;扩展 RS232协议的芯片实…

Java学习之Object类——equals方法

Object 类是类层次结构的根类。每个类都使用 Object 作为超类。所有对象&#xff08;包括数组&#xff09;都实现这个类的方法&#xff0c;学习Object 类的六个方法——equals(Object obj)、finalize、toString、hashCode、getClass、clone 目录 和equals的对比 一、的作用 …

ChatGPT惊人语录大赏

文 | 智商掉了一地这几天ChatGPT实在太火了&#xff0c;笔者的朋友圈已经被ChatGPT的各种金句刷屏了&#xff0c;实在忍不住整理下来&#xff0c;分享给大家。ChatGPT惊人语录1&#xff1a;建议娶奶奶为妻注&#xff1a;贾母是贾宝玉的奶奶ChatGPT惊人语录2&#xff1a;角色扮演…

【allegro 17.4软件操作保姆级教程十】文件输出

目录 1.1添加光绘层叠 1.1.1添加线路层 1.1.2添加表底阻焊层 1.1.3添加表底钢网层 1.1.4添加表底丝印层 1.1.5添加钻孔层 ​1.2输出文件 1.2.1输出光绘文件 1.2.2输出钻孔文件 1.2.3输出坐标文件 1.2.4输出文件打包 1.1添加光绘层叠 在输出文件之前需要先添加光绘层…

PyTorch中学习率调度器可视化介绍

神经网络有许多影响模型性能的超参数。一个最基本的超参数是学习率(LR)&#xff0c;它决定了在训练步骤之间模型权重的变化程度。在最简单的情况下&#xff0c;LR值是0到1之间的固定值。 选择正确的LR值是具有挑战性。一方面较大的学习率有助于算法快速收敛&#xff0c;但它也…

【车载开发系列】UDS诊断---输入输出控制($0x2F)

【车载开发系列】UDS诊断—输入输出控制&#xff08;$0x2F&#xff09; UDS诊断---输入输出控制&#xff08;$0x2F&#xff09;【车载开发系列】UDS诊断---输入输出控制&#xff08;$0x2F&#xff09;一.概念定义1&#xff09;与0x31例程控制服务的关系2&#xff09;与0x22读取…

数据传送类指令(PUSH,POP,LEA)

目录 数据传送类指令 堆栈的概念&#xff1a; 进栈指令 &#xff08;PUSH&#xff09; 出栈指令&#xff08;POP&#xff09; 练习 LEA取偏移地址&#xff08;有效地址EA&#xff09;指令&#xff08;去括号&#xff09; LEA和OFFSET区别&#xff1a; 用法注意 LEA和MO…

微服务框架 SpringCloud微服务架构 微服务保护 31 限流规则 31.6 热点参数限流

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 微服务保护 文章目录微服务框架微服务保护31 限流规则31.6 热点参数限流31.6.1 热点参数限流31.6.2 案例31 限流规则 31.6 热点参数限流 3…

【代码审计-.NET】基于.NET框架开发的基本特征

目录 一、.NET基本架构 1、基本构成 2、可支持语言 3、封装 4、文件 5、指向解析 6、安全认证 二、工具 1、ILSpyi 2、dnSpy 3、Reflector &#xff08;网上找的一张图谱&#xff09; 本博客只面向讲安全相关内容 一、.NET基本架构 1、基本构成 可支持语言&#xf…

web shell控制目标

文章目录一、封神台五1、为什么提权2、如何寻找exp3、使用exp提权一、封神台五 1、为什么提权 进入目标机器后权限可能不够导致无法执行高权限操作 右键地址进入终端 发现没有操作权限 提权原理&#xff1a;借助高权限的进程执行我们的指令 2、如何寻找exp 什么是exp&a…

【MOSMA】基于粘菌算法求解多目标优化问题附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

【Java版oj】day02倒置字符串

目录 一、原题再现 二、问题分析 三、完整代码 一、原题再现 倒置字符串_牛客题霸_牛客网 描述 将一句话的单词进行倒置&#xff0c;标点不倒置。比如 I like beijing. 经过函数后变为&#xff1a;beijing. like I 输入描述&#xff1a; 每个测试输入包含1个测试用例&#x…

web前端期末大作业 html+css+javascript+jquery+bootstarp响应式鲜花售卖网站16页

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

最新最全面的Java面试题及答案(212道)

文章目录一. Java 基础1. JDK 和 JRE 有什么区别&#xff1f;2. 和 equals 的区别是什么&#xff1f;3. 两个对象的 hashCode() 相同&#xff0c;则equals() 也一定为true&#xff0c;对吗&#xff1f;4. final 在 Java 中有什么作用&#xff1f;5. Java 中的 Math. round(-1.…

【图像分割】基于Kmean聚类 分水岭、oust、粒子群算法优化脂肪肝图像分割附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

OPT(奥普特)工控机新品上市,产品矩阵再扩大

近日&#xff0c;OPT&#xff08;奥普特&#xff09;发布工控机新品&#xff0c;进一步扩展产品矩阵&#xff0c;为制造业数字化转型提供更为全面的机器视觉产品和服务。 OPT&#xff08;奥普特&#xff09;上市的工控机共有两大系列&#xff0c;分别是3U桌面式和4U上架式的设…