⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 protocol.c

📁 索尼记忆棒的示例源码。采自日文期刊Interface的附属光盘。
💻 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 + -