硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1225|回复: 7
收起左侧

[以太网] 双DM9000对接CMSIS-Driver的问题

[复制链接]

19

主题

62

回帖

119

积分

初级会员

积分
119
发表于 2022-3-25 23:38:50 | 显示全部楼层 |阅读模式

项目需要三个网口,准备其中两个使用FMC来驱动DM9000来实现,参照硬汉的DM9000驱动进行移植,移植到CMSIS-Driver时发现,对应CMSIS-Driver层的接口是一个控制块,此控制块全部都是函数接口,没有变量来传递上下文信息,这样就无法区分是那个DM9000,莫非两个DM9000要独立封装所有的接口函数?这也太不科学了吧?

[C] 纯文本查看 复制代码
/**
\brief Access structure of the Ethernet MAC Driver
*/
typedef struct _ARM_DRIVER_ETH_MAC {
  ARM_DRIVER_VERSION       (*GetVersion)      (void);                                                ///< Pointer to \ref ARM_ETH_MAC_GetVersion : Get driver version.
  ARM_ETH_MAC_CAPABILITIES (*GetCapabilities) (void);                                                ///< Pointer to \ref ARM_ETH_MAC_GetCapabilities : Get driver capabilities.
  int32_t                  (*Initialize)      (ARM_ETH_MAC_SignalEvent_t cb_event);                  ///< Pointer to \ref ARM_ETH_MAC_Initialize : Initialize Ethernet MAC Device.
  int32_t                  (*Uninitialize)    (void);                                                ///< Pointer to \ref ARM_ETH_MAC_Uninitialize : De-initialize Ethernet MAC Device.
  int32_t                  (*PowerControl)    (ARM_POWER_STATE state);                               ///< Pointer to \ref ARM_ETH_MAC_PowerControl : Control Ethernet MAC Device Power.
  int32_t                  (*GetMacAddress)   (      ARM_ETH_MAC_ADDR *ptr_addr);                    ///< Pointer to \ref ARM_ETH_MAC_GetMacAddress : Get Ethernet MAC Address.
  int32_t                  (*SetMacAddress)   (const ARM_ETH_MAC_ADDR *ptr_addr);                    ///< Pointer to \ref ARM_ETH_MAC_SetMacAddress : Set Ethernet MAC Address.
  int32_t                  (*SetAddressFilter)(const ARM_ETH_MAC_ADDR *ptr_addr, uint32_t num_addr); ///< Pointer to \ref ARM_ETH_MAC_SetAddressFilter : Configure Address Filter.
  int32_t                  (*SendFrame)       (const uint8_t *frame, uint32_t len, uint32_t flags);  ///< Pointer to \ref ARM_ETH_MAC_SendFrame : Send Ethernet frame.
  int32_t                  (*ReadFrame)       (      uint8_t *frame, uint32_t len);                  ///< Pointer to \ref ARM_ETH_MAC_ReadFrame : Read data of received Ethernet frame.
  uint32_t                 (*GetRxFrameSize)  (void);                                                ///< Pointer to \ref ARM_ETH_MAC_GetRxFrameSize : Get size of received Ethernet frame.
  int32_t                  (*GetRxFrameTime)  (ARM_ETH_MAC_TIME *time);                              ///< Pointer to \ref ARM_ETH_MAC_GetRxFrameTime : Get time of received Ethernet frame.
  int32_t                  (*GetTxFrameTime)  (ARM_ETH_MAC_TIME *time);                              ///< Pointer to \ref ARM_ETH_MAC_GetTxFrameTime : Get time of transmitted Ethernet frame.
  int32_t                  (*ControlTimer)    (uint32_t control, ARM_ETH_MAC_TIME *time);            ///< Pointer to \ref ARM_ETH_MAC_ControlTimer : Control Precision Timer.
  int32_t                  (*Control)         (uint32_t control, uint32_t arg);                      ///< Pointer to \ref ARM_ETH_MAC_Control : Control Ethernet Interface.
  int32_t                  (*PHY_Read)        (uint8_t phy_addr, uint8_t reg_addr, uint16_t *data);  ///< Pointer to \ref ARM_ETH_MAC_PHY_Read : Read Ethernet PHY Register through Management Interface.
  int32_t                  (*PHY_Write)       (uint8_t phy_addr, uint8_t reg_addr, uint16_t  data);  ///< Pointer to \ref ARM_ETH_MAC_PHY_Write : Write Ethernet PHY Register through Management Interface.
} const ARM_DRIVER_ETH_MAC;




回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107122
QQ
发表于 2022-3-26 00:16:34 | 显示全部楼层
读ID正常没。
回复

使用道具 举报

19

主题

62

回帖

119

积分

初级会员

积分
119
 楼主| 发表于 2022-3-26 09:54:45 | 显示全部楼层
我主要关心倒不是底层驱动能不能调通,主要是想问问双DM9000怎么对接快捷的对接CMSIS-Driver
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107122
QQ
发表于 2022-3-26 10:05:00 | 显示全部楼层
mojinpan 发表于 2022-3-26 09:54
我主要关心倒不是底层驱动能不能调通,主要是想问问双DM9000怎么对接快捷的对接CMSIS-Driver

可以的,串口那个CMSIS-Driver就是10来个串口,这里的DM9000也应该采用类似的方式。
回复

使用道具 举报

1

主题

6

回帖

9

积分

新手上路

积分
9
发表于 2022-4-8 13:29:29 | 显示全部楼层
楼主多个网口搞定了没?我这边也有个项目,用的2颗dm9000同时挂载在FSMC上,现在发现运行一段时间后(十几个小时左右)就无法ping通了。
回复

使用道具 举报

19

主题

62

回帖

119

积分

初级会员

积分
119
 楼主| 发表于 2022-4-8 20:12:48 | 显示全部楼层
守望者 发表于 2022-4-8 13:29
楼主多个网口搞定了没?我这边也有个项目,用的2颗dm9000同时挂载在FSMC上,现在发现运行一段时间后(十几个 ...

程序初步写完还没有详细测试,主要是板子没画出来,飞线测试信号质量太差,稳定性完全不敢确定
回复

使用道具 举报

1

主题

6

回帖

9

积分

新手上路

积分
9
发表于 2022-4-11 09:58:25 | 显示全部楼层
mojinpan 发表于 2022-4-8 20:12
程序初步写完还没有详细测试,主要是板子没画出来,飞线测试信号质量太差,稳定性完全不敢确定

我现在测试了60H,总有少量数据丢失或者错误的
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107122
QQ
发表于 2022-4-12 00:13:30 | 显示全部楼层
守望者 发表于 2022-4-11 09:58
我现在测试了60H,总有少量数据丢失或者错误的

方便的话,分享下你的设计情况,帮你看看。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-19 08:10 , Processed in 0.183021 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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