工具/软件:Code Composer Studio
1:SDCard 设备初始化并成功打开
CSL_Status sdcard_init (CSL_MmcsdInstId 端口)
{
uint8 i = 0;
//#ifdef do_SDCARD
//CSL_MmcsdHandle mmcsdHandle;
uint16 actCard;
uint32 sectCount;
uint16 RCA;
sectCount = 0;
//////////////////////////////// 请参阅//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////初始化 SD 卡接口
// status = EZDSP5535_SDCARD_init ();
// if (状态)
// printf ("SD 卡初始化失败。\n");
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// mmcsdHandle = 0;
// if (port == CSL_MMCSD0_INST)
// mmcsdHandle_0 = mmcsdHandle;
//否则
// mmcsdHandle_1 = mmcsdHandle;
/*仅为 MMCSD0*/初始化 CSL MMCSD 模块
// if (port == CSL_MMCSD0_INST)
//{
// mmcStatus = MMC_init ();
// if (mmcStatus!= CSL_SOK)
//{
// printf (" MMC_init 失败\n");
// return (mmcStatus);
//}
//}
pMmcsdContObj[port].numCardsActive = 0;
/*以轮询模式打开 MMCSD 模块*/
dhMmcsdHandle[port]= MMC_open (&pMmcsdContactObj[port]、port、CSL_MMCSD_OPMODE_POLED、&mmcStatus);
if (mmcStatus!= CSL_SOK)
{
printf (" MMC_open 失败\n");
return (mmcStatus);
}
其他
{
printf (" mmc_open 成功\n");
}
/*将 CMD0发送到卡*/
mmcStatus = MMC_sendGoIdle (dhMmcsdHandle[port]);
if (mmcStatus!= CSL_SOK)
{
printf (" MMC_sendGoIdle 失败\n");
return (mmcStatus);
}
/*检查卡*/
mmcStatus = MMC_selectCard (dhMmcsdHandle[port]、&mmcCardObj);
if ((mmcStatus == CSL_ESYS_BADHANDLE)||
(mmcStatus =CSL_ESYS_INVPARAMS))
{
printf (" MMC_selectCard 失败\n");
return (mmcStatus);
}
/*验证是否检测到 SD 卡*/
if (mmcCardObj.cardType == CSL_SD_card)
{
printf ("检测到 SD 卡!\n");
/*检查该卡是否为高容量卡*/
if (dhMmcsdHandle[port]->cardObj->sdHcDetected == true)
{
printf (" SD 卡是高容量卡\n");
printf ("内存访问将使用块寻址\n");
将使用针对 SDHC 卡块寻址的/*。
扇区地址将与扇区编号*/相同
cardAddr = sectCount;
}
其他
{
printf (" SD 卡是标准容量卡\n");
printf ("内存访问将使用字节寻址\n");
将使用针对 SD 卡字节寻址的//。
扇区地址将是扇区编号的乘积
和扇区大小*/
cardAddr =(sectCount)*(CSL_MMCSD_BLOCK_LENGTH);
}
}
其他
{
/*检查是否插入了卡*/
if (mmcCardObj.cardType == CSL_CARD_NONE)
{
printf ("未检测到卡!\n");
}
其他
{
printf ("未检测到 SD 卡!\n");
}
printf ("请插入 SD 卡!!!\n");
返回(CSL_ESYS_FAIL);
}
//设置初始化时钟
mmcStatus = MMC_sendOpCond (dhMmcsdHandle[port]、70);
if (mmcStatus!= CSL_SOK)
{
printf (" MMC_sendOpCond 失败\n");
return (mmcStatus);
}
/*发送卡识别数据*/
mmcStatus = sd_sendAllCID (dhMmcsdHandle[port]、&sdCardIdObj);
if (mmcStatus!= CSL_SOK)
{
printf (" sd_sendAllCID 失败\n");
return (mmcStatus);
}
/*设置相对卡地址*/
mmcStatus = sd_sendRca (dhMmcsdHandle[port]、&mmcCardObj、&RCA);
if (mmcStatus!= CSL_SOK)
{
printf (" sd_sendRca 失败\n");
return (mmcStatus);
}
/*读取 SD 卡特定数据*/
mmcStatus = sd_getCardd (dhMmcsdHandle[port]、&sdCardCsdObj);
if (mmcStatus!= CSL_SOK)
{
printf (" sd_getCardccsd 失败\n");
return (mmcStatus);
}
/*设置总线宽度-可选*/
mmcStatus = SD_setBusWidth (dhMmcsdHandle[port]、1);
if (mmcStatus!= CSL_SOK)
{
printf (" sd_setBusWidth 失败\n");
return (mmcStatus);
}
/*禁用 SD 卡上拉电阻器-可选*/
mmcStatus = SD_configurePullup (dhMmcsdHandle[port]、0);
if (mmcStatus!= CSL_SOK)
{
printf (" sd_configurePullup 失败\n");
return (mmcStatus);
}
/*在内部数据结构中设置卡类型*/
mmcStatus = MMC_setCardType (&mmcCardObj、mmcCardObj.cardType);
if (mmcStatus!= CSL_SOK)
{
printf (" MMC_setCardType 失败\n");
return (mmcStatus);
}
/*在内部数据结构中设置卡指针*/
mmcStatus = MMC_setCardPtr (dhMmcsdHandle[port]、&mmcCardObj);
if (mmcStatus!= CSL_SOK)
{
printf (" MMC_setCardPtr 失败\n");
return (mmcStatus);
}
/*获取卡数*/
mmcStatus = MMC_getNumberOfCards (dhMmcsdHandle[port]、&actCard);
if (mmcStatus!= CSL_SOK)
{
printf (" MMC_getNumberOfCards 失败\n");
return (mmcStatus);
}
//设置读写访问的时钟
mmcStatus = MMC_sendOpCond (dhMmcsdHandle[port]、0);
if (mmcStatus!= CSL_SOK)
{
printf (" MMC_sendOpCond 失败\n");
return (mmcStatus);
}
/*为读取和写入操作设置端模式*/
mmcStatus = MMC_setEndianMode (dhMmcsdHandle[port]、CSL_MMCSD_ENDIAN_LIT、CSL_MMCSD_ENDIAN_LIT);
if (mmcStatus!= CSL_SOK)
{
printf (" MMC_setendianMode 失败\n");
return (mmcStatus);
}
/*设置存储卡的块长度
*对于高容量卡、设置块长度将具有
*无影响
*
mmcStatus = MMC_setBlockLength (dhMmcsdHandle[port]、CSL_MMCSD_BLOCK_LENGTH);
if (mmcStatus!= CSL_SOK)
{
printf (" MMC_setBlockLength 失败\n");
return (mmcStatus);
}
//#endif //do_SDCARD
// if (port == CSL_MMCSD0_INST)
// mmcsdHandle_0 = mmcsdHandle;
//否则
// mmcsdHandle_1 = mmcsdHandle;
// dhMmcsdHandle[port]= mmcsdHandle;
MAX_DATA_SIZE = 0;//ToDo:添加获取最大大小过程
对于(I = 0;I < 256;I++)
globalParam[i]= i;
return (mmcStatus);
}
写入操作
MMC_WRITE (hmcsd、cardAddr、noOfBytes、writeBuffer);
一直锁定
mmcStatus = CSL_MMCSD_BUSY_STATE;
操作
{
status = hmcsd->mmcRegs->MMCST1;
mmcStatus |=(status & CSL_MMCSD_FIFO_EMPTY);
if ((status & CSL_MMCSD_BUSY_STATE)=0)
{
mmcStatus &=~CSL_MMCSD_BUSY_STATE;
}
} while ((((mmcStatus & CSL_MMCSD_FIFO_EMPTY)!= CSL_MMCSD_FIFO_EMPTY)||
((mmcStatus & CSL_MMCSD_BUSY_State)== CSL_MMCSD_BUSY_State))
如何解决问题