RX63N 周辺機能紹介 ETHERC/EDMAC イーサネットコントローラ / イーサネットコントローラ用 DMA コントローラ ルネサスエレクトロニクス株式会社 ルネサス半導体トレーニングセンター 2013/08/02 Rev. 1.00 00000-A
コンテンツ ETHERC/EDMAC の概要 プログラムサンプル プログラム仕様 プログラム フローチャート PHY-LSI の初期設定 PHY-LSI レジスタへのアクセス方法 PHY-LSI のリセット 自動交渉結果の取得 EDMAC/ETHERC の初期設定 ETHERC のレジスタ設定 EDMAC のレジスタ設定 ディスクリプタ領域の初期化 フレーム送信 フレーム受信 受信割り込み ( フレーム受信 受信ディスクリプタ枯渇 ) の許可 PHY-LSI 変更時の注意点 2
ETHERC/EDMAC の概要 3
ETHERC/EDMAC の仕様 イーサネットコントローラ イーサネット用 DMA コントローラ 4
ポートETHERC/EDMAC の動作概要 RAM EDMAC ETHERC 送信ディスクリプタ 送信バッファ 送信 FIFO MAC 受信ディスクリプタ 受信バッファ 内部インタフェース ディスクリプタ情報 送信 DMAC ディスクリプタ情報 受信 FIFO EDMAC インタフェース 送信制御部 コマンドステータスインタフェース 受信制御部 MII RMII 外付け PHY-LSI 受信 DMAC 5
プログラムサンプル 6
プログラム仕様 ETH のプログラム例イーサネットフレームを 10 フレーム送受信する 仕様 PHY-LSIインタフェース MIIを使用 動作モード 自動交渉により決定 ディスクリプタ面数 送信 :4 面 受信 :4 面 1フレーム/1バッファ バッファ容量 =1536バイト ディスクリプタ長 16バイト エンディアン リトルエンディアン 割り込み フレーム受信割り込み 7
プログラム フローチャート ETHER 割り込み main A ステータスの確認 モジュールストップ解除 snd_frame イーサネットフレームの送信 フレーム受信割り込み? Yes No init_phylsi PHY-LSI の初期化 No 10 フレーム送信完了? rcv_frame イーサネットフレームの受信 init_etherc ETHERC の初期化 Yes 10 フレーム目? No Yes init_edmac EDMAC の初期化 フレーム受信割り込みを禁止 割り込みコントローラの設定 ステータスのクリア 0 が読み出せるまで待つ 送信および受信の許可 A No 割り込み要求なし? Yes END 初期化送信受信 8
モジュールストップコントロールレジスタ B(MSTPCRB) ETHERC および EDMAC 使用可 C 言語マクロ表記 :MSTP(EDMAC) = 0; 9
初期化フロー -PHY-LSI の初期化 - main モジュールストップ解除 init_phylsi init_phylsi PHY-LSI の初期化 init_etherc ETHERC の初期化 init_edmac EDMAC の初期化 端子の設定 _phy_reset PHY-LSI のリセット _phy_get_autonego 自動交渉結果の取得 IEEE802.3 規格準拠 PHY-LSI 内蔵の MII レジスタ経由で制御 割り込みコントローラの設定 return 送信および受信の許可 自動交渉 ( オートネゴシエーション ): 接続相手によって動作モード (10Mbps/100Mbps, 全二重 / 半二重 ) を自動で切り替える機能 リンク接続ごとに PHY-LSI が自動で実行する A 詳細は 使用する PHY-LSI のデータシートを確認してください 10
PHY-LSI との接続 RX63N エラー通知 データ送信 管理情報 4 ビットデータ 許可クロック クロックデータ データ受信 CSMA/CD データ受信 4 ビットデータ クロックキャリア検出衝突検出有効データエラー状態 IEEE802.3u 準拠の MII 信号 11
P7n 端子機能制御レジスタ (P7nPFS)(n=0 ~ 7) 12
P8n PAn PBn PCn PEn 端子機能制御レジスタ 13
P8n PAn PBn PCn PEn 端子機能制御レジスタ 14
P8n PAn PBn PCn PEn 端子機能制御レジスタ 15
P8n PAn PBn PCn PEn 端子機能制御レジスタ 16
P8n PAn PBn PCn PEn 端子機能制御レジスタ 17
ポートモードレジスタ (PMR) 18
イーサネット制御レジスタ (PFENET) 19
書き込みプロテクトレジスタ (PWPR) 20
リセットと自動交渉の方法 RX63N クロック データ MII レジスタ リセット 自動交渉結果 詳細は 使用する PHY-LSI のデータシートを確認してください 21
MII レジスタ PHY-LSI アドレス 0 1 2, 3 4 5 MIIレジスタ名制御状態物理層識別子自動交渉告知自動交渉リンク先能力 機能リセットや自動交渉の許可 / 禁止など自動交渉の完了通知の確認など PHYの組織識別子情報の確認など自動交渉で相手に通知した値自動交渉で相手から通知された値 6 7 自動交渉拡張 - 自動交渉次ページ送信 - 詳細は 使用する PHY-LSI のデータシートを確認してください 22
MII レジスタのリード / ライト手順 MII 管理フレーム < リード > Hi- Z Hi-Z ( 例 ) 自動交渉結果 Hi-Z 32ビットの連続したアクセス種別フレームの先頭を示す ( リード 1 PHY-LSI = 10 01 アドレス ライト MIIレジスタ番号 = 01 ) (5 データの送信元を切り替える時間ビット ) (5ビット) レジスタアクセスデータ (16ビット) 待機時間 < ライト > Hi-Z ( 例 ) リセット Hi-Z 23
シリアル通信の実現方法 24
PHY 部インタフェースレジスタ (PIR) クロック方向書き込み読み出し 25
MII レジスタのリード / ライト手順の実現 1 ビット単位のデータ書き込み 1 ビット単位のデータ読み出し バスの解放 単独バス解放 26
プログラムイメージ void _phy_preamble(void) { int i; for( i = 0; i < 32; i++ ) { // 1 ビット単位で 1 を書き込み _phy_mii_write_1(); } } static void _phy_mii_write_1(void) { volatile i; ETHERC.PIR.LONG = 0x00000006; for( i=0; i<xxx; i++ ); ETHERC.PIR.LONG = 0x00000007; for( i=0; i<yyy; i++ ); ETHERC.PIR.LONG = 0x00000007; for( i=0; i<zzz; i++ ); } PHY-LSI のデータシートを確認してください 27
ETHERC の初期化フロー main init_etherc モジュールストップ解除 init_phylsi PHY-LSI の初期化 init_etherc ETHERC の初期化 init_edmac EDMAC の初期化 割り込みコントローラの設定 ETHERC/EDMAC ソフトウェアリセット リンクモードの設定 MAC アドレスの設定 ETHERC ステータスのクリア return 個別のアドレスを IEEE から取得してください 送信および受信の許可 A 28
EDMAC モードレジスタ (EDMR) - ソフトウェアリセット - 内部バスクロックの 64 サイクル必要 29
ETHERC モードレジスタ (ECMR) - リンクモードの設定 - 30
MAC アドレスの設定 MAC アドレス上位設定レジスタ (MAHR) MAC アドレス下位設定レジスタ (MALR) 31
ETHERC ステータスレジスタ (ECSR) - ステータスクリア - 各ビット 1 を書き込むとクリアされる 32
ETHERC の初期化関数 // サンプルの MAC アドレス const static uint8_t mac_addr[6] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05}; void init_etherc( uint16_t autonego ) // 引数は自動交渉の結果 { volatile int i; /* ETHERC と EDMAC のリセット */ EDMAC.EDMR.BIT.SWR = 1; // 64/4[clock/loop] ETHERC と EDMAC は ICLK で動作 for( i = 0 ; i < 16 ; i++ ); /* リンクモードの設定 */ if( autonego & 0x0140 ){ ETHERC.ECMR.BIT.DM = 1; // 全二重 } else{ ETHERC.ECMR.BIT.DM = 0; // 半二重 } /* MAC アドレスの設定 ( 上位 32 下位 16) */ ETHERC.MAHR = (mac_addr[0]<<24) (mac_addr[1]<<16) (mac_addr[2]<<8) mac_addr[3]; ETHERC.MALR.BIT.MA = (mac_addr[4]<<8) mac_addr[5]; /* ステータスのクリア */ ETHERC.ECSR.LONG = 0x00000037; } init_etherc ETHERC/EDMAC ソフトウェアリセット リンクモードの設定 MAC アドレスの設定 ETHERC ステータスのクリア return 33
EDMAC の初期化フロー main モジュールストップ解除 init_edmac 送信および受信ディスクリプタの設定 init_phylsi PHY-LSI の初期化 init_etherc ETHERC の初期化 init_edmac EDMAC の初期化 割り込みコントローラの設定 ディスクリプタの登録エンディアンの設定 FIFO 容量の設定受信方式の設定 送信および受信の許可 ETHERC/EDMAC ステータスのクリア A 割り込みの許可 return 34
ディスクリプタ設定の事前準備 -RAM 領域に配置 - RAM 領域 16 バイト境界 16 バイト境界 送信ディスクリプタ 1 面 =16 バイト 送信ディスクリプタ 2 面 =16 バイト 送信ディスクリプタ 3 面 =16 バイト 送信ディスクリプタ 4 面 =16 バイト 受信ディスクリプタ 1 面 =16 バイト 受信ディスクリプタ 2 面 =16 バイト 受信ディスクリプタ 3 面 =16 バイト 受信ディスクリプタ 4 面 =16 バイト ユーザ領域 (4 バイト ) ユーザ領域 (4 バイト ) 35
送信ディスクリプタ - 送信ディスクリプタ無効の設定 - 0 ユーザ領域 36
送信ディスクリプタ - 送信フレーム内位置の設定 - 11 ユーザ領域 37
送信ディスクリプタ - 送信バッファアドレスの設定 - 32 バイト境界 RAM 領域 送信バッファの先頭アドレス ユーザ領域 TBL( 送信データ ) が 16 バイト以下の場合 送信バッファは 32 バイト境界に配置 38
送信ディスクリプタ - 送信ディスクリプタ最終の設定 - 16 バイト境界 RAM 領域 送信ディスクリプタ 1 面 =16 バイト 送信ディスクリプタ 2 面 =16 バイト 送信ディスクリプタ 3 面 =16 バイト 送信ディスクリプタ 4 面 =16 バイト 0 1 ユーザ領域 ユーザ領域 39
受信ディスクリプタ - 受信ディスクリプタ有効の設定 - 1 ユーザ領域 40
受信ディスクリプタ - 受信フレーム内位置の設定 - 11 ユーザ領域 41
受信ディスクリプタ - 受信バッファの設定 - 32 バイト境界 バッファ長 先頭アドレス 32 n バイト ユーザ領域 42
受信ディスクリプタ - 受信ディスクリプタ最終の設定 - 16 バイト境界 RAM 領域 受信ディスクリプタ 1 面 =16 バイト 受信ディスクリプタ 2 面 =16 バイト 受信ディスクリプタ 3 面 =16 バイト 受信ディスクリプタ 4 面 =16 バイト 0 ユーザ領域 1 ユーザ領域 43
ディスクリプタ用の構造体記述例 ユーザ領域 ビットオーダー : ライト or レフトバイトオーダー : リトル or ビッグ 44
ディスクリプタとバッファの RAM 領域への配置 リンケージエディタのオプションで RAM 上の 32 の倍数のアドレスを設定する ETHER セクション 32 バイト境界 送信ディスクリプタ 1 面 送信ディスクリプタ 2 面 送信ディスクリプタ 3 面 送信ディスクリプタ 4 面 受信ディスクリプタ 1 面 受信ディスクリプタ 2 面 受信ディスクリプタ 3 面 受信ディスクリプタ 4 面 送信用ポインタ 受信用ポインタ 送信バッファ 4 1532 受信バッファ 4 1532 45
ディスクリプタの設定記述例 0 0 1 1 送信ディスクリプタとバッファ バッファ 1 のアドレス ディスクリプタ 2 面のアドレス 0 0 1 1 バッファ 1 バッファ 2 のアドレス ディスクリプタ 3 面のアドレス 0 0 1 1 バッファ 2 バッファ 3 のアドレス ディスクリプタ 4 面のアドレス 0 1 1 1 バッファ 3 バッファ 4 のアドレス ディスクリプタ 1 面のアドレス バッファ 4 46
ディスクリプタの登録 - 先頭アドレス - 送信ディスクリプタリスト先頭アドレスレジスタ (TDLAR) 受信ディスクリプタリスト先頭アドレスレジスタ (RDLAR) RAM 領域 送信ディスクリプタ 1 面 =16 バイト 送信ディスクリプタ 2 面 =16 バイト 送信ディスクリプタ 3 面 =16 バイト 送信ディスクリプタ 4 面 =16 バイト 受信ディスクリプタ 1 面 =16 バイト 受信ディスクリプタ 1 面 =16 バイト 受信ディスクリプタ 1 面 =16 バイト 受信ディスクリプタ 1 面 =16 バイト 47
ディスクリプタの登録 - ディスクリプタ長 - EDMAC モードレジスタ (EDMR) RAM 領域 送信ディスクリプタ 1 面 =16 バイト 送信ディスクリプタ 2 面 =16 バイト 送信ディスクリプタ 3 面 =16 バイト 送信ディスクリプタ 4 面 =16 バイト 受信ディスクリプタ 1 面 =16 バイト 受信ディスクリプタ 2 面 =16 バイト 受信ディスクリプタ 3 面 =16 バイト 受信ディスクリプタ 4 面 =16 バイト 48
EDMAC モードレジスタ (EDMR) - エンディアンの設定 - 49
FIFO 容量指定レジスタ (FDR) -FIFO 容量の設定 - 50
受信方式制御レジスタ (RMCR) - 受信方式の設定 - 連続受信を有効 51
ETHERC/EDMAC ステータスレジスタ (EESR) - ステータスフラグのクリア - 各ビット 1 を書き込むとクリアされる 52
ETHERC/EDMAC ステータス割り込み許可レジスタ (EESIPR) - フレーム受信割り込み - 53
EDMAC の初期化関数 void init_edmac(void) { /* ディスクリプタリストの設定 */ _setdesc(); /* ディスクリプタリストの登録 */ // 送信ディスクリプタの先頭アドレス EDMAC.TDLAR = (void *)desc.snd; // 受信ディスクリプタの先頭アドレス EDMAC.RDLAR = (void *)desc.rcv; // ディスクリプタリスト長 =16 バイト EDMAC.EDMR.BIT.DL = 0; /* エンディアンの設定 ( リトルエンディアン ) */ EDMAC.EDMR.BIT.DE = 1; /* FIFO 容量 ( 送受信ともに 2048 バイト ) */ EDMAC.FDR.LONG = 0x00000707; /* 受信方式の設定 ( 連続受信を有効 ) */ EDMAC.RMCR.BIT.RNR = 1; /* ステータスのクリア */ EDMAC.EESR.LONG = 0x47FF0F9F; /* フレーム受信割り込み要求許可 */ EDMAC.EESIPR.BIT.FRIP = 1; } init_edmac 送信および受信ディスクリプタの設定 ディスクリプタの登録 エンディアンの設定 FIFO 容量の設定 受信方式の設定 ETHERC/EDMAC ステータスのクリア 割り込みの許可 return 54
割り込みコントローラの設定フロー main モジュールストップ解除 割り込みコントローラ CPU init_phylsi PHY-LSI の初期化 init_etherc ETHERC の初期化 ETHER の割り込み要求を許可 ETHER の IER( 許可 ) ETHER の IPR( 優先レベル ) init_edmac EDMAC の初期化 割り込み優先レベルを設定 割り込みコントローラの設定 送信および受信の許可 その他要因 A フレーム受信割り込み 55
割り込み要求許可レジスタ m(ierm)(m = 02h ~ 1Fh) ETHER 割り込み要求の設定 :IER04 C 言語マクロ表記 :IEN(ETHER,EINT) = 1; 56
割り込み要因プライオリティレジスタ m(iprm)(m= 00h~8Fh) ETHER 割り込み :IPR08 C 言語マクロ表記 :IPRETHER,EINT)=1; 57
送信および受信の許可 main モジュールストップ解除 init_phylsi PHY-LSI の初期化 init_etherc ETHERC の初期化 init_edmac EDMAC の初期化 割り込みコントローラの設定 送信および受信の許可 受信 EDMAC の起動 ETHERC の送信機能と受信機能を許可 送信 EDMAC は送信時に起動 A 58
EDMAC 受信要求レジスタ (EDRRR) - 受信 EDMAC の起動 - 59
ETHERC モードレジスタ (ECMR) - 送受信の許可 - 60
初期化プログラム void main(void) { uint16_t autonego; /* モジュールストップの解除 */ MSTP(EDMAC) = 0; /* PHY-LSI の初期化 */ autonego = init_phylsi(); /* ETEHRC の初期化 */ init_etherc( autonego ); /* EDMAC の初期化 */ init_edmac(); /* 割り込みコントローラの設定 */ // EINT 割り込み要求許可 IEN(ETHER,EINT) = 1; // EINT 割り込み優先レベル 1 IPR(ETHER,EINT) = 1; /* 送受信許可 */ // 受信 EDMAC の起動 EDMAC.EDRRR.BIT.RR = 1; // ETHERC 送信許可 ETHERC.ECMR.BIT.TE = 1; // ETHERC 受信許可 ETHERC.ECMR.BIT.RE = 1; main モジュールストップ解除 init_phylsi PHY-LSI の初期化 init_etherc ETHERC の初期化 init_edmac EDMAC の初期化 割り込みコントローラの設定 送信および受信の許可 A 61
送信処理 ETHER 割り込み main A ステータスの確認 モジュールストップ解除 snd_frame イーサネットフレームの送信 フレーム受信割り込み? Yes No init_phylsi PHY-LSI の初期化 No 10 フレーム送信完了? rcv_frame イーサネットフレームの受信 init_etherc ETHERC の初期化 Yes 10 フレーム目? No Yes init_edmac EDMAC の初期化 フレーム受信割り込みを禁止 割り込みコントローラの設定 ステータスのクリア 0 が読み出せるまで待つ 送信および受信の許可 A No 割り込み要求なし? Yes END 初期化送信受信 62
送信関数の仕様 概要 宣言 説明 1 フレーム送信 int snd_frame(void *data, int size); 引数に指定されたフレームを 送信バッファにコピーして 次に書き込むディスクリプタの位置 ( 面 ) を更新します また 送信ディスクリプタが停止していれば再起動します 引数 void *data int size 送信フレームの先頭アドレス 送信フレームのバイト数 戻り値 バッファに書き込んだバイト数 ( 書き込み先が有効でない場合は 0 を返します ) 注意事項 本関数は 送信バッファに書き込み後 送信完了を待たずに呼び出し元に戻ります 63
送信関数のフロー (1) snd_frame ディスクリプタを示すポインタ 送信ディスクリプタを示すポインタの取得 送信中? Yes No 送信バッファにデータをコピー データ長を設定 送信ディスクリプタを有効に設定 EDMAC 停止中? Yes 送信 EDMAC を起動 No : 送信バッファ 送信ディスクリプタを示すポインタの更新 return 64
送信関数のフロー (2) snd_frame ディスクリプタを示すポインタ 送信ディスクリプタを示すポインタの取得 送信中? Yes No 送信バッファにデータをコピー データ長を設定 送信ディスクリプタを有効に設定 EDMAC 停止中? Yes 送信 EDMAC を起動 No : 送信バッファ 送信ディスクリプタを示すポインタの更新 return 65
送信関数のフロー (3) snd_frame 送信ディスクリプタを示すポインタの取得 ディスクリプタを示すポインタ 0 送信中? Yes No 送信バッファにデータをコピー サイズ データ長を設定 送信ディスクリプタを有効に設定 EDMAC 停止中? Yes 送信 EDMAC を起動 No 1 フレーム : 1 フレーム 送信バッファ 送信ディスクリプタを示すポインタの更新 return 66
送信関数のフロー (4) snd_frame 送信ディスクリプタを示すポインタの取得 ディスクリプタを示すポインタ 1 送信中? Yes No 送信バッファにデータをコピー データ長を設定 送信ディスクリプタを有効に設定 EDMAC 停止中? Yes 送信 EDMAC を起動 No : 1 フレーム 送信バッファ 送信ディスクリプタを示すポインタの更新 return 67
EDMAC 送信要求レジスタ (EDTRR) 68
送信関数のフロー (5) snd_frame ディスクリプタを示すポインタ 送信ディスクリプタを示すポインタの取得 送信中? Yes No 送信バッファにデータをコピー データ長を設定 送信ディスクリプタを有効に設定 EDMAC 停止中? Yes 送信 EDMAC を起動 No : 1 フレーム 送信バッファ 送信ディスクリプタを示すポインタの更新 return 69
1 フレーム送信関数 int snd_frame(void *data, int size) { int i; int datalen = 0; volatile SND_DESC *snd_top; uint8_t *frame = data; // 送信ディスクリプタを示すポインタの取得 snd_top = getsndtop(); if( snd_top->td0.bit.tact == 0 ){ datalen = size; for( i=0; i<datalen; i++){ *(snd_top->td2.tba+i) = *(frame+i); } snd_top->td1.tbl = datalen; snd_top->td0.bit.tact = 1; if( EDMAC.EDTRR.BIT.TR == 0 ){ EDMAC.EDTRR.BIT.TR = 1; } // 送信ディスクリプタを示すポインタの更新 updatesndtop(); } return datalen; } 70
受信 ETHER 割り込み main A ステータスの確認 モジュールストップ解除 snd_frame イーサネットフレームの送信 フレーム受信割り込み? Yes No init_phylsi PHY-LSI の初期化 No 10 フレーム送信完了? rcv_frame イーサネットフレームの受信 init_etherc ETHERC の初期化 Yes 10 フレーム目? No Yes init_edmac EDMAC の初期化 フレーム受信割り込みを禁止 割り込みコントローラの設定 ステータスのクリア 0 が読み出せるまで待つ 送信および受信の許可 A No 割り込み要求なし? Yes END 初期化送信受信 71
受信関数の仕様 概要 宣言 説明 1 フレーム受信 int rcv_frame(void *buff); 引数で指定されたバッファに 受信データをコピーして 次に読み出すディスクリプタの位置 ( 面 ) を更新します また 受信ディスクリプタが停止していれば再起動します 引数 void *buff コピー先バッファの先頭アドレス 戻り値 バッファにコピーしたバイト数 ( エラー受信または受信データがない場合は 0 を返します ) 注意事項 なし 72
受信関数のフロー (1) rcv_frame ディスクリプタを示すポインタ 受信ディスクリプタを示すポインタの取得 受信待ち? Yes No 正常受信? Yes 受信バッファの読み出し No 受信ディスクリプタを有効に設定 EDMAC 停止中? Yes 受信 EDMAC を起動 No : 受信バッファ 受信ディスクリプタを示すポインタの更新 return 73
受信関数のフロー (2) rcv_frame 受信ディスクリプタを示すポインタの取得 受信待ち? Yes ディスクリプタを示すポインタ No No 正常受信? Yes 受信バッファの読み出し サイズ 0 0 正常受信? 受信データ長 受信ディスクリプタを有効に設定 EDMAC 停止中? Yes 受信 EDMAC を起動 No 1 フレーム : 1 フレーム 受信バッファ 受信ディスクリプタを示すポインタの更新 return 74
受信関数のフロー (3) rcv_frame 受信ディスクリプタを示すポインタの取得 ディスクリプタを示すポインタ 1 受信待ち? Yes No 正常受信? Yes 受信バッファの読み出し No 受信ディスクリプタを有効に設定 EDMAC 停止中? Yes 受信 EDMAC を起動 No : 受信バッファ 受信ディスクリプタを示すポインタの更新 return 75
受信関数のフロー (4) rcv_frame ディスクリプタを示すポインタ 受信ディスクリプタを示すポインタの取得 受信待ち? Yes No 正常受信? Yes 受信バッファの読み出し No 受信ディスクリプタを有効に設定 EDMAC 停止中? Yes 受信 EDMAC を起動 No : 受信バッファ 受信ディスクリプタを示すポインタの更新 return 76
1 フレーム受信関数 int rcv_frame(void *buff) { int i; int datalen = 0; volatile RCV_DESC *rcv_end; uint8_t *rcv_buff = buff; // 受信ディスクリプタを示すポインタの取得 rcv_end = getrcvend(); if( rcv_end->rd0.bit.ract == 0 ){ if( rcv_end->rd0.bit.rfe == 0 ){ datalen = rcv_end->rd1.rfl; for( i=datalen; i>=0; i--){ *(rcv_buff+i) = *(rcv_end->rd2.rba+i); } } rcv_end->rd0.bit.ract = 1; if( EDMAC.EDRRR.BIT.RR == 0 ){ EDMAC.EDRRR.BIT.RR = 1; } // 受信ディスクリプタを示すポインタの更新 updatercvend(); } return datalen; } rcv_frame 受信ディスクリプタを示すポインタの取得 受信待ち? return Yes No 正常受信? Yes 受信バッファの読み出し 受信ディスクリプタを有効に設定 EDMAC 停止中? Yes 受信 EDMAC を起動 受信ディスクリプタを示すポインタの更新 No No 77
PHY-LSI の注意点 78
インタフェース対応 RX63N RX63N OR #if ETH_MODE_SEL == ETH_RMII_MODE MII インタフェースの処理 #endif #if ETH_MODE_SEL == ETH_MII_MODE #endif RMII インタフェースの処理 79
PHY アドレス対応 #define PHY_ADDR 0x1 80
MII レジスタのビット構成対応 MII レジスタ 0 番 b15 b14 b13 b12 b11 b10 b9 b8 Reset Loopback Speed Select A/N Enable Power Down Isolate Restart A/N Duplex Mode b7 b6 b5 b4 b3 b2 b1 b0 Collision Test Reserved Reserved Reserved Reserved Reserved Reserved Reserved /* Reset PHY */ _phy_write(basic_mode_control_reg, 0x8000); MII レジスタ = ライトレジスタ番号 =0 最上位ビットを 1= リセット 81
END ルネサスエレクトロニクス株式会社