RX64MにはUSBホストコントローラが内蔵されていますので、USBメモリを使用することができます。
今回は、USBAを使用します。USBは、USB0とUSBAの2種類ありますが、使用方法は同じです。
リソースの設定で、USB0_HOSTかUSBA_HOSTのどちらを選ぶかが異なります。
使用するFITモジュールと設定は下記のとおりです。
r_usb_basic 1.30
r_usb_hmsc 1.30
[設定項目なし]
r_tfat_driver_rx 1.08
r_tfat_rx 4.00
[設定項目なし]
ソフトウエアについては、以下のファイルをインクルードします。
1 2 3 4 5 6 |
//USB #include "r_usb_basic_if.h" #include "r_usb_hmsc_if.h" //FAT #include "r_tfat_driver_rx_if.h" #include "r_tfat_driver_rx_config.h" |
USB制御用コードは、下記の様に作成しました。
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 |
#define USB_MEM_DEBUG_PRINT 1 //デバッグ用 Printfの有効化 #define USB_MEM_DEV_NO 0 //USBメモリ デバイス番号 #define USB_MEM_DRV_LETTER "1:" //USBメモリ ドライブ番号(FatFs) FATFS USB_MEM_FATFS; //USBメモリ ファイルシステム usb_ctrl_t USB_MEM_CTRL_TBL; //USBメモリ 通信制御構造体 unsigned short USB_MEM_ERR_STATUS = 0; //USBメモリ エラーステータス unsigned short USB_MEM_READY = 0; //USBメモリ 準備テータス //USBメモリの初期化 void usb_mem_init(void){ usb_err_t usb_err; usb_cfg_t cfg; //USB ピン設定 R_USB_PinSet_USBA_HOST(); //USBモジュール・ドライバ初期設定 USB_MEM_CTRL_TBL.module = USB_IP1; USB_MEM_CTRL_TBL.type = USB_HMSC; cfg.usb_speed = USB_FS; cfg.usb_mode = USB_HOST; usb_err = R_USB_Open( &USB_MEM_CTRL_TBL, &cfg); if (USB_SUCCESS != usb_err){ #ifdef USB_MEM_DEBUG_PRINT printf("ERROR: R_USB_Open.\n"); #endif USB_MEM_ERR_STATUS |= 0x0001; } } //USBメモリ検出処理 void usb_mem_task(void){ usb_status_t usb_event; uint8_t drv_no; FRESULT f_res; usb_event = R_USB_GetEvent(&USB_MEM_CTRL_TBL); switch (usb_event){ case USB_STS_CONFIGURED: // Configured 状態 #ifdef USB_MEM_DEBUG_PRINT printf("Detected attached USB memory.\n"); #endif R_USB_HmscGetDriveNo(&USB_MEM_CTRL_TBL, &drv_no); if(drv_no != 0) break; f_res = f_mount(&USB_MEM_FATFS, USB_MEM_DRV_LETTER, 0); if(f_res == FR_OK){ USB_MEM_READY = 1; }else{ USB_MEM_ERR_STATUS |= 0x0400; } break; case USB_STS_DETACH: // Detach 状態 #ifdef USB_MEM_DEBUG_PRINT printf("Detected detached USB memory.\n"); #endif USB_MEM_READY = 0; break; case USB_STS_DEFAULT: // Default 状態 case USB_STS_SUSPEND: // Suspend 状態 case USB_STS_NONE: default: break; } } |
初期化処理として、usb_mem_init();を一度実行します。
その後はメインループにて、usb_mem_task();を常時実行します。
カードの挿入を検出すると、USB_MEM_READYが1となり、アクセスが可能です。
ファイル操作自体は、ChaNさんのFatfsを使用しているので、そちらを参照します。
SDカードのサンプルと同様です。