製品に関する情報が記載されております。 - Cypress Semiconductor

本ドキュメントはCypress (サイプレス) 製品に関する情報が記載されております。
イーサネットドライバマニュアル
32-BIT MICROCONTROLLER
FM3 ファミリ アプリケーションノート
APPLICATION NOTE
ARM is the registered trademark of ARM Limited in the EU and other countries.
Cortex is the trademark of ARM Limited in the EU and other countries.
Publication Number AN706-00059
Revision 1.1
Issue Date January 31, 2014
A P P L I C A T I O N
N O T E
AN706-00059-1v1-J, January 31, 2014
A P P L I C A T I O N
N O T E
目次
目次 ...................................................................................................................................... 3
対象製品 ............................................................................................................................... 5
1
イントロダクション ...................................................................................................... 6
2
イーサネットドライバ構造............................................................................................ 7
3
2.1
ドライバのファイル構成 ........................................................................................ 7
2.2
追加ファイル(ドライバ単体の場合) ....................................................................... 7
2.3
サンプルファイル(ドライバ単体の場合) ................................................................ 7
2.4
ドライバシステム ................................................................................................... 8
2.5
割込みフロー .......................................................................................................... 9
イーサネットドライバの使用方法 ............................................................................... 10
3.1
emac_user.h でのユーザ設定 ............................................................................... 10
3.1.1
イーサネットの起動 ...................................................................................... 10
3.1.2
割込みモード ................................................................................................. 10
3.1.3
割込み優先度 ................................................................................................. 10
3.1.4
バッファの位置(EMAC0 の例) ...................................................................... 11
3.1.5
送受信リングサイズ(EMAC0 の例) ............................................................... 11
3.1.6
送受信バッファサイズ(EMAC0 の例) ............................................................ 11
3.1.7
EMAC1 のバッファ設定 ................................................................................ 11
3.1.8
スターターキットの設定 ............................................................................... 12
3.1.9
外付け PHY のアドレス ................................................................................ 12
3.1.10
EMAC0/EMAC1 の MAC アドレス ................................................................ 13
3.1.11
マルチキャストアドレス ............................................................................... 13
3.1.12
外付け PHY のリセットピン ...................................................................... 14
3.1.13
PLL クロックモード ...................................................................................... 14
3.1.14
PHY のマネジメントバス設定 ....................................................................... 14
3.1.15
RMII インタフェースの使用 .......................................................................... 15
3.1.16
バッファのフラグメンテーション ............................................................. 15
3.1.17
チェックサム挿入制御 ............................................................................... 15
3.1.18
ICMP チェックサムバグの回避方法 .............................................................. 16
3.1.19
マルチキャストアドレスフィルタ ............................................................. 17
3.2
emac.c での追加設定 ........................................................................................... 18
3.2.1
3.3
マルチキャスト MAC アドレスのフィルタ設定 ............................................ 18
サンプルの使用方法 ............................................................................................. 18
3.3.1
イーサネットインタフェースのセットアップ方法........................................ 18
January 31, 2014, AN706-00059-1v1-J
3
A P P L I C A T I O N
4
5
3.3.2
フレームの送信方法 ...................................................................................... 19
3.3.3
フレームの受信方法 ...................................................................................... 19
3.3.4
割込み処理 .................................................................................................... 20
イーサネットドライバのコンフィグレーションとデータ型........................................ 21
4.1
はじめに ............................................................................................................... 21
4.2
コンフィグレーションの構造体 ........................................................................... 21
4.3
リンクステータスの enum 型 ............................................................................... 21
4.4
リンクモードの enum 型 ...................................................................................... 21
イーサネットドライバ API .......................................................................................... 22
5.1
6
N O T E
はじめに ............................................................................................................... 22
5.1.1
Emac_Init() .................................................................................................... 22
5.1.2
Emac_DeInit() ............................................................................................... 22
5.1.3
Emac_TxFrame() .......................................................................................... 23
5.1.4
Emac_GetRxFrameLength() ......................................................................... 23
5.1.5
Emac_RxFrame() .......................................................................................... 23
5.1.6
Emac_GetLinkStatus() .................................................................................. 24
5.1.7
Emac_GetLinkMode() ................................................................................... 24
5.1.8
Emac_SetLinkMode() .................................................................................... 25
5.1.9
Emac_Autonegotiate() ................................................................................... 25
5.1.10
Emac_SetDescToTxBuf() .............................................................................. 26
5.1.11
Emac_SetDescToRxBuf() .............................................................................. 26
5.1.12
Emac_SetEcout() .......................................................................................... 27
5.1.13
Emac_RxFrame_GetBufPtr() ........................................................................ 27
5.1.14
Emac_RxFrame_ReleaseBuf()...................................................................... 27
追加情報 ...................................................................................................................... 28
改版履歴 ............................................................................................................................. 29
4
AN706-00059-1v1-J, January 31, 2014
A P P L I C A T I O N
N O T E
対象製品
本アプリケーションノートに記載されている内容の対象製品は、下記の通り
です。
(TYPE2)
シリーズ名
品種型格(パッケージサフィックスは除く)
MB9B210T
MB9BF216T, MB9BF217T, MB9BF218T,
MB9BF216S,MB9BF217S,MB9BF218S
MB9B610T
MB9BF616T, MB9BF617T, MB9BF618T,
MB9BF616S,MB9BF617S,MB9BF618S
MB9BD10T
MB9BFD16T, MB9BFD17T, MB9BFD18T,
MB9BFD16S,MB9BFD17S,MB9BFD18S
January 31, 2014, AN706-00059-1v1-J
5
A P P L I C A T I O N
1
N O T E
イントロダクション
本イーサネットドライバは FM3 デバイス向けの低レベルドライバです。
ドライバ単体もしくは FM3 向け低レベルライブラリ(LLL:Low Level Library)として統合し
たものを利用できます。
6
AN706-00059-1v1-J, January 31, 2014
A P P L I C A T I O N
2
N O T E
イーサネットドライバ構造
本章ではイーサネットドライバの構造を説明します。
ドライバのファイル構成
2.1
イーサネットドライバは、emac フォルダに下記のファイルを格納しています。

emac.c
イーサネット API

emac.h
イーサネット API のヘッダファイル

emac_reg.h
イーサネットレジスタのビットフィールド定義

emac_user.h
イーサネットドライバのユーザ設定ファイル

ethphy.c
イーサネット PHY 向け関数

ethphy.h
イーサネット PHY 向け関数ヘッダファイル
追加ファイル(ドライバ単体の場合)
2.2
本ドライバを単体で使用する場合、l3 フォルダに格納されている下記のファイルを使用し
なければいけません。これは、FM3 向け低レベルライブラリ(LLL)として使用しないことを
意味します。

interrupts.c
イーサネット ISR

interrupts.h
イーサネット ISR のヘッダファイル

l3.c
LLL からの抜粋(Hook 処理のみ)

l3.h
l3.c のヘッダファイル

usbethenetclock.c
LLL クロックモジュール

usbethenetclock.h
LLL クロックモジュールヘッダファイル
サンプルファイル(ドライバ単体の場合)
2.3
イーサネットドライバの使用例を示すため、main.c 以外に下記の testframework フォルダの
ソフトウェアパッケージがあります。

port.c
SK-FM3-176PMC-ETHERNET 評価ボード向け GPIO 関数

port.h
GPIO 関数のヘッダファイル

scheduler.c
スケジューラ関数

scheduler.h
スケジューラ関数のヘッダファイル

stacklessudp.c
UDP 関数(TCP/IP スタックなし)

stacklessudp.h
UDP 関数(TCP/IP スタックなし)のヘッダファイル

tasks.c
サンプルタスク関数

tasks.h
サンプルタスク関数のヘッダファイル

uart.c
UART の初期化と printf 関数のための低レベル関数

uart.h
UART 関数のヘッダファイル
January 31, 2014, AN706-00059-1v1-J
7
A P P L I C A T I O N
2.4
N O T E
ドライバシステム
下記の図はイーサネット MAC を 1 つ使用した場合のイーサネットドライバの動作を表して
います。
アプリケーション
イーサネット
構成データ
内部データ
イーサネット API
(emac.c/.h)
EMAC PHY 関数
(ethphy.c/.h)
内部
外部
イーサネット PHY
図 2-1 ドライバ構造の例
8
AN706-00059-1v1-J, January 31, 2014
A P P L I C A T I O N
2.5
N O T E
割込みフロー
下記のフローは L3 ハンドラがどのように割込まれるかを表しています。
Application
割込み発生
ISR-Callback
interrupts.c
ResourceName.c
IRQ
Name_Handler(void)
IRQxxMN をリードし、
どの IRQ 関数をコール
するべきか確認する
コール
NameIrqHandler((stc_Namen_t*)&Name,
&(m_astcNameInstanceDataLut ¥
[NameInstanceIndexNameo] ¥
.stcInernData))
pstcNameInternData->pfnCallbackName()
NameCallbackFunction()
リターン
リターン
再開
図 2-2 割込みとコールバックのフロー
January 31, 2014, AN706-00059-1v1-J
9
A P P L I C A T I O N
N O T E
イーサネットドライバの使用方法
3
イーサネットドライバのセットアップ方法を説明します。
3.1
emac_user.h でのユーザ設定
emac_user.h ファイルは、コンパイルする際に必要となるイーサネットドライバの構成を設
定できます。システム実行後にはコールバック関数を設定できます。これは 4.2 章に記載し
ています。
3.1.1 イーサネットの起動
L3_ON を設定することによりイーサネット MAC を有効にします。使用する FM3 に 2 つの
イーサネット MAC がついている場合は、別々に設定します。
/**
******************************************************************************
** ¥brief User Defines for EMAC resource enable
**
** Possible definitions are L3_ON and L3_OFF.
**
******************************************************************************/
// EMAC
#define L3_PERIPHERAL_ENABLE_EMAC0 L3_ON
#define L3_PERIPHERAL_ENABLE_EMAC1 L3_ON
3.1.2 割込みモード
イーサネット IRQ サポートを使用する場合は、L3_ON を設定してください。割込み発生後
は ETHER_MACx_IRQHandler()がコールされます。
/**
******************************************************************************
** ¥brief Activate IRQ support for Ethernet driver
**
** Possible definitions are L3_ON and L3_OFF.
**
******************************************************************************/
#define EMAC_INTERRUPT_MODE
L3_OFF
3.1.3
割込み優先度
割込みの優先度はイーサネット MAC それぞれに設定できます。
/**
******************************************************************************
** ¥brief User Emac Interrupt level settings
**
** Possible values are 0 (high priority) to 15 (low priority)
******************************************************************************/
#define L3_IRQ_LEVEL_EMAC0
2
#define L3_IRQ_LEVEL_EMAC1
4
10
AN706-00059-1v1-J, January 31, 2014
A P P L I C A T I O N
3.1.4
N O T E
バッファの位置(EMAC0 の例)
ユーザはバッファを、ドライバ内部もしくはアプリ側で持つかを選択できます。L3_ON を
設定することで、ドライバ内部にバッファを持ちます。
/**
******************************************************************************
** ¥brief EMAC0 User/Driver Buffer location
**
** L3_ON: Driver buffer are used
** L3_OFF: User has to provide buffer memory
******************************************************************************/
#define EMAC0_BUFFERS_IN_DRIVERSPACE L3_ON
3.1.5 送受信リングサイズ(EMAC0 の例)
下記の定義から、送受信のリングサイズ(バッファの数)を設定できます。
/**
******************************************************************************
** ¥brief EMAC0 Transmission/Reception Ring size
******************************************************************************/
#define EMAC0_TX_RING_SIZE
2
#define EMAC0_RX_RING_SIZE
4
3.1.6 送受信バッファサイズ(EMAC0 の例)
送受信バッファサイズを設定できます。必ず 4 の倍数に設定してください。
/**
******************************************************************************
** ¥brief EMAC0 Transmission/Reception Buffer size
**
** Only used if EMAC0_BUFFERS_IN_DRIVERSPACE == L3_ON
** Must be multiple of 4, 13 Bit value, page 159
******************************************************************************/
#define EMAC0_TX_BUF_SIZE
1520
#define EMAC0_RX_BUF_SIZE
1520
3.1.7
EMAC1 のバッファ設定
EMAC1 のバッファの位置、リングサイズ、バッファサイズに対しても上記と同様に設定で
きます。
January 31, 2014, AN706-00059-1v1-J
11
A P P L I C A T I O N
N O T E
3.1.8 スターターキットの設定
使用するスターターキットを設定できます。スターターキットを使用しない場合は
ターゲットボード別にポート初期化処理を追加してください。
/**
******************************************************************************
** ¥brief Support for Fujitsu starterkits
**
** Activate board specific settings by defining exactly one of these symbols:
**
** SK_FM3_176PMC_ETHERNET frm Fujitsu Semiconductor Europe:
** STARTERKIT_SK_FM3_176PMC_ETHERNET
**
** If version 1.0 is used, please use add itionally:
** SK_FM3_176PMC_ETHERNET_BOARDVERSION10
**
** FSSDC-9B618-EVB from Fujitsu Semiconductor Limited Asia:
** STARTERKIT_FSSDC9B618EVB
**
******************************************************************************/
#define STARTERKIT_SK_FM3_176PMC_ETHERNET
//#define SK_FM3_176PMC_ETHERNET_BOARDVERSION10
//#define STARTERKIT_FSSDC9B618EVB
3.1.9 外付け PHY のアドレス
下記のように、使用する外付け PHY のアドレスをそれぞれ設定できます。本設定は使用す
るボードによって異なります。
/**
******************************************************************************
** ¥brief Addresses of the used external PHYs
******************************************************************************/
#define EMAC0_PHY_ADDRESS
0
#define EMAC1_PHY_ADDRESS
1
12
AN706-00059-1v1-J, January 31, 2014
A P P L I C A T I O N
N O T E
3.1.10 EMAC0/EMAC1 の MAC アドレス
MAC アドレスをそれぞれ設定できます。
/**
******************************************************************************
** ¥brief EMAC0 MAC address
******************************************************************************/
#define EMAC0_MAC_ADDRESS0 0x00
#define EMAC0_MAC_ADDRESS1 0x01
#define EMAC0_MAC_ADDRESS2 0x01
#define EMAC0_MAC_ADDRESS3 0x66
#define EMAC0_MAC_ADDRESS4 0x73
#define EMAC0_MAC_ADDRESS5 0x42
/**
******************************************************************************
** ¥brief EMAC1 MAC address
******************************************************************************/
#define EMAC1_MAC_ADDRESS0 0x00
#define EMAC1_MAC_ADDRESS1 0x01
#define EMAC1_MAC_ADDRESS2 0x01
#define EMAC1_MAC_ADDRESS3 0x66
#define EMAC1_MAC_ADDRESS4 0x73
#define EMAC1_MAC_ADDRESS5 0x38
3.1.11 マルチキャストアドレス
マルチキャストアドレスの設定例を示します。
/**
******************************************************************************
** ¥brief Multicast address
******************************************************************************/
#define MULTICAST_ADDRESS0 0x00
#define MULTICAST_ADDRESS1 0x00
#define MULTICAST_ADDRESS2 0x00
#define MULTICAST_ADDRESS3 0x00
#define MULTICAST_ADDRESS4 0x00
#define MULTICAST_ADDRESS5 0x00
January 31, 2014, AN706-00059-1v1-J
13
A P P L I C A T I O N
N O T E
3.1.12 外付け PHY のリセットピン
外付け PHY のリセット入力がどのピンにつながっているかをドライバに設定する必要があ
ります。これにはヘッダファイルで定義されている、GPIO のビットバンドエイリアスへの
アドレスポインタを使用します。設定方法の例を下記に示します。ここでは、P45 が PHY0、
P44 が PHY1 のリセットピンとして設定しています。
/**
******************************************************************************
** ¥brief External PHY reset pins
**
** Use GPIO addresses of the bit-band alias definitions of the device header
** file.
******************************************************************************/
#define EMAC0_PHY_RESET_PIN ((uint32_t*) &bFM3_GPIO_PDOR4_P5)
#define EMAC1_PHY_RESET_PIN ((uint32_t*) &bFM3_GPIO_PDOR4_P4)
3.1.13 PLL クロックモード
下記の定義は、外部 PHY に PLL を使用するかどうかを設定します。
/**
******************************************************************************
** ¥brief PLL for External PHY
**
** L3_ON: PLL is used for PHY clock
** L3_OFF: PLL is not used for PHY clock
******************************************************************************/
#define EMAC_ECOUT L3_OFF
3.1.14 PHY のマネジメントバス設定
下記の定義により、EMAC と外付け PHY とをつなげるマネジメントバスを指定できます。
本定義は、両方の PHY が共通のマネジメントバスにつながっている場合に設定してくださ
い。
/**
******************************************************************************
** ¥brief Management Bus Definition
******************************************************************************/
#define EMAC0_MANAGEMENTBUS
EMAC0
#define EMAC1_MANAGEMENTBUS
EMAC1
14
AN706-00059-1v1-J, January 31, 2014
A P P L I C A T I O N
N O T E
3.1.15 RMII インタフェースの使用
下記の定義に L3_ON を使用することで、PHY のインタフェースを RMII に設定できます。
L3_OFF の場合は MII が設定されます。2 つのイーサネット MAC を同時に使用するために
は RMII に設定する必要があります。
/**
******************************************************************************
** ¥brief RMII PHY interface usage
******************************************************************************/
#define EMAC_PHYINTERFACE_RMII
L3_ON
3.1.16 バッファのフラグメンテーション
L3_ON に設定することで、全てのバッファをフラグメントしないように設定できます。こ
れは L3_ON に設定することを推奨します。
/**
******************************************************************************
** ¥brief EMAC Buffer fragmentation
**
** All buffers are large enough to contain a whole Ethernet frame (MTU size)
******************************************************************************/
#define EMAC_BUFFERS_NOT_FRAGMENTED
L3_ON
3.1.17 チェックサム挿入制御
FM3 に搭載のイーサネット MAC はチェックサムをハードウェアで計算する機能がありま
す。下記のとおり設定することで本機能を使用できます。
0 : チェックサム挿入がディセーブルされる
1 : IP ヘッダチェックサムの計算と挿入のみがイネーブルされる
2 : IP ヘッダチェックサムとペイロードチェックサムの計算と挿入がイネーブルされるが、
擬似ヘッダチェックサムはハードウェアでは計算されない
3 : IP ヘッダチェックサムとペイロードチェックサムの計算と挿入がイネーブルされ、
擬似ヘッダチェックサムがハードウェアで計算される
January 31, 2014, AN706-00059-1v1-J
15
A P P L I C A T I O N
N O T E
/**
******************************************************************************
** ¥brief CIC (Checksum Insertion Control)
**
** These bits control the checksum calculation and insertion. Bit encodings
** are as shown below.
** - 0 Checksum Insertion Disabled.
** - 1 Only IP header checksum calculation and insertion are enabled.
** - 2 IP header checksum and payload checksum calculation and insertion are
**
enabled, but pseudo-header checksum is not calculated in hardware.
** - 3 IP Header checksum and payload checksum calculation and insertion are
**
enabled, and pseudo-header checksum is calculated in hardware.
******************************************************************************/
#define EMAC_COE_MODE 3
3.1.18 ICMP チェックサムバグの回避方法
L3_ON を設定することで、ドライバはチェックサムフィールドの ping 応答(echo 応答)に 0
を上書きします。本オプションは、EMAC_COE_MODE を 3 に設定していて、さらにシス
テムに対して ping コマンドを送っている間にチェックサムエラーを検出する場合に設定し
てください。本マクロは uIP スタックもしくは LwIP スタックを使用している場合にのみ影
響します。
/**
******************************************************************************
** ¥brief Activate work-around for bug in uIP and LwIP TCP/IP stacks
**
** For the Checksum Offload Engine to work correctly, the checksum fields in
** the IP header, as well as in the TCP, UDP or ICMP header must be 0.
**
** LwIP up to the recent stable 1.4.0 version, and current uIP have an option
** to disable software checksum calculation for IP, UDP and TCP.
** A similar option ICMP was (apparently by accident) omitted.
**
** If EMAC_ENABLE_ICMP_CHECKSUM_BUG_WORKAROUND is set to L3_ON,
** every frame to be sent will be checked if it is an ICMP echo reply
** and if so, its checksum field cleared.
**
** This slows down every packet transmission and should be fixed in the
** original code. This is a known bug and is expected to be fixed
** in future releases of LwIP.
**
** For other TCP/IP stacks, this work-around is usually not necessary
** and should be disabled.
**
** Fujitsu tries to retain third-party software in software examples in its
** original state as far as possible in order to retain compatibility to the
** maximum possible extend.
**
******************************************************************************/
#define EMAC_ENABLE_ICMP_CHECKSUM_BUG_WORKAROUND
L3_ON
16
AN706-00059-1v1-J, January 31, 2014
A P P L I C A T I O N
N O T E
3.1.19 マルチキャストアドレスフィルタ
L3_ON を設定することで、ユーザはマルチキャストアドレスでフィルタされたフレームを
受信できます。
/**
******************************************************************************
** ¥brief Activate multicast filtering
**
** L3_ON: Multicast filtering is used
** L3_OFF: Multicast filtering is not used
******************************************************************************/#
define EMAC_MULTICAST_FILTER
L3_OFF
January 31, 2014, AN706-00059-1v1-J
17
A P P L I C A T I O N
N O T E
emac.c での追加設定
3.2
ユーザは下記のサンプルコードを加えることで様々な機能を使用できます。
3.2.1
マルチキャスト MAC アドレスのフィルタ設定
Emac_Autonegotiate 関数内に下記のサンプルコードを加えることで、マルチキャストアド
レスでフィルタしたフレームを受信できます。本サンプルコードは、マルチキャストアド
レスのビット 0~ビット 7 をマスクした値でフィルタします。
pstcEmac->MAR1H |= (uint32_t)0x20000000;
pstcEmac->MAR1H |= (uint32_t)0x80000000;
pstcEmac->MAR1H = (uint32_t)(((au8GenericMulticast[5]) << 8)
|((au8GenericMulticast[4]) << 0)
);
pstcEmac->MAR1L = (uint32_t)(((au8GenericMulticast[3]) << 24)
|((au8GenericMulticast[2]) << 16)
|((au8GenericMulticast[1]) << 8)
|((au8GenericMulticast[0]) << 0));
サンプルの使用方法
3.3
本章ではサンプルコードの具体的な使い方を説明します。
3.3.1
イーサネットインタフェースのセットアップ方法
EMAC0 と EMAC1 を両方使用する場合、下記のように初期化します。MCU の端子機能を
初期化後に Emac_Init 関数をコールしてください。必要であれば、あらかじめコールバック
関数も設定してください。
stc_emac_config_t stcEmacConfig;
// Board pins setting for using Ethernet
ConfigureEthernetPins();
// callback functions setting for EMAC0
stcEmacConfig.pfnRxCallback = EMAC0RxCallbackFunc;
stcEmacConfig.pfnTxCallback = EMAC0TxCallbackFunc;
// Ethernet MAC 0 initialization
Emac_Init(&EMAC0, &stcEmacConfig);
Emac_Autonegotiate(&EMAC0);
// callback functions setting for EMAC1
stcEmacConfig.pfnRxCallback = EMAC1RxCallbackFunc;
stcEmacConfig.pfnTxCallback = EMAC1TxCallbackFunc;
// Ethernet MAC 1 initialization
Emac_Init(&EMAC1, &stcEmacConfig);
Emac_Autonegotiate(&EMAC1);
18
AN706-00059-1v1-J, January 31, 2014
A P P L I C A T I O N
N O T E
3.3.2 フレームの送信方法
初期化後に Emac_TxFrame 関数をコールすることでフレームを送信できます。本関数を使
用するには EMAC のポインタ、バッファのアドレス、バッファの長さを設定する必要があ
ります。あらかじめバッファにプロトコルヘッダとペイロードを設定してください。下記
のサンプルは UDP フレームを送信しています。
uint8_t ua8EthBuf[1500];
uint8_t ua8Payload[] = "Hello World!”;
// setting of UDP header
TxBufferUDPFill(ua8EthBuf, ua8Payload, sizeof(ua8Payload));
ua8EthBuf[42 + sizeof(ua8Payload) - 3] = (u8NumberOfCalls + '0');
// transmit a frame
Emac_TxFrame(&EMAC0, ua8EthBuf, 42 + sizeof(ua8Payload));
3.3.3
フレームの受信方法
割 込 み モ ー ド を 有 効 に し て い る 場 合 、 Emac_RxFrame_GetBufPtr 関 数 を コ ー ル 後 に
memcpy 関 数 を 使 用 す る こ と で フ レ ー ム を 受 信 で き ま す 。 フ レ ー ム 受 信 後 、
Emac_RxFrame_ReleaseBuf 関数をコールして次のディスクリプタを設定する必要があり
ます。割込みモードを無効にしている場合、Emac_RxFrame 関数をコールすることで
フレームを受信できます。
#if (EMAC_INTERRUPT_MODE == L3_ON)
buffer =(u8_t *) Emac_RxFrame_GetBufPtr(pstcEmac);
if (NULL != buffer)
{
memcpy((u8_t*)p->payload, buffer, p->len);
}
Emac_RxFrame_ReleaseBuf(pstcEmac);
#else
p->len = Emac_RxFrame(pstcEmac,p->payload);
#endif
January 31, 2014, AN706-00059-1v1-J
19
A P P L I C A T I O N
N O T E
割込み処理
3.3.4
割込みを使用する場合、EMAC_INTERRUPT_MODE(3.1.2 章を参照)をイネーブルに設定し
てください。
#define EMAC_INTERRUPT_MODE
L3_ON
Emac_InitIrq 関数で必要な割込みを追加してください。デフォルトの設定ではアブノーマル
割込みは許可されていません。
pstcEmac->stcIER.NIE = 1;
pstcEmac->stcIER.RIE = 1;
pstcEmac->stcIER.TIE = 1;
割込み発生後、Emac_IrqHandler 関数がコールされます。必要に応じて Emac_IrqHandler
関数内の下記のコードを変更してください。デフォルトの設定では、送受信完了後にコー
ルバック関数がコールされます。
if(pstcEmac->stcSR.RI != 0)
{
pstcEmac->stcSR.RI = 1;
if(pstcEmacInternData->pfnRxCallback != NULL)
{
pstcEmacInternData->pfnRxCallback();
}
}
if(pstcEmac->stcSR.TI != 0)
{
pstcEmac->stcSR.TI = 1;
if(pstcEmacInternData->pfnTxCallback != NULL)
{
pstcEmacInternData->pfnTxCallback();
}
}
20
AN706-00059-1v1-J, January 31, 2014
A P P L I C A T I O N
4
N O T E
イーサネットドライバのコンフィグレーションとデータ型
本章ではイーサネットデータ構造を説明します。
4.1
はじめに
システム実行前(コンパイル時)のユーザ設定のほかに、ユーザはシステム実行後にもコン
フィグレーションを設定できます。本コンフィグレーションは、初期化関数(ハードウェア
と内部データを設定)で使用されます。また、初期化後でも設定し直すことができます。
4.2
コンフィグレーションの構造体
下記のデータは、イーサネットドライバのコンフィグレーションの構 造体である
stc_emac_config_t で使用されます。
型
フィールド
値
説明
func_ptr_t
pfnRxCallback
-
受信コールバック関数
の関数ポインタ
func_ptr_t
pfnTxCallback
-
送信コールバック関数
の関数ポインタ
func_ptr_t
pfnErrorCallback
-
エラーコールバック関
数の関数ポインタ
4.3
リンクステータスの enum 型
イーサネットドライバはリンクステータスに enum 型を使用します。これは、下記のとお
り en_emac_link_t で定義されています。
設定値
EMAC_LinkStatusLinkDown
説明
コネクションが確立されていない
EMAC_LinkStatusLinkUp
コネクションが確立され、データ交換が可能
なように MAC が設定されています
EMAC_LinkStatusAutonegotiationInProgress
オートネゴシエーション開始
EMAC_LinkStatusAutonegotiationSuccessful
ノードとのオートネゴシエーションが完了
EMAC_LinkStatusAutonegotiationNotSupported
ノードがオートネゴシエーションに非対応
EMAC_LinkStatusInvalidParameter
異常な値が設定されている
EMAC_LinkStatusUnknownError
不明なエラーが発生
4.4
リンクモードの enum 型
リンクモードについても、en_enum_link_mode_t という名前の enum 型が定義されていま
す。内容は下記のとおりです。
設定値
EMAC_LinkModeHalfDuplex10M
EMAC_LinkModeFullDuplex10M
EMAC_LinkModeHalfDuplex100M
EMAC_LinkModeFullDuplex100M
January 31, 2014, AN706-00059-1v1-J
説明
半二重モード 10Mbit/s
全二重モード 10Mbit/s
半二重モード 100Mbit/s
全二重モード 100Mbit/s
21
A P P L I C A T I O N
5
N O T E
イーサネットドライバ API
イーサネットドライバ API の詳細とサンプルコードを説明します。
5.1
はじめに
本章ではイーサネットドライバの API 関数の詳細とサンプルコードについて説明します。
5.1.1
Emac_Init()
本 関 数 は イ ー サ ネ ッ ト を 初 期 化 し ま す 。 pstcEmac は (stc_emacn_t*)&EMAC0 か
(stc_emacn_t*)&EMAC1 のどちらかでなければいけません。pstcConfig はユーザ設定用の
変数のアドレスです。例えば、&stcEmacConfig のように設定します。
プロトタイプ
en_result_t Emac_Init( volatile stc_emacn_t* pstcEmac,
stc_emac_config_t*
pstcConfig
)
パラメータ名
説明
[in] pstcEmac
イーサネット MAC のポインタ
[in] pstcConfig
イーサネット構成のパラメータ
戻り値
説明
Ok
指定チャネルを有効に設定
ErrorInvalidParameter
下記のどちらかが設定されています。
pstcEmac == NULL
pstcEmacInternData == NULL
5.1.2
Emac_DeInit()
本関数はイーサネットの初期化を解除します。
プロトタイプ
en_result_t Emac_DeInit( volatile stc_emacn_t* pstcEmac )
パラメータ名
説明
[in] pstcEmac
イーサネット MAC のポインタ
戻り値
説明
Ok
指定チャネルを無効に設定
ErrorInvalidParameter
下記が設定されています。
pstcEmac == NULL
22
AN706-00059-1v1-J, January 31, 2014
A P P L I C A T I O N
5.1.3
N O T E
Emac_TxFrame()
本関数はフレーム送信に使用されます。
プロトタイプ
en_result_t Emac_TxFrame( volatile stc_emacn_t* pstcEmac,
uint8_t*
pu8Buf,
uint16_t
u16Len
)
パラメータ名
説明
[in] pstcEmac
イーサネット MAC のポインタ
[in] pu8Buf
バッファのポインタ
[in] u16Len
バッファの長さ
戻り値
説明
Ok
送信完了
ErrorInvalidParameter
下記が設定されています。
pstcEmac == NULL
5.1.4
Emac_GetRxFrameLength()
本関数は受信フレームの長さを返します。
プロトタイプ
uint16_t Emac_GetRxFrameLength( volatile stc_emacn_t* pstcEmac )
パラメータ名
説明
[in] pstcEmac
イーサネット MAC のポインタ
戻り値
説明
受信したフレームの長さ(何も受信していない、も
uint16_t
しくは pstcEmac == NULL でなければ)
5.1.5 Emac_RxFrame()
バッファに受信フレームを格納します。割込みモードを無効にしている場合に使用してく
ださい。(3.3.3 章を参照)
プロトタイプ
uint16_t Emac_RxFrame( volatile stc_emacn_t* pstcEmac,
uint8_t*
pu8Buf
)
パラメータ名
説明
[in] pstcEmac
イーサネット MAC のポインタ
[in] pu8Buf
バッファのポインタ
戻り値
説明
受信したフレームの長さ(何も受信していない、も
uint16_t
しくは pstcEmac == NULL でなければ)
January 31, 2014, AN706-00059-1v1-J
23
A P P L I C A T I O N
5.1.6
N O T E
Emac_GetLinkStatus()
本 関 数 は 最 新 の リ ン ク ス テ ー タ ス を 返 し ま す 。 型 に は 4.3 章 に 記 載 さ れ て い る
en_emac_link_status_t を使用します。
プロトタイプ
en_emac_link_status_t Emac_GetLinkStatus( volatile stc_emacn_t*
pstcEmac )
パラメータ名
説明
[in] pstcEmac
イーサネット MAC のポインタ
戻り値
説明
en_emac_link_status_t
下記の enum 値を返します。
 EMAC_LinkStatusLinkDown
 EMAC_LinkStatusLinkUp
 EMAC_LinkStatusAutonegotiationInProgress
 EMAC_LinkStatusAutonegotiationSuccessful
 EMAC_LinkStatusAutonegotiationNotSupported
 EMAC_LinkStatusInvalidParameter
 EMAC_LinkStatusUnknownError
詳細は4.3章を参照してください。
5.1.7
Emac_GetLinkMode()
本 関 数 は 最 新 の リ ン ク モ ー ド を 返 し ま す 。 型 に は 4.4 章 に 記 載 さ れ て い る
en_emac_link_mode_t を使用します。
プロトタイプ
en_emac_link_mode_t Emac_GetLinkMode( volatile stc_emacn_t* pstcEmac )
パラメータ名
説明
[in] pstcEmac
イーサネット MAC のポインタ
戻り値
説明
en_emac_link_mode_t
下記の enum 値を返します。
 EMAC_LinkModeAutonegotiation
 EMAC_LinkModeHalfDuplex10M
 EMAC_LinkModeFullDuplex10M
 EMAC_LinkModeHalfDuplex100M
 EMAC_LinkModeFullDuplex100M
詳細は4.4章を参照してください。
24
AN706-00059-1v1-J, January 31, 2014
A P P L I C A T I O N
5.1.8
N O T E
Emac_SetLinkMode()
本 関 数 は リ ン ク モ ー ド を 設 定 し ま す 。 引 数 と 戻 り 値 に は 4.4 章 に 記 載 さ れ て い る
en_emac_link_mode_t を使用します。
プロトタイプ
en_emac_link_mode_t Emac_SetLinkMode( volatile stc_emacn_t* pstcEmac,
en_emac_link_mode_t enLinkMode
)
パラメータ名
説明
[in] pstcEmac
イーサネット MAC のポインタ
リンクモード。enum の値は下記の戻り値を参照し
[in] enLinkMode
てください。
戻り値
説明
en_emac_link_mode_t
下記の enum 値を返します。
 EMAC_LinkModeAutonegotiation
 EMAC_LinkModeHalfDuplex10M
 EMAC_LinkModeFullDuplex10M
 EMAC_LinkModeHalfDuplex100M
 EMAC_LinkModeFullDuplex100M
詳細は4.4章を参照してください。
5.1.9
Emac_Autonegotiate()
本関数はイーサネットマクロのオートネゴシエーションを実行します。定期的にコールし
てください。
プロトタイプ
en_emac_link_status_t Emac_Autonegotiate( volatile stc_emacn_t*
pstcEmac )
パラメータ名
説明
[in] pstcEmac
イーサネット MAC のポインタ
戻り値
説明
en_emac_link_status_t
下記の enum 値を返します。
 EMAC_LinkStatusLinkDown
 EMAC_LinkStatusLinkUp
 EMAC_LinkStatusAutonegotiationInProgress
 EMAC_LinkStatusAutonegotiationSuccessful
 EMAC_LinkStatusAutonegotiationNotSupported
 EMAC_LinkStatusInvalidParameter
 EMAC_LinkStatusUnknownError
詳細は4.3章を参照してください。
January 31, 2014, AN706-00059-1v1-J
25
A P P L I C A T I O N
N O T E
5.1.10 Emac_SetDescToTxBuf()
本関数はバッファの位置がイーサネットドライバ側に定義されている場合にのみ利用でき
ま す 。 バ ッ フ ァ の 位 置 は 、 EMAC0_BUFFERS_IN_DRIVERSPACE も し く は
EMAC1_BUFFERS_IN_DRIVERSPACE で定義できます。
プロトタイプ
en_result_t Emac_SetDescToTxBuf( volatile stc_emacn_t* pstcEmac,
uint16_t
u16DescNumber
uint8_t*
pu8UserBuf,
uint16_t
u16BufLength
)
パラメータ名
説明
[in] pstcEmac
イーサネット MAC のポインタ
[in] u16DescNumber
DMA ディスクリプタの番号
[in] pu8UserBuf
バッファのポインタ
[in] u16BufLength
バッファの長さ
戻り値
説明
Ok
設定完了
ErrorInvalidParameter
下記が設定されています。
pstcEmac == NULL
5.1.11 Emac_SetDescToRxBuf()
本関数はバッファの位置がイーサネットドライバ側に定義されている場合にのみ利用でき
ま す 。 バ ッ フ ァ の 位 置 は 、 EMAC0_BUFFERS_IN_DRIVERSPACE
と
EMAC1_BUFFERS_IN_DRIVERSPACE で定義できます。
プロトタイプ
en_result_t Emac_SetDescToRxBuf( volatile stc_emacn_t* pstcEmac,
uint16_t
u16DescNumber
uint8_t*
pu8UserBuf,
uint16_t
u16BufLength
)
パラメータ名
説明
[in] pstcEmac
イーサネット MAC のポインタ
[in] u16DescNumber
DMA ディスクリプタの番号
[in] pu8UserBuf
バッファのポインタ
[in] u16BufLength
バッファの長さ
戻り値
説明
Ok
設定完了
ErrorInvalidParameter
下記が設定されています。
pstcEmac == NULL
26
AN706-00059-1v1-J, January 31, 2014
A P P L I C A T I O N
N O T E
5.1.12 Emac_SetEcout()
本関数は PLL クロックの使用を許可します。EMAC_ECOUT が L3_ON の場合、E_COUT
ピンは出力に設定され USB/Ethernet クロックが有効になります。
プロトタイプ
en_result_t Emac_SetEcout( void )
パラメータ名
説明
void
戻り値
説明
Ok
設定完了
5.1.13 Emac_RxFrame_GetBufPtr()
受信フレームのバッファをポインタで返します。受信処理でのデータコピー処理に使用で
きます。割込みモードを有効にしている場合に使用してください。(3.3.3 章を参照)
プロトタイプ
void * Emac_RxFrame_GetBufPtr(
パラメータ名
[in] pstcEmac
戻り値
void *
volatile stc_emacn_t* pstcEmac )
説明
イーサネット MAC のポインタ
説明
受信フレームのバッファのポインタ(何も受信し
ていない、もしくは pstcEmac == NULL でなけ
れば)
5.1.14 Emac_RxFrame_ReleaseBuf()
受信ディスクプタを次のディスクリプタへ更新します。受信処理によってデータを所持し
たバッファに対し、解放処理をします。割込みモードを有効にしている場合に使用してく
ださい。(3.3.3 章を参照)
プロトタイプ
void Emac_RxFrame_ReleaseBuf(
パラメータ名
[in] pstcEmac
戻り値
void
January 31, 2014, AN706-00059-1v1-J
volatile stc_emacn_t* pstcEmac )
説明
イーサネット MAC のポインタ
説明
-
27
A P P L I C A T I O N
6
N O T E
追加情報
Spansion 製のマイクロコントローラの情報は、下記 URL を参照してください。
http://www.spansion.com/JP/
- 以上 –
28
AN706-00059-1v1-J, January 31, 2014
A P P L I C A T I O N
N O T E
改版履歴
版数
日付
内容
1.0 版
2013/1/11
新規作成
1.1 版
2014/1/31
社名変更および記述フォーマットの変換
January 31, 2014, AN706-00059-1v1-J
29
A P P L I C A T I O N
N O T E
免責事項
本資料に記載された製品は、通常の産業用, 一般事務用, パーソナル用, 家庭用などの一般的用途 (ただし、用途の限定はあ
りません) に使用されることを意図して設計・製造されています。(1) 極めて高度な安全性が要求され、仮に当該安全性が
確保されない場合、社会的に重大な影響を与えかつ直接生命・身体に対する重大な危険性を伴う用途 (原子力施設における
核反応制御, 航空機自動飛行制御, 航空交通管制, 大量輸送システムにおける運行制御, 生命維持のための医療機器, 兵器シ
ステムにおけるミサイル発射制御等をいう) 、ならびに(2) 極めて高い信頼性が要求される用途 (海底中継器, 宇宙衛星等を
いう) に使用されるよう設計・製造されたものではありません。上記の製品の使用法によって惹起されたいかなる請求また
は損害についても、Spansion は、お客様または第三者、あるいはその両方に対して責任を一切負いません。半導体デバイス
はある確率で故障が発生します。当社半導体デバイスが故障しても、結果的に人身事故, 火災事故, 社会的な損害を生じさ
せないよう、お客様において、装置の冗長設計, 延焼対策設計, 過電流防止対策設計, 誤動作防止設計などの安全設計をお願
いします。本資料に記載された製品が、外国為替及び外国貿易法、米国輸出管理関連法規などの規制に基づき規制されてい
る製品または技術に該当する場合には、本製品の輸出に際して、同法に基づく許可が必要となります。
商標および注記
このドキュメントは、断りなく変更される場合があります。本資料には Spansion が開発中の Spansion 製品に関する情報が
記載されている場合があります。Spansion は、それらの製品に対し、予告なしに仕様を変更したり、開発を中止したりする
権利を有します。このドキュメントに含まれる情報は、現状のまま、保証なしに提供されるものであり、その正確性, 完全
性, 実施可能性および特定の目的に対する適合性やその市場性および他者の権利を侵害しない事を保証するものでなく、ま
た、明示, 黙示または法定されているあらゆる保証をするものでもありません。Spansion は、このドキュメントに含まれる
情報を使用することにより発生したいかなる損害に対しても責任を一切負いません。
Copyright © 2013-2014 Spansion Inc. All rights reserved.
®
®
®
TM
TM
商標:Spansion , Spansion ロゴ (図形マーク), MirrorBit , MirrorBit Eclipse , ORNAND 及びこれらの組合せは、米国・
日本ほか諸外国における Spansion LLC の商標です。第三者の社名・製品名等の記載はここでは情報提供を目的として表記
したものであり、各権利者の商標もしくは登録商標となっている場合があります。
30
AN706-00059-1v1-J, January 31, 2014