📄 protocol.c
字号:
//---------------------------------------------------------------------
// 関数名: BYTE write_protocol
// 機能 : Write Protocol処理
// MSIF_TPC_REGにTPCを書き込み、Write Protocolを開始する。
// 引数 : BYTE tpc [IN]TPC
// HALF dlen [IN]データ長(Byte)
// BYTE *buf [IN]データバッファ先頭アドレス
// BYTE *status [OUT]Protocol終了状態
// 返値 : 正常終了 = 0
// エラー時 = 1 予想外のエラー
//---------------------------------------------------------------------
BYTE write_protocol(BYTE tpc,HALF dlen,BYTE *buf,BYTE *status)
{
HALF i;
/* CommandRegへTPCとデータ長をセット */
SET_MSIF_TPC_REG(tpc,dlen);
for (i=0;i<dlen;i++) {
if (wait_drq(status) == 0) {
MSIF_DATA_REG = buf[i];
} else {
return(1);
}
}
/* Protocol終了待ち */
wait_rdy(status);
return(0);
}
//---------------------------------------------------------------------
// 関数名: BYTE read_protocol
// 機能 : Read Protocol処理
// MSIF_TPC_REGにTPCを書き込み、Read Protocolを開始する。
// 引数 : BYTE tpc [IN]TPC
// HALF dlen [IN]データ長(Byte)
// BYTE *buf [IN]データバッファ先頭アドレス
// BYTE *status [OUT]Protocol終了状態
// 返値 : 正常終了 = 0
// エラー時 = 1 予想外のエラー
// (引数エラー,DMA動作不可)
//---------------------------------------------------------------------
BYTE read_protocol(BYTE tpc,HALF dlen,BYTE *buf,BYTE *status)
{
HALF i;
/* CommandRegへTPCとデータ長をセット */
SET_MSIF_TPC_REG(tpc,dlen);
for (i=0;i<dlen;i++) {
if (wait_drq(status) == 0) {
buf[i] = MSIF_DATA_REG;
} else {
return(1);
}
}
/* Protocol終了割り込み待ち */
wait_rdy(status);
return(0);
}
//---------------------------------------------------------------------
// 関数名: void wait_drq
// 機能 : MSIF_DATA_REGアクセス要求待ち
// 引数 : BYTE *status [OUT]Protocol状態
// 返値 : 正常終了時= 0
// エラー時 = 1 予想外のエラー
//---------------------------------------------------------------------
BYTE wait_drq(BYTE *status)
{
while ((MSIF_IDATA_REG & (F_MSIF_IDATA_DRQ | F_MSIF_IDATA_TOE)) == 0);
*status = MSIF_IDATA_REG;
MSIF_IDATA_REG &= ~(F_MSIF_IDATA_DRQ | F_MSIF_IDATA_TOE);
if (*status & F_MSIF_IDATA_DRQ) {
return(0);
} else {
return(1);
}
}
//---------------------------------------------------------------------
// 関数名: void wait_rdy
// 機能 : Protocol終了割り込み待ち
// Timeout時は*statusのTOEビット=1になる。
// 引数 : BYTE *status [OUT]Protocol終了状態
//---------------------------------------------------------------------
void wait_rdy(BYTE *status)
{
while ((MSIF_IDATA_REG & (F_MSIF_IDATA_RDY | F_MSIF_IDATA_PIN | F_MSIF_IDATA_TOE)) == 0);
*status = MSIF_IDATA_REG;
MSIF_IDATA_REG &= ~(F_MSIF_IDATA_RDY | F_MSIF_IDATA_CRC | F_MSIF_IDATA_TOE);
}
//---------------------------------------------------------------------
// 関数名: BYTE wait_sif
// 機能 : メモリースティックからのINT発生待ち
// 引数 : BYTE *status [OUT]Protocol状態
// 返値 : 正常終了時= 0
// タイムアウト時 = 1
//---------------------------------------------------------------------
BYTE wait_sif(BYTE *status)
{
start_timer(SIF_TOE);
while ((MSIF_IDATA_REG & F_MSIF_IDATA_SIF) == 0) {
if (endp_timer() !=0) {
return(1);
}
}
stop_timer();
*status = MSIF_IDATA_REG;
MSIF_IDATA_REG &= ~F_MSIF_IDATA_SIF;
return(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -