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

📄 main_save.c

📁 基于U(375)盘及SD(SPI模式)卡集成文件系统(包括底层驱动)
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
 *  Copyright 2003 by Texas Instruments Incorporated.
 *  All rights reserved. Property of Texas Instruments Incorporated.
 *  Restricted rights to use, duplicate or disclose this code are
 *  granted through contract.
 *  
 */
/* "@(#) DSP/BIOS 4.90.270 06-11-03 (barracuda-m10)" */
/*
 *  Copyright 2001 by Texas Instruments Incorporated.
 *  All rights reserved. Property of Texas Instruments Incorporated.
 *  Restricted rights to use, duplicate or disclose this code are
 *  granted through contract.
 *  U.S. Patent Nos. 5,283,900  5,392,448
 */
/* "@(#) DSP/BIOS 4.51.0 05-23-01 (barracuda-i10)" */
/******************************************************************************\
*           Copyright (C) 2000 Texas Instruments Incorporated.
*                           All Rights Reserved
*------------------------------------------------------------------------------
* FILENAME...... main.c
* DATE CREATED.. 01/11/2000
* LAST MODIFIED. 09/27/2000
\******************************************************************************/
#include <std.h>
#include <log.h>
#include <swi.h>

#include <csl.h>
#include <csl_mcbsp.h>
#include <csl_timer.h>

#define INIT_CMD0_ERROR			0xFF
#define INIT_CMD1_ERROR			0xFE
#define WRITE_BLOCK_ERROR		0xFD
#define READ_BLOCK_ERROR		0xFC
#define MMC_RESET				0x40 + 0
#define MMC_INIT				0x40 + 1
#define SD_CMD8                 0x40 + 8
#define MMC_READ_CSD			0x40 + 9
#define MMC_READ_CID			0x40 + 10
#define MMC_STOP_TRANSMISSION	0x40 + 12
#define MMC_SEND_STATUS			0x40 + 13
#define MMC_SET_BLOCKLEN		0x40 + 16
#define MMC_READ_BLOCK			0x40 + 17
#define MMC_READ_MULTI_BLOCK	0x40 + 18
#define MMC_WRITE_BLOCK			0x40 + 24
#define MMC_WRITE_MULTI_BLOCK	0x40 + 25
#define MMC_ERASE_WR_BLK_START_ADDR 0x40 + 32
#define MMC_ERASE_WR_BLK_END_ADDR   0x40 + 33
#define MMC_ERASE				0x40 + 38
#define MMC_APP_CMD             (0x40 + 55)
#define MMC_READ_OCR			0x40 + 58
#define MMC_CRC_ON_OFF          0x40 + 59

#define MMC_ACMD_SEND_OPC       0x40 + 41
#define MMC_ACMD44              0x40 + 44
#define BYTE_PER_SEC			512

#define CMD0                    0x40
#define CMD1                    (0x40 + 1)
#define CMD8                    (0x40 + 8)
#define CMD16                   (0x40 + 16)
#define CMD55                   (0x40 + 55)
#define CMD58                   (0x40 + 58)

#define ACMD41					(0xC0 + 41)


/* SD卡信息结构体定义 */ 
/* the information structure variable of SD Card*/
typedef struct SD_STRUCT
{	
	unsigned char card_type;
	unsigned char card_status;
	unsigned char block_num;				/* 卡中块的数量 */
	unsigned char block_len;				/* 卡的块长度(单位:字节) */
	unsigned char erase_unit;				/* 一次可擦除的块个数 */
	
	unsigned char timeout_read;				/* 读块超时时间(单位: 8 SPI clock) */
	unsigned char timeout_write;			/* 写块超时时间(单位: 8 SPI clock) */
	unsigned char timeout_erase;			/* 擦块超时时间(单位: 8 SPI clock) */
	
}sd_struct;

sd_struct sds;
unsigned char buff_w[512];
unsigned char buff_r[512];
unsigned int Timer1;
unsigned char registerbuff_r[512];
TIMER_Handle htimer1;
unsigned int start, end, overhead;
unsigned int writetime, readtime;
unsigned int transfertime1, transfertime2,transfertime3, transfertime4;
unsigned int testcount1, testcount2,testcount3;
unsigned char temp1[128];
unsigned char temp2[128];
/*----------------------------------------------------------------------------*/
extern far LOG_Obj LogMain;
extern far SWI_Obj SwiMain;
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(4)
  ),
  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_DELAY,
    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(3)
  ),
  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_RISING,
    MCBSP_PCR_CLKRP_DEFAULT
  )
};



unsigned char SPI_TransferByte(unsigned char value)       //数据传入后等待返回的数据
{ 
	unsigned int  incoming=0;	
	while (!MCBSP_xrdy(myMcbsp));                      
    MCBSP_write(myMcbsp,value);                      
	
	while(!MCBSP_rrdy(myMcbsp));
	incoming = MCBSP_read(myMcbsp);   //得到数据
	return(incoming);
}

unsigned char SPI_REV()       //数据传入后等待返回的数据
{ 
	unsigned int  incoming=0;	
	while(!MCBSP_rrdy(myMcbsp));
	incoming = MCBSP_read(myMcbsp);   //得到数据
	return(incoming);
}

unsigned char Write_Command_MMC(unsigned char cmd, unsigned int address)
{
	unsigned int retry=10;
	unsigned char tmp;
	unsigned char crcc = 0xFF;
	if(cmd&0x80)
	{
		cmd &=0x7F;
		tmp = Write_Command_MMC(CMD55,0);
		if(tmp>1)
			return tmp;
	}
	tmp = SPI_TransferByte(cmd);
	tmp = SPI_TransferByte(address>>24);
	tmp = SPI_TransferByte(address>>16);
	tmp = SPI_TransferByte(address>>8);
	tmp = SPI_TransferByte(address);
	if(cmd == CMD0) crcc = 0x95;
	if(cmd == CMD8) crcc = 0x87;
	tmp = SPI_TransferByte(crcc);   //不用crc验证
	
	do{
		tmp = SPI_TransferByte(0xFF);
	}while((tmp&0x80)&&retry--);   //  等待返回或者计时时间到达
	
	return(tmp);
}



unsigned char* Write_CMD8()
{
	unsigned char temp[20];
	temp[0] = SPI_TransferByte(SD_CMD8);
    temp[1] = SPI_TransferByte(0x00);  //39:32  reserve;
    temp[2] = SPI_TransferByte(0x00);  //31:24  reserve;
    temp[3] = SPI_TransferByte(0x01);  //23:20  reserve;  19:16 VHS
    temp[4] = SPI_TransferByte(0x66);  //check pattern
    temp[5] = SPI_TransferByte(0x87);  //CRC
    temp[6] = SPI_TransferByte(0xff);
    temp[7] = SPI_TransferByte(0xff);
    temp[8] = SPI_TransferByte(0xff);
    temp[9] = SPI_TransferByte(0xff);
    temp[10] = SPI_TransferByte(0xff);
    temp[11] = SPI_TransferByte(0xff);
    temp[12] = SPI_TransferByte(0xff);
    return temp;
}

unsigned char* Write_CMD55()
{
	unsigned char temp[20];
	unsigned char temp1;
	int i;

⌨️ 快捷键说明

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