/*---------------------------------------------------------------------- RFID READ WRITE MODULE Control Library For C Language v720s.c ver 1.0 Release 2006/10/20 AUTHOR:Hyunjong Kim (Matsuo Lab.) ADVISOR:YUGO MORITA (Matsuo Lab.) -> Date : 2007/10/17 Renewal : Jumpei Nishizaki 任意のページに書き込もうとするとエラーが発生するバグを修正 ----------------------------------------------------------------------*/ //#include #include "v720s.h" #include "uart2.h" #include #include "nosprintf.h" extern unsigned char uart2_init_flag; extern unsigned char uart2_received; extern unsigned char uart2_transmited; extern unsigned char buf2_tra[]; extern unsigned char buf2_rec[]; extern unsigned int uart2_rec_error; static unsigned int v720s_init_flag = 0; static unsigned int v720s_rec_continue = 0; unsigned int v720s_busy = 0; /* ------------------------ 初期化関数 ------------------------- */ int v720s_init() { int check; /* 通信の設定を初期化 */ uart2_tra_rec_init(); /* 通信可能かどうかのチェック */ check = v720s_test(); /* 通信テストができなければ,エラーで返す */ if(check != 0 ) return check; /* 初期化済みであることを示すフラグを立てる */ v720s_init_flag = 1; return 0; } int v720s_test(void) { long int count=0; /* TESTコマンドを送信する */ strcpy(buf2_tra, "10\r"); uart2_tra_rec_st(); /* uart2_received flag が立つまで待つ */ while(!uart2_received) { count++; if(count > 10000000) return 999; /*v720との通信ができないと判断*/ } if (uart2_rec_error != 0) return uart2_rec_error; /*UART2の受信エラー*/ /* 受信したデータが、"00\r"かどうかチェック */ if(buf2_rec[0] == '0' && buf2_rec[1] == '0') { /* OK */ return 0; } else{ /* NG */ return 998; /*TESTコマンドからのレスポンス終了コードが正常ではない*/ } } int v720s_putcmd_write(unsigned char _mode_type, unsigned char _bank_st, int _pagenum_fs_st, char _far *data) { int count; int pages = 0; int leftover = 0; int i; int pages_command; /* 初期化されているかどうかチェック */ if(v720s_init_flag != 1) return 997; /* 交信モードのチェック(WRITEコマンドはSINGLE REPEATモードでは実行不可)*/ if ((_mode_type != V720S_MODE_ST) && (_mode_type != V720S_MODE_SA) && (_mode_type != V720S_MODE_FT) && (_mode_type != V720S_MODE_FA) && (_mode_type != V720S_MODE_FR)) return 994; if (_bank_st == V720S_BANK_01H)return 990; /* 書込み禁止領域への書き込み */ if (v720s_busy != 0) return 995; /*前回の命令からのレスポンス未受信*/ /* 文字数が(64文字 - 書き込み初期位置ページ*4)以内か確認 */ for(count=0; count < ( 64 - 4*_pagenum_fs_st ); count++) { if( data[count] == '\0') break; } if( count >= 64) return 992; /* 文字数が正しくない */ /* 必要ページ数と端数を計算する*/ pages = _pagenum_fs_st + count / 4 ; leftover = count % 4; /* 端数が存在したらページ数は1つ多く指定 */ /* leftoverは挿入する空白の数に再利用する */ if(leftover > 0 ){ pages ++; leftover= 4 -leftover; } /* 確保するページ数を指定する */ pages_command = ((1 << pages)-1)&(0xFFFF << _pagenum_fs_st); /* buf2_tra に送信コマンド、交信オプション、バンク指定を行う */ strcpy(buf2_tra,"0000000000"); exc_htoa(&buf2_tra[1],V720S_CMD_WRITE); exc_htoa(&buf2_tra[3],V720S_CONTACT_OPTION_ASCII(_mode_type) ); exc_htoa(&buf2_tra[5],_bank_st); exc_htoa(&buf2_tra[9],pages_command); strcat(buf2_tra,data); /* 足りない部分は空白で埋める */ for(i= 0 ; i < leftover ; i++) { strcat(buf2_tra, " "); } strcat(buf2_tra, CR_TERMINATOR); if (uart2_transmited != 1) return 996; /* 前回の命令の送信が未完了*/ /* 下位関数を呼び出す.送受信開始 */ uart2_tra_rec_st(); /* 連続受信のチェック */ if (_mode_type == V720S_MODE_FR) v720s_rec_continue = 1; v720s_busy = 1; return 0; } int v720s_putcmd_read(unsigned char _mode_type, unsigned char _bank_st,int _pagenum_fs_st, int _pagenum_fs_end) { // unsigned char tmp[6]=""; /* 通信の初期化はおこなってあるか? */ if (v720s_init_flag == 0 ) return 997; /* 交信モードのチェック */ if ((_mode_type != V720S_MODE_ST) && (_mode_type != V720S_MODE_SA) && (_mode_type != V720S_MODE_SR) && (_mode_type != V720S_MODE_FT) && (_mode_type != V720S_MODE_FA) && (_mode_type != V720S_MODE_FR)) return 994; if (v720s_busy != 0) return 995; /*前回の命令からのレスポンス未受信*/ //_pagenum_fs_st = 0; //_pagenum_fs_end = 0; /* フリースペースのページ指定の検査*/ if ( (_pagenum_fs_st > _pagenum_fs_end) || (_pagenum_fs_st < 0) || (_pagenum_fs_end > 15) ) return 991; _pagenum_fs_st = ((1 << _pagenum_fs_st)-1); strcpy(buf2_tra,"0000000000"); exc_htoa(&buf2_tra[1],V720S_CMD_READ); exc_htoa(&buf2_tra[3],V720S_CONTACT_OPTION_ASCII(_mode_type) ); exc_htoa(&buf2_tra[5],_bank_st); exc_htoa(&buf2_tra[9],V720S_GETPAGE_FS(_pagenum_fs_end+1)-_pagenum_fs_st); /* 連続受信のチェック */ if ((_mode_type == V720S_MODE_SR) || (_mode_type == V720S_MODE_FR)) v720s_rec_continue = 1; strcat(buf2_tra, CR_TERMINATOR); uart2_tra_rec_st(); v720s_busy = 1; return 0; } int v720s_putcmd_serial(unsigned char _mode_type) { // unsigned char tmp[6]=""; /* 通信の初期化はおこなってあるか? */ if (v720s_init_flag == 0 ) return 997; /* 交信モードのチェック */ if ((_mode_type != V720S_MODE_ST) && (_mode_type != V720S_MODE_SA) && (_mode_type != V720S_MODE_SR) && (_mode_type != V720S_MODE_FT) && (_mode_type != V720S_MODE_FA) && (_mode_type != V720S_MODE_FR)) return 994; if (v720s_busy != 0) return 995; /*前回の命令からのレスポンス未受信*/ strcpy(buf2_tra,"0000"); exc_htoa(&buf2_tra[1],V720S_CMD_READ_UID); exc_htoa(&buf2_tra[3],V720S_CONTACT_OPTION_HEX(_mode_type) ); /* 連続受信のチェック */ if ((_mode_type == V720S_MODE_SR) || (_mode_type == V720S_MODE_FR)) v720s_rec_continue = 1; strcat(buf2_tra, CR_TERMINATOR); uart2_tra_rec_st(); v720s_busy = 1; return 0; } int v720s_getdata(char _far *data) { int first,second; int length; int i; int uart2_error_copy; uart2_received = 0; v720s_busy = 0; if (uart2_rec_error != 0) { if (v720s_rec_continue == 1) uart2_rec_st(); return uart2_rec_error; } /* 受信した文字列の長さを計測する */ for(i = 0 ; i < 140 ; i++) { if(buf2_rec[i] == '\0') break; } /* 受信文字列が140以上だったら */ if(i >= 140 ) return 995; /* データだけを配列に格納する */ strcpy(data, &buf2_rec[2]); /* 最初の二文字のアスキーコードを数字に直す */ first = (int)(buf2_rec[0]) - (int)('0'); second = (int)(buf2_rec[1]) - (int)('0'); if (v720s_rec_continue == 1) uart2_rec_st(); /* 終了コマンドのint型を返す */ return (first*10 + second); } int v720s_putcmd_stop(void) { /* 初期化されているかどうかチェック */ if (v720s_init_flag == 0 ) return 997; /* 連続受信の停止 */ v720s_rec_continue = 0; /* STOPコマンドの送信 */ //sprintf(buf2_tra, "%02X%c", V720S_CMD_STOP, CR_TERMINATOR); strcpy(buf2_tra,"13\r"); if (uart2_transmited != 1) return 996; /* 前回の命令の送信が未完了*/ uart2_tra_rec_st(); /* 正常終了処理 */ return 0; }