RX64MのEthernet1のみ使用する
RX64MにはEthernetコントローラが2ch搭載されています。ルネサスのTCP/IPライブラリであるT4を使う場合、1chまたは、2chを選択することが可能です。しかし、1chで使用する場合はEthernet0が使用されるため何とかしたいと思います。
使用したバージョン
M3S-T4-Tiny(Ethernet) version 2.09 for RXV1 LITTLE endian.(Jun 18 2019, 18:43:35)
1.コンポーネントから「r_t4_rx」を追加する。
r_ether_rx
r_cmd_rx
r_sys_timer_rx
r_t4_driver
が追加される。
2.r_ether_rxの設定を行う
今回は、ETHERC1を使用する為、下記の通り設定。
3.r_t4_rxの設定を行う
今回は、1chのみ使用する為、下記の通り設定。
4.コード生成を行う。
5.ソースの改造
T4ライブラリでは、1CHで使用する場合は、ETHERC0を使用するのが前提らしい。
なので、まともに動かない。
(ちなみに、1chしか使用しない場合でも、T4を2ch設定にしてしまえば、そのままでも使える。ただし、メモリが多くいる)
改造するためには、スマートコンフィグレータで作成したファイルを編集する必要があるが、
コード生成を行うたびに戻ってしまう恐れがある為、コピーを追加する。
・既存のソースをビルドから除外する。
・コピーしたソースをプロジェクトに追加し、編集する。
単純に、アクセスするチャンネルを0と1をすべて入れ替えました。
修正したファイルはこちらです。(動作未保障)
6.動作確認
以下のコードにて、PCからPINGが通ることを確認。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
#define T4_WORK_SIZE (11276) static UW tcpudp_work[T4_WORK_SIZE / 4 + 1]; //ワークメモリ static UB T4_RESET_REQUEST = 0; //コールバックのリセット要求 //T4コールバック ER system_callback ( UB channel, UW eventid, VP param ){ switch(eventid){ case ETHER_EV_LINK_OFF: // 0 ETHER 層のリンクが切断しました。 break; case ETHER_EV_LINK_ON: // 1 ETHER 層のリンクが接続しました。 break; case ETHER_EV_COLLISION_IP: // 2 IP アドレスの衝突を検出しました。 break; case DHCP_EV_LEASE_IP: // 20 DHCP にてIP アドレスの取得を完了しました。 break; case DHCP_EV_LEASE_OVER: // 21 DHCP にてIP アドレスのリース時間が切れました。 break; case DHCP_EV_INIT: // 22 DHCP の初期化動作を開始しました。 break; case DHCP_EV_INIT_REBOOT: // 23 DHCP の再接続を開始しました。 break; case DHCP_EV_APIPA: // 24 APIPA アドレスを設定しました。 break; case DHCP_EV_NAK: // 25 DHCP サーバからNAK を受信しました。 break; case DHCP_EV_FATAL_ERROR: // 26 DHCP に致命的なエラーが発生しました。 break; case DHCP_EV_PLEASE_RESET: // 27 tcpudp_reset()をしてT4 をリセットしてください。 T4_RESET_REQUEST = channel + 1; //tcpudp_reset(channel); //コールバック内では禁止 break; } printf("ch=%d,Event=%d\n",channel,eventid); return 0; } //Ethernetを開く void eth_open(void){ ER ercd; W size; sys_time_err_t systime_ercd; //Version printf("%s\n",(char*)R_t4_version.library); //システムタイマ 初期化 systime_ercd = R_SYS_TIME_Open(); if(systime_ercd != SYS_TIME_SUCCESS){ printf("SystemTimer Open Error\n"); while(1); } //LAN controller 初期化 ercd = lan_open(); if(ercd != E_OK){ printf("LAN Open Error\n"); while(1); } //ワークメモリ 確保 size = tcpudp_get_ramsize(); printf("T4 WorkSize=%d\n",size); if(size > (sizeof(tcpudp_work))){ printf("WrokSize Error\n"); while(1); } //T4 ライブラリ 初期化 ercd = tcpudp_open(tcpudp_work); if(ercd != E_OK){ printf("T4 Open Error\n"); while(1); } } //Ethernetを閉じる void eth_close(void){ tcpudp_close(); lan_close(); R_SYS_TIME_Close(); } //Ethernetの監視 void eth_task(void){ if(T4_RESET_REQUEST){ tcpudp_reset(T4_RESET_REQUEST-1); T4_RESET_REQUEST = 0; } } void main(void){ R_Pins_Create(); eth_open(); while(1){ eth_task(); } } |
以前と比べ、T4はかなり進歩してますね。DHCPも標準で対応してる。
ディスカッション
コメント一覧
まだ、コメントがありません