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

📄 sd_driver.c

📁 基于U(375)盘及SD(SPI模式)卡集成文件系统(包括底层驱动)
💻 C
字号:

#include "sd_driver.h"

MCBSP_Handle myMcbsp;

static MCBSP_Config myInitialConfig = {   //上电初始化
  MCBSP_SPCR_RMK(
    MCBSP_SPCR_FREE_DEFAULT	,
    MCBSP_SPCR_SOFT_DEFAULT,
    MCBSP_SPCR_FRST_DEFAULT,
    MCBSP_SPCR_GRST_DEFAULT,
    MCBSP_SPCR_XINTM_DEFAULT,
    MCBSP_SPCR_XSYNCERR_DEFAULT,
    MCBSP_SPCR_XRST_DEFAULT,
    MCBSP_SPCR_DLB_DEFAULT,
    MCBSP_SPCR_RJUST_DEFAULT,
    MCBSP_SPCR_CLKSTP_NODELAY,
    MCBSP_SPCR_DXENA_DEFAULT,
    MCBSP_SPCR_RINTM_RRDY,
    MCBSP_SPCR_RSYNCERR_DEFAULT,
    MCBSP_SPCR_RRST_DEFAULT
  ),
  MCBSP_RCR_RMK(
    MCBSP_RCR_RPHASE_SINGLE,
    MCBSP_RCR_RFRLEN2_DEFAULT,
    MCBSP_RCR_RWDLEN2_DEFAULT,
    MCBSP_RCR_RCOMPAND_DEFAULT,
    MCBSP_RCR_RFIG_NO,
    MCBSP_RCR_RDATDLY_1BIT,
    MCBSP_RCR_RFRLEN1_DEFAULT, 
    MCBSP_RCR_RWDLEN1_8BIT,
    MCBSP_RCR_RWDREVRS_DISABLE
  ),
  MCBSP_XCR_RMK(
    MCBSP_XCR_XPHASE_SINGLE,
    MCBSP_XCR_XFRLEN2_DEFAULT,
    MCBSP_XCR_XWDLEN2_DEFAULT,
    MCBSP_XCR_XCOMPAND_DEFAULT,
    MCBSP_XCR_XFIG_NO,
    MCBSP_XCR_XDATDLY_1BIT,
    MCBSP_XCR_XFRLEN1_DEFAULT, 
    MCBSP_XCR_XWDLEN1_8BIT,
    MCBSP_XCR_XWDREVRS_DISABLE
  ),
  MCBSP_SRGR_RMK(
    MCBSP_SRGR_GSYNC_FREE,
    MCBSP_SRGR_CLKSP_RISING,
    MCBSP_SRGR_CLKSM_INTERNAL,
    MCBSP_SRGR_FSGM_DXR2XSR,
    MCBSP_SRGR_FPER_DEFAULT,
    MCBSP_SRGR_FWID_DEFAULT,
    MCBSP_SRGR_CLKGDV_OF(0xFF)
  ),
  MCBSP_MCR_DEFAULT,
  MCBSP_RCERE0_DEFAULT,
  MCBSP_RCERE1_DEFAULT,
  MCBSP_RCERE2_DEFAULT,
  MCBSP_RCERE3_DEFAULT,
  MCBSP_XCERE0_DEFAULT,
  MCBSP_XCERE1_DEFAULT,
  MCBSP_XCERE2_DEFAULT,
  MCBSP_XCERE3_DEFAULT,
  MCBSP_PCR_RMK(
    MCBSP_PCR_XIOEN_SP,
    MCBSP_PCR_RIOEN_SP,
    MCBSP_PCR_FSXM_INTERNAL,
    MCBSP_PCR_FSRM_EXTERNAL,
    MCBSP_PCR_CLKXM_OUTPUT,
    MCBSP_PCR_CLKRM_INPUT,
    MCBSP_PCR_CLKSSTAT_0,
    MCBSP_PCR_DXSTAT_0,
    MCBSP_PCR_FSXP_ACTIVELOW,
    MCBSP_PCR_FSRP_ACTIVELOW,
    MCBSP_PCR_CLKXP_FALLING,
    MCBSP_PCR_CLKRP_DEFAULT
  )
}; 

static MCBSP_Config myNormalConfig = {    // 最快时钟传递数据
  MCBSP_SPCR_RMK(
    MCBSP_SPCR_FREE_DEFAULT	,
    MCBSP_SPCR_SOFT_DEFAULT,
    MCBSP_SPCR_FRST_DEFAULT,
    MCBSP_SPCR_GRST_DEFAULT,
    MCBSP_SPCR_XINTM_DEFAULT,
    MCBSP_SPCR_XSYNCERR_DEFAULT,
    MCBSP_SPCR_XRST_DEFAULT,
    MCBSP_SPCR_DLB_DEFAULT,
    MCBSP_SPCR_RJUST_DEFAULT,
    MCBSP_SPCR_CLKSTP_NODELAY,
    MCBSP_SPCR_DXENA_DEFAULT,
    MCBSP_SPCR_RINTM_RRDY,
    MCBSP_SPCR_RSYNCERR_DEFAULT,
    MCBSP_SPCR_RRST_DEFAULT
  ),
  MCBSP_RCR_RMK(
    MCBSP_RCR_RPHASE_SINGLE,
    MCBSP_RCR_RFRLEN2_DEFAULT,
    MCBSP_RCR_RWDLEN2_DEFAULT,
    MCBSP_RCR_RCOMPAND_DEFAULT,
    MCBSP_RCR_RFIG_NO,
    MCBSP_RCR_RDATDLY_1BIT,
    MCBSP_RCR_RFRLEN1_DEFAULT, 
    MCBSP_RCR_RWDLEN1_8BIT,
    MCBSP_RCR_RWDREVRS_DISABLE
  ),
  MCBSP_XCR_RMK(
    MCBSP_XCR_XPHASE_SINGLE,
    MCBSP_XCR_XFRLEN2_DEFAULT,
    MCBSP_XCR_XWDLEN2_DEFAULT,
    MCBSP_XCR_XCOMPAND_DEFAULT,
    MCBSP_XCR_XFIG_NO,
    MCBSP_XCR_XDATDLY_1BIT,
    MCBSP_XCR_XFRLEN1_DEFAULT, 
    MCBSP_XCR_XWDLEN1_8BIT,
    MCBSP_XCR_XWDREVRS_DISABLE
  ),
  MCBSP_SRGR_RMK(
    MCBSP_SRGR_GSYNC_FREE,
    MCBSP_SRGR_CLKSP_RISING,
    MCBSP_SRGR_CLKSM_INTERNAL,
    MCBSP_SRGR_FSGM_DXR2XSR,
    MCBSP_SRGR_FPER_DEFAULT,
    MCBSP_SRGR_FWID_DEFAULT,
    MCBSP_SRGR_CLKGDV_OF(0x3)
  ),
  MCBSP_MCR_DEFAULT,
  MCBSP_RCERE0_DEFAULT,
  MCBSP_RCERE1_DEFAULT,
  MCBSP_RCERE2_DEFAULT,
  MCBSP_RCERE3_DEFAULT,
  MCBSP_XCERE0_DEFAULT,
  MCBSP_XCERE1_DEFAULT,
  MCBSP_XCERE2_DEFAULT,
  MCBSP_XCERE3_DEFAULT,
  MCBSP_PCR_RMK(
    MCBSP_PCR_XIOEN_SP,
    MCBSP_PCR_RIOEN_SP,
    MCBSP_PCR_FSXM_INTERNAL,
    MCBSP_PCR_FSRM_EXTERNAL,
    MCBSP_PCR_CLKXM_OUTPUT,
    MCBSP_PCR_CLKRM_INPUT,
    MCBSP_PCR_CLKSSTAT_0,
    MCBSP_PCR_DXSTAT_0,
    MCBSP_PCR_FSXP_ACTIVELOW,
    MCBSP_PCR_FSRP_ACTIVELOW,
    MCBSP_PCR_CLKXP_FALLING,
    MCBSP_PCR_CLKRP_DEFAULT
  )
}; 
/*******************************************************************************************************************
** 函数名称: UINT8 SPI_TransferByte(UINT8 value) 	Name:	 UINT8 SPI_TransferByte(UINT8 value) 
** 功能描述: 串行传输数据块							Function: transfer data in serial
** 输   入: UINT8 value:数据值					Input:	  UINT8 value:Data Value	
** 输   出: 接收数据								Output:	  Receive Value
********************************************************************************************************************/
UINT8 SPI_TransferByte(UINT8 value)       //数据传入后等待返回的数据
{ 
	UINT32  incoming;	
	while (!MCBSP_xrdy(myMcbsp));                      
    MCBSP_write(myMcbsp,value);                      
	
	while(!MCBSP_rrdy(myMcbsp));
	incoming = MCBSP_read(myMcbsp);   //得到数据
	return(incoming);
}

/*******************************************************************************************************************
** 函数名称: Bool rcvr_datablock(UINT8* buff, UINT32 btr)	Name:	 Bool rcvr_datablock(UINT8* buff, UINT32 btr)
** 功能描述: 传输数据块										Function: Receive Block of Data
** 输   入: UINT8* buff:缓存区							Input:	  UINT8* buff:Buffer
			 UINT8 btr:反馈    								      UINT8 btr: Response		
** 输   出: 1成功 0失败									Output:	  1 Success 0: Fail
********************************************************************************************************************/

Bool rcvr_datablock(UINT8* buff, UINT32 btr)
{
	UINT8 token;
	UINT32 token_wait = 10000;
	do{
		token = SPI_TransferByte(0xff);
	}while((token !=0xFE)&&token_wait--);
	if(!token_wait) 
	{
		printf("Error: receive error \n");
		return FALSE;
	}
	
	do{
		*buff++=SPI_TransferByte(0xff);
	}while(--btr);
	SPI_TransferByte(0xff);  //Discard CRC
	SPI_TransferByte(0xff);  //
	return TRUE;
}
/*******************************************************************************************************************
** 函数名称: Bool xmit_datablock(UINT8* buff,UINT8 token)	Name:	 Bool xmit_datablock(UINT8* buff,UINT8 token)
** 功能描述: 传输数据块										Function: Transfer Block of Data
** 输   入: UINT8* buff:缓存区							Input:	  UINT8* buff:Buffer
			 UINT8 token:数据块头								      UINT8 token: Token		
** 输   出: 1成功 0失败									Output:	  1 Success 0: Fail
********************************************************************************************************************/
Bool xmit_datablock(UINT8* buff,UINT8 token)
{
	UINT8 resp;
	UINT16 wc;
	UINT32 resp_wait=1000000;
	wc = 512;
	SPI_TransferByte(token);
	if(token!=0xFD)
	{
		do{
			SPI_TransferByte(*buff++);
		}while(--wc);
		SPI_TransferByte(0xff);//CRC
		SPI_TransferByte(0xff);
		do{
			resp = SPI_TransferByte(0xff);
		}while((--resp_wait)&&((resp&0x1F)!=0x05));
		if(!resp_wait)
			return FALSE;
	}
	else
	{
		SPI_TransferByte(0xff);
		SPI_TransferByte(0xff);
	}
	return TRUE;
}

/*******************************************************************************************************************
** 函数名称: void SPI_ClkToMax()				Name:	  void SPI_ClkToMax()
** 功能描述: 设置SPI的clock到最大值				Function: set the clock of SPI to maximum
** 输   入: 无									Input:	  NULL
** 输   出: 无									Output:	  NULL
********************************************************************************************************************/
void SPI_ClkToMax(void)
{
	
	MCBSP_config(myMcbsp , &myNormalConfig );
  	/* Now that the port is setup, let's enable it in steps. */
  	MCBSP_enableSrgr(myMcbsp);
  	printf("wait for two clock \n");
  	MCBSP_enableRcv(myMcbsp);
  	MCBSP_enableXmt(myMcbsp);
}

/*******************************************************************************************************************
** 函数名称: void MyMcbsp_Init()				Name:	  void MyMcbsp_Init()
** 功能描述: 设置MCBSP接口						Function: set the MCBSP Interface
** 输   入: 无									Input:	  NULL
** 输   出: 无									Output:	  NULL
********************************************************************************************************************/
void MyMcbsp_Init()
{
	myMcbsp = MCBSP_open(MCBSP_DEV0, MCBSP_OPEN_RESET);

  	MCBSP_config(myMcbsp , &myInitialConfig );
  	/* Now that the port is setup, let's enable it in steps. */

  
  	MCBSP_enableSrgr(myMcbsp);
  	printf("wait for two clock \n");
  	MCBSP_enableRcv(myMcbsp);
  	MCBSP_enableXmt(myMcbsp);
  	
}


void MyMcbsp_Close()
{
	MCBSP_close(myMcbsp);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -