OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4614|回复: 4

关于 STM32RET6+DM9000A io模拟驱动 初始化失败

[复制链接]

1

主题

14

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
210
金钱
210
注册时间
2020-10-24
在线时间
57 小时
发表于 2020-11-24 15:49:57 | 显示全部楼层 |阅读模式
10金钱
手上有个老哥留下的板子,用的是STM32F103RET6+dm9000A+FREERTOS ,因为没有FSMC所以用的IO口模拟驱动,然后我发现板子上单片机引脚不够,DM9000A的中断引脚没接,看了下程序是参照原子写的。
现在的问题是我串口能正常读取出芯片id,但是连接速度和双工状态读不出来,串口显示建立连接失败,一直找不出什么问题,有没有大佬来指点一下。。
u8 DM9000_Init(void)
{
        u32 temp;
        GPIO_InitTypeDef GPIO_InitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD,ENABLE);        //使能GPIOA B C D时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);        //使能复用功能时钟       
        GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);                                 //GPIO_Remap_SWJ_Disable   由于需要用到A15管脚
/**************************************************************************************************************/
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;                 //PC4 推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
        GPIO_Init(GPIOC,&GPIO_InitStructure);
               
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //PA7
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
        GPIO_Init(GPIOA,&GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_12;                         //PB0 12
        GPIO_Init(GPIOB,&GPIO_InitStructure);       
       
        GPIO_InitStructure.GPIO_Pin =GPIO_Pin_5;                //PC5
        GPIO_Init(GPIOC,&GPIO_InitStructure);       
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //PA8
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
        GPIO_Init(GPIOA,&GPIO_InitStructure);       
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;                         //PB13 14 15
        GPIO_Init(GPIOB,&GPIO_InitStructure);       
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;                //PC6 7 8 9
        GPIO_Init(GPIOC,&GPIO_InitStructure);       
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_15; //PA11 12 15
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
        GPIO_Init(GPIOA,&GPIO_InitStructure);       
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;                         //PB3 4 5
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
        GPIO_Init(GPIOB,&GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;                //PC12
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
        GPIO_Init(GPIOC,&GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;                //PD2
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
        GPIO_Init(GPIOD,&GPIO_InitStructure);
       
        /*******************************************************************************************************/

        temp=*(vu32*)(0x1FFFF7E8);                                //获取STM32的唯一ID的前24位作为MAC地址后三字节
        dm9000cfg.mode=DM9000_AUTO;       
        dm9000cfg.queue_packet_len=0;
        //DM9000的SRAM的发送和接收指针自动返回到开始地址,并且开启接收中断
        dm9000cfg.imr_all = IMR_PAR|IMR_PRI;
        //初始化MAC地址
        dm9000cfg.mac_addr[0]=2;
        dm9000cfg.mac_addr[1]=0;
        dm9000cfg.mac_addr[2]=0;
        dm9000cfg.mac_addr[3]=(temp>>16)&0XFF;        //低三字节用STM32的唯一ID
        dm9000cfg.mac_addr[4]=(temp>>8)&0XFFF;
        dm9000cfg.mac_addr[5]=temp&0XFF;
        //初始化组播地址
        dm9000cfg.multicase_addr[0]=0Xff;
        dm9000cfg.multicase_addr[1]=0Xff;
        dm9000cfg.multicase_addr[2]=0Xff;
        dm9000cfg.multicase_addr[3]=0Xff;
        dm9000cfg.multicase_addr[4]=0Xff;
        dm9000cfg.multicase_addr[5]=0Xff;
        dm9000cfg.multicase_addr[6]=0Xff;
        dm9000cfg.multicase_addr[7]=0Xff;
       
        DM9000_Reset();                                                        //复位DM9000
        vTaskDelay(100);
        while(1)
        {
                temp=DM9000_Get_DeiviceID();                        //获取DM9000ID
                printf("DM9000 ID:%#x\r\n",temp);
                if(temp==DM9000_ID)  break;                         //读取ID错误
               
                vTaskDelay(10);
        }
       
        DM9000_Set_PHYMode(dm9000cfg.mode);                //设置PHY工作模式
        DM9000_iow(DM9000_NCR,0X00);
        DM9000_iow(DM9000_TCR,0X00);                //发送控制寄存器清零
        DM9000_iow(DM9000_BPTR,0X3F);       
        DM9000_iow(DM9000_FCTR,0X38);
        DM9000_iow(DM9000_FCR,0X00);
        DM9000_iow(DM9000_SMCR,0X00);                //特殊模式
        DM9000_iow(DM9000_NSR,NSR_WAKEST|NSR_TX2END|NSR_TX1END);//清除发送状态
        DM9000_iow(DM9000_ISR,0X0F);                //清除中断状态
        DM9000_iow(DM9000_TCR2,0X80);                //切换LED到mode1        
        //设置MAC地址和组播地址
        DM9000_Set_MACAddress(dm9000cfg.mac_addr);                //设置MAC地址
        DM9000_Set_Multicast(dm9000cfg.multicase_addr);        //设置组播地址
        DM9000_iow(DM9000_RCR,RCR_DIS_LONG|RCR_DIS_CRC|RCR_RXEN);
        DM9000_iow(DM9000_IMR,IMR_PAR);
        temp=DM9000_Get_SpeedAndDuplex();                //获取DM9000的连接速度和双工状态
        if(temp!=0XFF)                                                        //连接成功,通过串口显示连接速度和双工状态
        {
                printf("DM9000 Speed:%dMbps,Duplex:%s duplex mode\r\n",(temp&0x02)?10:100,(temp&0x01)?"Full":"Half");
        }else printf("DM9000 Establish Link Failed!\r\n");
        DM9000_iow(DM9000_IMR,dm9000cfg.imr_all);        //设置中断
        return 0;               
}



串口输出

串口输出

最佳答案

查看完整内容[请看2#楼]

找到问题了,之前那个老哥在网络变压器的四个差分线上串了49.9的电阻,最开始我以为没问题因为我之前用W5100的时候官方原理图上也是串进去。不过把串的电阻去掉,通过49.9电阻和电容接地后问题就解决了。原子的原理图上也是如此。欸,这破问题折腾了两周。不过我仍然不清楚到底是因为换网络变压器的原因,还是换了网络芯片的原因。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

14

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
210
金钱
210
注册时间
2020-10-24
在线时间
57 小时
 楼主| 发表于 2020-11-24 15:49:58 | 显示全部楼层
本帖最后由 gjwhs 于 2020-12-1 11:07 编辑

找到问题了,之前那个老哥在网络变压器的四个差分线上串了49.9的电阻,最开始我以为没问题因为我之前用W5100的时候官方原理图上也是串进去。不过把串的电阻去掉,通过49.9电阻和电容接地后问题就解决了。原子的原理图上也是如此。欸,这破问题折腾了两周。不过我仍然不清楚到底是因为换网络变压器的原因,还是换了网络芯片的原因。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2020-11-25 01:13:17 | 显示全部楼层
帮顶
回复

使用道具 举报

1

主题

14

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
210
金钱
210
注册时间
2020-10-24
在线时间
57 小时
 楼主| 发表于 2020-11-25 17:07:07 | 显示全部楼层
本帖最后由 gjwhs 于 2020-11-26 11:30 编辑

另外,网口灯也是全部都不亮,PHY倒是能正常读取写入11.26
发现网口直连PC显示连接成功,读取dm9000寄存器发现连接标志位已经置1,然而无法使用dhcp,使用静态ip发现ping不通,PC网口绿灯不亮,黄灯闪,板子网口绿灯亮(感觉上不是常亮而是非常快速的闪),黄灯不亮
[2020-11-26 11:12:31.794] RX:
BMCR 0x1100
ANAR 0x1e1
BMSR 0x786d
NSR  0xc0
DM9000 Speed:10Mbps,Duplex:Full duplex mode

网口直连路由器发现连接不成功,读取寄存器连接标志位为0,两个灯全部不亮。真是奇怪,下午改下硬件电路看看。
[2020-11-26 11:21:06.378] RX:
BMCR0x1000
ANAR0x1e1
BMSR0x7849
DM9000 Establish Link Failed! 0xff

回复

使用道具 举报

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2016-7-6
在线时间
13 小时
发表于 2021-7-17 18:21:57 | 显示全部楼层
本帖最后由 qkhhxkj 于 2021-7-17 18:33 编辑

楼主 你好,可以给下 原理图吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-23 23:13

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表