查看: 3426|回复: 10

[求助] 【RT1050】RT-Thread 下 以太网 驱动问题

[复制链接]
  • TA的每日心情
    擦汗
    2020-1-10 11:05
  • 签到天数: 13 天

    [LV.3]偶尔看看II

    13

    主题

    49

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    382
    最后登录
    2020-11-12
    发表于 2020-1-10 11:18:59 | 显示全部楼层 |阅读模式
    使用 驱动位于:rtthread-rt-thread-v4.0.2\rt-thread\bsp\imxrt\libraries\drivers\drv_eth.c  ,

    在此基础上添加了引脚初始化。
    IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_09_GPIO1_IO09, 0U);
        IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_10_GPIO1_IO10, 0U);
        IOMUXC_SetPinMux(IOMUXC_GPIO_B1_04_ENET_RX_DATA00, 0U);
        IOMUXC_SetPinMux(IOMUXC_GPIO_B1_05_ENET_RX_DATA01, 0U);
        IOMUXC_SetPinMux(IOMUXC_GPIO_B1_06_ENET_RX_EN, 0U);
        IOMUXC_SetPinMux(IOMUXC_GPIO_B1_07_ENET_TX_DATA00, 0U);
        IOMUXC_SetPinMux(IOMUXC_GPIO_B1_08_ENET_TX_DATA01, 0U);
        IOMUXC_SetPinMux(IOMUXC_GPIO_B1_09_ENET_TX_EN, 0U);
        IOMUXC_SetPinMux(IOMUXC_GPIO_B1_10_ENET_REF_CLK, 1U);
        IOMUXC_SetPinMux(IOMUXC_GPIO_B1_11_ENET_RX_ER, 0U);
        IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_04_ENET_MDC, 0U);
        IOMUXC_SetPinMux(IOMUXC_GPIO_B1_15_ENET_MDIO, 0U);

        IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B0_09_GPIO1_IO09, 0xB0E9U);
        IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B0_10_GPIO1_IO10, 0xB0E9U);
        IOMUXC_SetPinConfig(IOMUXC_GPIO_B1_04_ENET_RX_DATA00, 0xB0E9U);
        IOMUXC_SetPinConfig(IOMUXC_GPIO_B1_05_ENET_RX_DATA01, 0xB0E9U);
        IOMUXC_SetPinConfig(IOMUXC_GPIO_B1_06_ENET_RX_EN, 0xB0E9U);
        IOMUXC_SetPinConfig(IOMUXC_GPIO_B1_07_ENET_TX_DATA00, 0xB0E9U);
        IOMUXC_SetPinConfig(IOMUXC_GPIO_B1_08_ENET_TX_DATA01, 0xB0E9U);
        IOMUXC_SetPinConfig(IOMUXC_GPIO_B1_09_ENET_TX_EN, 0xB0E9U);
        IOMUXC_SetPinConfig(IOMUXC_GPIO_B1_10_ENET_REF_CLK, 0x31U);
        IOMUXC_SetPinConfig(IOMUXC_GPIO_B1_11_ENET_RX_ER, 0xB0E9U);
        IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B1_04_ENET_MDC, 0xB0E9U);
        IOMUXC_SetPinConfig(IOMUXC_GPIO_B1_15_ENET_MDIO, 0xB829u);



    static void imxrt_enet_phy_reset_by_gpio(void)
    {
        gpio_pin_config_t gpio_config = {kGPIO_DigitalOutput, 0, kGPIO_NoIntmode};
        GPIO_PinInit(GPIO1, 9, &gpio_config);
        GPIO_PinInit(GPIO1, 10, &gpio_config);
        /* pull up the ENET_INT before RESET. */
        GPIO_WritePinOutput(GPIO1, 10, 1);
        GPIO_WritePinOutput(GPIO1, 9, 0);
        rt_thread_delay(100);
        GPIO_WritePinOutput(GPIO1, 9, 1);
    }


    相关初始化:
    /* Get default configuration. */
        /*
         * config.miiMode = kENET_RmiiMode;
         * config.miiSpeed = kENET_MiiSpeed100M;
         * config.miiDuplex = kENET_MiiFullDuplex;
         * config.rxMaxFrameLen = ENET_FRAME_MAX_FRAMELEN;
         */
        ENET_GetDefaultConfig(&config);
        config.interrupt = kENET_TxFrameInterrupt | kENET_RxFrameInterrupt;
        config.miiSpeed = imxrt_eth_device.speed;
        config.miiDuplex = imxrt_eth_device.duplex;

        /* Set SMI to get PHY link status. */
        sysClock = CLOCK_GetFreq(kCLOCK_AhbClk);

        dbg_log(DBG_LOG, "deinit\n");
        ENET_Deinit(imxrt_eth_device.enet_base);
        dbg_log(DBG_LOG, "init\n");
        ENET_Init(imxrt_eth_device.enet_base, &imxrt_eth_device.enet_handle, &config, &buffConfig, &imxrt_eth_device.dev_addr[0], sysClock);
        dbg_log(DBG_LOG, "set call back\n");
        ENET_SetCallback(&imxrt_eth_device.enet_handle, _enet_callback, &imxrt_eth_device);
        dbg_log(DBG_LOG, "active read\n");
        ENET_ActiveRead(imxrt_eth_device.enet_base);



    现象:
        能正常读写PHY芯片数据,以太网发送数据时,无法进入发送事件中断回调函数
        查看到配置的PLL Enet Freq = 50000000




    哈哈哈哈哈哈哈啊哈哈哈
    回复

    使用道具 举报

    该用户从未签到

    656

    主题

    6312

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    19933
    最后登录
    2024-4-19
    发表于 2020-1-13 10:19:26 | 显示全部楼层
    说实话单单看上述代码看不出问题所在,我建议你把你的代码生成过程和测试步骤介绍一下
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2020-1-10 11:05
  • 签到天数: 13 天

    [LV.3]偶尔看看II

    13

    主题

    49

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    382
    最后登录
    2020-11-12
     楼主| 发表于 2020-1-13 17:30:25 | 显示全部楼层
    小恩GG 发表于 2020-1-13 10:19
    说实话单单看上述代码看不出问题所在,我建议你把你的代码生成过程和测试步骤介绍一下 ...

    代码生成:env自动生成 keil工程,编译下载   
    测试步骤: 上电会DHCP自动获取IP,这个时候会向外广播一个UDP包,在这个时候 开发板没有把数据发送出去(通过发送中断回调函数知道)





    哈哈哈哈哈哈哈啊哈哈哈
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    656

    主题

    6312

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    19933
    最后登录
    2024-4-19
    发表于 2020-1-14 10:40:13 | 显示全部楼层
    meteorego 发表于 2020-1-13 17:30
    代码生成:env自动生成 keil工程,编译下载   
    测试步骤: 上电会DHCP自动获取IP,这个时候会向外广播一 ...

    你说的env是RT-Thread提供的工具吗?测试开发是在NXP官方板子上进行的吗?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2020-1-10 11:05
  • 签到天数: 13 天

    [LV.3]偶尔看看II

    13

    主题

    49

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    382
    最后登录
    2020-11-12
     楼主| 发表于 2020-1-14 10:48:28 | 显示全部楼层
    本帖最后由 meteorego 于 2020-1-15 08:30 编辑
    小恩GG 发表于 2020-1-14 10:40
    你说的env是RT-Thread提供的工具吗?测试开发是在NXP官方板子上进行的吗?

    是RT-Thread提供的工具,是在NXP RT1060-EVK开发板 和 野火1052 开发板上进行的;
    我这边找到原因了,上电初始化内存的时候,吧DTCM设置为0,在链接文件中数据段是从OCRAM开始的,但是我不清楚具体原因???
    RT1050系列,由于DTCM和OCRAM地址不是连续的,在链接文件中怎么声明数据段同时在DTCM和OCRAM???
    哈哈哈哈哈哈哈啊哈哈哈
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    656

    主题

    6312

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    19933
    最后登录
    2024-4-19
    发表于 2020-1-15 14:47:47 | 显示全部楼层
    meteorego 发表于 2020-1-14 10:48
    是RT-Thread提供的工具,是在NXP RT1060-EVK开发板 和 野火1052 开发板上进行的;
    我这边找到原因了,上电 ...

    链接文件和FlexRAM配置的代码请分享一下
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2020-1-10 11:05
  • 签到天数: 13 天

    [LV.3]偶尔看看II

    13

    主题

    49

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    382
    最后登录
    2020-11-12
     楼主| 发表于 2020-1-16 16:06:09 | 显示全部楼层
    小恩GG 发表于 2020-1-15 14:47
    链接文件和FlexRAM配置的代码请分享一下

    链接文件
    #define m_flash_config_start           0x60000000
    #define m_flash_config_size            0x00001000

    #define m_ivt_start                    0x60001000
    #define m_ivt_size                     0x00001000

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    #define m_interrupts_start             0x60002000
    #define m_interrupts_size              0x00000400

    #define m_text_start                   0x60002400
    #define m_text_size                    0x000FDC00

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    ;#define m_data_start                   0x20000000
    ;#define m_data_size                    0x00020000

    #define m_data2_start                  0x20200000
    #define m_data2_size                   0x00080000//0x00040000

    /* Sizes */
    #if (defined(__stack_size__))
      #define Stack_Size                   __stack_size__
    #else
      #define Stack_Size                   0x4000
    #endif

    #if (defined(__heap_size__))
      #define Heap_Size                    __heap_size__
    #else
      #define Heap_Size                    0x0400
    #endif

    ;#define RTT_HEAP_SIZE (m_data_size-ImageLength(RW_m_data)-ImageLength(ARM_LIB_HEAP)-ImageLength(ARM_LIB_STACK))
    ;#define RTT_HEAP_SIZE (m_data2_size-ImageLength(RW_m_data)-ImageLength(ARM_LIB_HEAP)-ImageLength(ARM_LIB_STACK))

    #if defined(XIP_BOOT_HEADER_ENABLE) && (XIP_BOOT_HEADER_ENABLE == 1)
    LR_m_text m_flash_config_start m_text_start+m_text_size-m_flash_config_start {   ; load region size_region

      RW_m_config_text m_flash_config_start FIXED m_flash_config_size { ; load address = execution address
        * (.boot_hdr.conf, +FIRST)
      }

      RW_m_ivt_text m_ivt_start FIXED m_ivt_size { ; load address = execution address
        * (.boot_hdr.ivt, +FIRST)
        * (.boot_hdr.boot_data)
        * (.boot_hdr.dcd_data)
      }
      
    #else
    LR_m_text m_interrupts_start m_text_start+m_text_size-m_interrupts_start {   ; load region size_region
    #endif
           
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
      VECTOR_ROM m_interrupts_start FIXED m_interrupts_size { ; load address = execution address
        * (RESET,+FIRST)
      }
      
      ER_m_text m_text_start FIXED m_text_size { ; load address = execution address
        * (InRoot$$Sections)
        .ANY (+RO)
      }
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
      ;RW_m_data m_data_start m_data_size-Stack_Size-Heap_Size { ; RW data
      RW_m_data m_data2_start m_data2_size-Stack_Size-Heap_Size{ ; RW data
        .ANY (+RW +ZI)
        * (NonCacheable.init)
        * (NonCacheable)
      }
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
      ARM_LIB_HEAP +0 EMPTY Heap_Size {}    ; Heap region growing up
      ARM_LIB_STACK +0 EMPTY Stack_Size{}         ; Stack region growing down
      ;RTT_HEAP +0 EMPTY RTT_HEAP_SIZE{}         ; Heap region growing up
    }

    在startup_MIMXRT1052.s

    ; FLEXRAM_CFG_ENABLE
                    LDR     R0,=__IOMUX_GPR17_ADDR ;load IOMUXC_GPR17 register address to R0
                    MOV32   R1,__FLEXRAM_BANK_CFG;move FlexRAM configuration value to R1
                    STR     R1,[R0]

                    LDR     R0,=__IOMUX_GPR16_ADDR;load IOMUXC_GPR16 register address to R0
                    LDR     R1,[R0];load IOMUXC_GPR16 register value to R0
                    ORR     R1,R1,#4;set corresponding FLEXRAM_BANK_CFG_SEL bit
                    STR     R1,[R0];store the value to IOMUXC_GPR16
                    ; FLEXRAM_ITCM_ZERO_SIZE
                    LDR     R0,=__IOMUX_GPR16_ADDR
                    LDR     R1,[R0]
                    AND     R1,R1,#0xFFFFFFFE
                    STR     R1,[R0]
                    ; FLEXRAM_DTCM_ZERO_SIZE
                    LDR     R0,=__IOMUX_GPR16_ADDR
                    LDR     R1,[R0]
                    AND     R1,R1,#0xFFFFFFFD
                    STR     R1,[R0]

                    LDR     R0,=__IOMUX_GPR14_ADDR;IOMUXC_GPR16 register address to R0
                    LDR     R1,[R0] ;load IOMUXC_GPR16 register value to R0
                    MOVT    R1,#0x0000 ;clear upper halfword of IOMUXC_GPR16 register
                    MOV     R2,#__FLEXRAM_ITCM_SIZE
                    MOV     R3,#__FLEXRAM_DTCM_SZIE
                    LSL     R2,R2,#16
                    LSL     R3,R3,#20
                    ORR     R1,R2,R3
                    STR     R1,[R0] ;store the value to IOMUXC_GPR16

    哈哈哈哈哈哈哈啊哈哈哈
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    656

    主题

    6312

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    19933
    最后登录
    2024-4-19
    发表于 2020-1-20 10:30:31 | 显示全部楼层
    meteorego 发表于 2020-1-16 16:06
    链接文件:
    #define m_flash_config_start           0x60000000
    #define m_flash_config_size           ...

    从链接文件看,RAM区域是有两块:OCRAM与DTCM,且DTCM是默认的RAM,很显然你把它设置成0字节,当然影响后面函数的调用,参数的传递与临时变量的存储,结果就是程序工作不正常
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2020-1-10 11:05
  • 签到天数: 13 天

    [LV.3]偶尔看看II

    13

    主题

    49

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    382
    最后登录
    2020-11-12
     楼主| 发表于 2020-1-20 16:13:10 | 显示全部楼层
    小恩GG 发表于 2020-1-20 10:30
    从链接文件看,RAM区域是有两块:OCRAM与DTCM,且DTCM是默认的RAM,很显然你把它设置成0字节,当然影响后 ...

    链接文件中,是没有使用DTCM这块区域的哦
    哈哈哈哈哈哈哈啊哈哈哈
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    656

    主题

    6312

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    19933
    最后登录
    2024-4-19
    发表于 2020-1-21 13:57:10 | 显示全部楼层
    meteorego 发表于 2020-1-20 16:13
    链接文件中,是没有使用DTCM这块区域的哦

    这不是对应DTCM的区域吗?!

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    ;#define m_data_start                   0x20000000
    ;#define m_data_size                    0x00020000

    点评

    前面有; 意味着 已经屏蔽  发表于 2020-11-12 13:54
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-19 19:33 , Processed in 0.146801 second(s), 28 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

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