登录 免费注册 首页 | 行业黑名单 | 帮助
维库电子市场网
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统
驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe

RTL8019AS芯片MAC地址设置总是不对

作者:zhan_cl 栏目:ARM技术
RTL8019AS芯片MAC地址设置总是不对
我想把RTL8019AS芯片的MAC地址设置为:52 54 4c 19 f7 42,和周工给出的例子的MAC地址是一样的,但我从PAR0-PAR5读出来的值却是00 54 00 19 00 42,不知道是和原因,希望各位dx给小弟分析分析。
我的代码如下:
rtl8019as.c

#include  "rtl8019as.h"

/********************************************************************************
*
* 名称:WrtieToRTL8019AS
*
* 功能:往RTL8019AS的寄存器写入数据
*
* 入口参数:Addr:寄存器地址
*          
*           Data:数据
*
* 出口参数: 无
*
* 全局变量: 无
*
* 调用模块: 无
*
********************************************************************************/
void  WriteToRTL8019AS(INT8U Addr, INT16U Data)
{
    (*((volatile unsigned SHORT *) RTL8019AS_ADDR + Addr)) = Data;
}


/********************************************************************************
*
* 名称:WrtieToRTL8019AS
*
* 功能:从RTL8019AS的寄存器读出数据
*
* 入口参数:Addr:寄存器地址          
*
* 出口参数: Data:数据
*
* 全局变量: 无
*
* 调用模块: 无
*
********************************************************************************/
INT16U  ReadFromRTL8019AS(INT8U Addr)
{
    INT16U TEMP;
    
    TEMP = (*((volatile unsigned SHORT *) RTL8019AS_ADDR + Addr));
    
    return TEMP;
}


/********************************************************************************
*
* 名称:Page
*
* 功能:切换RTL8019AS中的寄存器页
*
* 入口参数:pagenumber:要切换的页          
*
* 出口参数: 无
*
* 全局变量: 无
*
* 调用模块: 无
*
********************************************************************************/
void  Page(INT8U pagenumber)
{
    INT16U TEMP;
    
    TEMP = ReadFromRTL8019AS(RTL8019AS_COMMAND_REGISTER);
    TEMP = TEMP & 0x3b;
    pagenumber = pagenumber << 6;
    TEMP = TEMP | pagenumber;
    WriteToRTL8019AS(RTL8019AS_COMMAND_REGISTER, TEMP);
}


/********************************************************************************
*
* 名称:RTL8019AS_Reset()
*
* 功能:热复位RTL8019AS芯片
*
* 入口参数:无         
*
* 出口参数: 无
*
* 全局变量: 无
*
* 调用模块: 无
*
********************************************************************************/
void  RTL8019AS_Reset(void)
{
    INT16U TEMP;
    
    TEMP = ReadFromRTL8019AS(0x1f);
    WriteToRTL8019AS(0x1f, TEMP);
    
    for(TEMP = 0; TEMP < 65535; TEMP++);
}

/********************************************************************************
*
* 名称:RTL8019AS_Init
*
* 功能:初始化RTL8019AS芯片
*
* 入口参数:无          
*
* 出口参数: 无
*
* 全局变量: 无
*
* 调用模块: 无
*
********************************************************************************/
void RTL8019AS_Init(INT8U *MACAddr)
{
    //RTL8019AS_Reset();
    WriteToRTL8019AS(RTL8019AS_COMMAND_REGISTER, 0x21);
    Page(0);
    WriteToRTL8019AS(RTL8019AS_PSTART_REGISTER, 0x4c);
    WriteToRTL8019AS(RTL8019AS_PSTOP_REGISTER, 0x80);
    WriteToRTL8019AS(RTL8019AS_BNRY_REGISTER, 0x4c);
    WriteToRTL8019AS(RTL8019AS_TPSR_REGISTER, 0x45);
    WriteToRTL8019AS(RTL8019AS_RCR_REGISTER, 0xcc);
    WriteToRTL8019AS(RTL8019AS_TCR_REGISTER, 0xe0);
    WriteToRTL8019AS(RTL8019AS_DCR_REGISTER, 0xcb);
    WriteToRTL8019AS(RTL8019AS_IMR_REGISTER, 0x00);
    Page(1);
    WriteToRTL8019AS(RTL8019AS_CURR_REGISTER, 0x4d);
    WriteToRTL8019AS(RTL8019AS_MAR0_REGISTER, 0x00);
    WriteToRTL8019AS(RTL8019AS_MAR1_REGISTER, 0x41);
    WriteToRTL8019AS(RTL8019AS_MAR2_REGISTER, 0x00);
    WriteToRTL8019AS(RTL8019AS_MAR3_REGISTER, 0x80);
    WriteToRTL8019AS(RTL8019AS_MAR4_REGISTER, 0x00);
    WriteToRTL8019AS(RTL8019AS_MAR5_REGISTER, 0x00);
    WriteToRTL8019AS(RTL8019AS_MAR6_REGISTER, 0x00);
    WriteToRTL8019AS(RTL8019AS_MAR7_REGISTER, 0x00);
    
    WriteToRTL8019AS(RTL8019AS_COMMAND_REGISTER, 0x22);
    
    Write_RTL8019AS_MACAddr(MACAddr);
}

/********************************************************************************
*
* 名称:Read_RTL8019AS_MACAddr
*
* 功能:读取RTL8019AS芯片的MAC地址
*
* 入口参数:存放RTL8019AS芯片的MAC地址的指针          
*
* 出口参数: 无
*
* 全局变量: 无
*
* 调用模块: 无
*
********************************************************************************/
void  Read_RTL8019AS_MACAddr(INT8U *Addr)
{
    
    Page(1);
    *Addr = ReadFromRTL8019AS(RTL8019AS_PAR0_REGISTER);
    Addr++;
    *Addr = ReadFromRTL8019AS(RTL8019AS_PAR1_REGISTER);
    Addr++;
    *Addr = ReadFromRTL8019AS(RTL8019AS_PAR2_REGISTER);
    Addr++;
    *Addr = ReadFromRTL8019AS(RTL8019AS_PAR3_REGISTER);
    Addr++;
    *Addr = ReadFromRTL8019AS(RTL8019AS_PAR4_REGISTER);
    Addr++;
    *Addr = ReadFromRTL8019AS(RTL8019AS_PAR5_REGISTER);
    Page(0);
}


/********************************************************************************
*
* 名称:Write_RTL8019AS_MACAddr
*
* 功能:往RTL8019AS芯片中写入的MAC地址
*
* 入口参数:存放RTL8019AS芯片的MAC地址的指针          
*
* 出口参数: 无
*
* 全局变量: 无
*
* 调用模块: 无
*
********************************************************************************/
void  Write_RTL8019AS_MACAddr(INT8U *Addr)
{
    Page(1);
    WriteToRTL8019AS(RTL8019AS_PAR0_REGISTER, *Addr);
    Addr++;
    WriteToRTL8019AS(RTL8019AS_PAR1_REGISTER, *Addr);
    Addr++;
    WriteToRTL8019AS(RTL8019AS_PAR2_REGISTER, *Addr);
    Addr++;
    WriteToRTL8019AS(RTL8019AS_PAR3_REGISTER, *Addr);
    Addr++;
    WriteToRTL8019AS(RTL8019AS_PAR4_REGISTER, *Addr);
    Addr++;
    WriteToRTL8019AS(RTL8019AS_PAR5_REGISTER, *Addr);
    Page(0);
}

main.c中与RTL8019AS有关的代码

void Task3(void *pdata)
{
   &
2楼: >>参与讨论
pubstar
将你的rtl8019as.h文件贴出来,板子是老周的板子吗?
 
3楼: >>参与讨论
zhan_cl
问题已解决,但不知所以然
是周工的板子。问题找到了,我使用了周工的模板,没有作任何修改,在模板中BANK3设置为32位的,现在我把他改成16位的,读写MAC地址都是正确的,也就我读出来的值:52 54 4c 19 f7 42,但我还是有一点问题:由于RTL8019AS被配置成8位的,BANK3却是配置成16位的,因此周工在连接地址时将LPC2210的A1-A5连到RTL8019AS的SA0-SA4上,RTL8019AS的地址范围为0x83400000-0x8340001f,如果我现在要访问0x83400009(也就是RTL8019AS中地址偏移量为0x09的寄存器)时A5-A1的值应该是0100(因为A5-A0的值是01001),这和访问0x83400008(也就是RTL8019AS中地址偏移量为0x08的寄存器)时A5-A1的值一样也是0100(因为A5-A0的值是01000),这怎么能区分开呢?但事实上是可以区分看的,难道是我理解错了,请各位dx能帮小弟解释一下。

4楼: >>参与讨论
zhan_cl
没人能解释还是问题太简单了不屑一答呢?
 
5楼: >>参与讨论
zlgARM
re:
TEMP=(*((volatile unsigned SHORT *) NET_BASE_ADDR+ADDR_16));
递增的长度与unsigned SHORT 有关。

6楼: >>参与讨论
zhan_cl
还是不懂
NET_BASE_ADDR为0x83400000,我第一次访问的地址是0x08,那(volatile unsigned SHORT*)NET_BASE_ADDR+0x08的值是多少呢,如果访问0x09结果又怎样呢?它是怎么计算出来的?

7楼: >>参与讨论
zhan_cl
赶紧顶一下,否则要沉下去了
 
8楼: >>参与讨论
JOHN

大家好!

那里能找到:使用RTL8019ASAT24C512N 及SYNCMOS SM5964

做的网管卡

参与讨论
昵称:
讨论内容:
 
 
相关帖子
我lpc2214+64k(16bit)RAM 跑UDP或TCPIP.资源够用吗?
请教zlgARM老师,急!!!!!!!
为什么D12的标准请求函数都是在主程序中完成的?
请教zlgarm先生一个easyjtag调试的问题?
进入到main函数之前,不能初始化运行库的问题
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入


Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号