|
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统 驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe |
RTL8019AS芯片MAC地址设置总是不对 |
作者:zhan_cl 栏目:ARM技术 |
我想把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 于 2005/6/11 16:35:00 发布:
将你的rtl8019as.h文件贴出来,板子是老周的板子吗? |
3楼: | >>参与讨论 |
作者: zhan_cl 于 2005/6/11 18:15:00 发布:
问题已解决,但不知所以然 是周工的板子。问题找到了,我使用了周工的模板,没有作任何修改,在模板中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 于 2005/6/13 9:31:00 发布:
没人能解释还是问题太简单了不屑一答呢? |
5楼: | >>参与讨论 |
作者: zlgARM 于 2005/6/13 10:16:00 发布:
re: TEMP=(*((volatile unsigned SHORT *) NET_BASE_ADDR+ADDR_16)); 递增的长度与unsigned SHORT 有关。 |
6楼: | >>参与讨论 |
作者: zhan_cl 于 2005/6/14 8:15:00 发布:
还是不懂 NET_BASE_ADDR为0x83400000,我第一次访问的地址是0x08,那(volatile unsigned SHORT*)NET_BASE_ADDR+0x08的值是多少呢,如果访问0x09结果又怎样呢?它是怎么计算出来的? |
7楼: | >>参与讨论 |
作者: zhan_cl 于 2005/6/17 16:40:00 发布:
赶紧顶一下,否则要沉下去了 |
8楼: | >>参与讨论 |
作者: JOHN 于 2008/3/26 21:17:30 发布:
大家好! 那里能找到:使用RTL8019AS 和AT24C512N 及SYNCMOS SM5964 做的网管卡 |
|
|
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入 |
Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号 |