-1

最近、私は emac に関連するプロジェクトに取り組み始めましたが、実装に関していくつかの疑問や障害に遭遇したため、経験豊富な人々からアドバイスや提案を得るために Q をここに投稿することにしました。

現在、EMAC-DM9161A モジュールを SAM3x - Taiji Uino ボードと高速イーサネット通信用に接続する作業を行っています。Palliser によって開発され、Github に elechouse/EMAC-Demo としてアップロードされているライブラリを使用しています。ソース コード (ethernet_phy.c) で、次のように DM9161A PHY コンポーネントを初期化するこの関数を見つけました。

unit8_t ethernet_phy_init(Emac*p_emac, uint8_t uc_phy_addr, uint32_t mck);

問題: 引数 uint8_t uc_phy_addr は、70-62-D8-28-C2-8E などの 48 ビット MAC アドレスを渡したい 8 ビット レジスタです。2 つの 32 ビット レジスタを使用して、MAC アドレスの最初の 32 ビット、つまり 70-62-D8-28 を 1 つの 32 ビット レジスタに格納し、残りの 16 ビット MAC アドレス、つまり C2-8E を別の 32 ビット レジスタに格納できることを理解しています。 . ただし、48 ビットの MAC アドレスを渡すために unit8_t が使用される上記の ethernet_phy_init 関数を使用する必要があるため、これを行うことはできません。それで、私は知りたいのですが、これを実現する方法は?

別の質問: いくつかの試行方法で理解するためにいくつかのコードを実行しましたが、いくつかの疑問に遭遇しました。コードは次のとおりです。

  int main()
{
  unit8_t phy_addr =49;     //Assign a value 49 to 8 bit Reg
  int8_t phy_addr1 = 49;
  int phy_addr2 = 49;
  cout<<phy_addr;
  cout<<phy_addr1
  cout<<phy_addr2;
  getchar();
  return 0;
 }

出力結果:

 1
 1
 49

だから私の疑問は、8 ビット変数を使用して値 49 を格納するときに出力が ASCII 文字で表示されるのはなぜですか。これは起こりますか?そして最後に、MACアドレスを8ビットレジスタに保存する方法は?

4

3 に答える 3

0

2 番目の質問について: 最初の 2 つの変数は 8 ビット (1 つは符号付き、もう 1 つは符号なし) であるため、ostream はそれらが char (同じく 8 ビット幅) であると想定し、それらの char 表現を表示します ("1" = ASCII 49)。

元の質問については、Atmel ソースを少し閲覧しましたが、MAC アドレスは ethernet_phy_init とは関係ありません (すべてがはるかに低いレベルにあります): uc_phy_addr - インターフェイス インデックスのようです mck - タイマー関連の値のようです。

于 2015-04-15T11:38:51.410 に答える
0

2番目の質問について:

uint8_t/は/とint8_t同じで、 として扱います。数値として印刷するために使用します。unsignedsigned charcoutcharstatic_cast<int>

最初の質問について:

私は emac で作業したことはありませんが、この例から判断すると、 mac は次のように設定する必要があります。

#define ETHERNET_CONF_ETHADDR0                        0x00
#define ETHERNET_CONF_ETHADDR0                        0x00
#define ETHERNET_CONF_ETHADDR1                        0x04
#define ETHERNET_CONF_ETHADDR2                        0x25
#define ETHERNET_CONF_ETHADDR3                        0x1C
#define ETHERNET_CONF_ETHADDR4                        0xA0
#define ETHERNET_CONF_ETHADDR5                        0x02

static uint8_t gs_uc_mac_address[] =
        { ETHERNET_CONF_ETHADDR0, ETHERNET_CONF_ETHADDR1, ETHERNET_CONF_ETHADDR2,
            ETHERNET_CONF_ETHADDR3, ETHERNET_CONF_ETHADDR4, ETHERNET_CONF_ETHADDR5
};

emac_options_t emac_option;
memcpy(emac_option.uc_mac_addr, gs_uc_mac_address, sizeof(gs_uc_mac_address));
emac_dev_init(EMAC, &gs_emac_dev, &emac_option);
于 2015-04-15T11:37:22.540 に答える