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