请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:TMS320C5535 大家好。
我将 eZdsp USB 套件与 TMS320C5535 MCU 配合使用、并将 CCS 与 CSL_MMCSD_SdCardExample_Out 示例结合使用。
在我的项目中、我需要定期将数据写入32Gb SDHC 卡、通用速度为250kB/s 我知道 SDHC 卡接口可以支持更快的写入流、但在我的应用和测试应用中、速度不能超过40kB/s (这是最佳结果)。
我在这里展示了测试程序的源文件、其中我只对乘法写入进行了一些小改动。 我通过测量">>> 开始写入 <<<和">>> 完成写入 <<<调试打印之间的时间来计算速度。 其他文件未更改。
我在哪里遇到了错误? 如何提高传输数据的速度?
提前感谢您。
/**
*\brief 测试 SD 卡在轮询模式下的运行
情况*
*此函数将 MMCSD 模块配置为轮询模式,
并*使用 SD 卡验证运行情况。 在
未检测到 SD 卡的情况下、函数返回故障*。
*
*\param none
*
*\return Test Result
*/
CSL_Status CSL_sdCardPollTest (void)
{
CSL_StatusmmcStatus;
uint16count;
uint16actCard;
uint32 sectCount;
uint32 CardAddr;
UINT16 时钟 Div;
UINT16 RCA;
UINT32 cardStatus;
uint32 loop;
sectCount = 0;
//初始化数据缓冲区*/
for (count = 0;count <(buffer_MAX_SIZE/2);count++)
{
pReadBuff[count]= 0x0;
pWritedBuff[count]= count;
}
//获取当前 CPU 频率的时钟分频器值*/
clockDiv = computeClkRate ();
//初始化 CSL MMCSD 模块*/
mmcStatus = MMC_init ();
if (mmcStatus!= CSL_Sok ()
;{mmcprintf
失败)
:返回 mmcAPI
mmcStatus = SYS_setEBSR (CSL_EBSR_FIELD_SP0MODE、
CSL_EBSR_SP0MODE_0);
mmcStatus |= SYS_setEBSR (CSL_EBSR_FIELD_SP1MODE、
CSL_EBSR_SP1MODE_0);
if (CSL_Sok!= mmcStatus)
{
printf ("SYS_setEBSR 失败\n");
返回(mmcStatus);
}
//
在轮询模式下打开 MMCSD 模块*/#ifdef C5515_eZdsp
mmcsdHandle = MMC_open (&pMmcsdContactObj、CSL_MMCSD1_INST、CSL_MMCSD_OPMODE_Contacted、&mmccsStatus);
#else mmccsdHandle
= MMCL_MMCSD1_INST
(#mmccs0_open_mmccsf)
;#mmccsdMCL_mccsdMC0_mccsf (#mmccsdMCWend_mmccs_mm_mmccs0_mmccs_open= mmccs0_mccs_mccs_mmccs_mmccsdCMDCMOS0_mmd= mmccs_mmccsd\ntle= mmccs0_mmccsdMC0_mmccsd\nmmccsd\nmmccsd\ntenf)
;(#mmccs_mmccs_mmccsdMC
if (mmcStatus!= CSL_SOK)
{
printf ("API:MMC_sendGoIdle 失败\n");
return (mmcStatus);
}
//检查卡*/
mmcStatus = MMC_selectCard (mmcsdHandle、&mmcCardObj);
if ((mmcStatus == CSL_ESYS_BADHANDLE)||
(mmcStatus = CSL_ESYS_INVPARAMS))
{
printf ("API:MMC_Verify tCard failed\n"*
(mmcStatus = CSL_ESYS_INVPADRAMS)));如果
未检测到 MMSD_SD 卡、则为 mmcCardObj.cardType (MMCSD_SD)!
/*检查该卡是否为高容量卡*/
if (mmcsdHandle->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");
}
否则
{
"SD ("SD
卡未被检测到!!\n"printn");}插入 SD 卡
/*设置初始化时钟*/
mmcStatus = MMC_sendOpCond (mmcsdHandle、70);
if (mmcStatus!= CSL_Sok)
{
printf ("API:MMC_sendOpCond 失败\n");
return (mmcStatus);
}
//发送卡识别数据&Data = SD_sendOpCond!(
如果 mmcsdf)、则为 mmcsdCardAddress!(mmcsf)= mmdcsrendCdCf (dCdCdCdCf)!
(如果为 mmdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCf)、则为 mmdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCdCf);}(如果为 mmdCdCdCdCCR sd_sendRca 失败\n");
return (mmcStatus);
}/*
读取 SD 卡特定数据*/
mmcStatus = sd_getCardCSd (mmcsdHandle、&sdCardCsdObj);
if (mmcStatus!= CSL_SOK)
{
mmcsf ("API:sdbBusd、&sdbcs);
if (mmcStatus)}(mmcoffset)(mmcoffset);mmcoffset (mmcoffset)(mmcoffset)(mmcoffer 1);}mmcoffset (mmcoffset)(mmcoffset)(mmcoffset)!(mmcoffset)(mmcoffset)(mmcoffset)(mmcoffset)!)(如果 mmcoffer
/*禁用 SD 卡上拉电阻器-可选*/
mmcStatus = SD_configurePullup (mmcsdHandle,0);
if (mmcStatus!= CSL_Sok)
{
printf ("API:SD_configurePullup 失败\n");
return (mmcStatus);
}
//在内部数据中设置卡类型(mmcStatus
= mmcMC_mmc mmcCardObj.cardType);
)
;如果 mmcCardType = mmc (mmc =失败)
、则为 mmcensoritum_mmc (mmc = mmc)
/*在内部数据结构中设置卡指针*/
mmcStatus = MMC_setCardPtr (mmcsdHandle、&mmcCardObj);
if (mmcStatus!= CSL_Sok)
{
printf ("API:MMC_setCardPtr 失败\n");
return (mmcOfStatus);
}
//获取卡数(mmccsr
);mmccsr 读数(mmccsn)/mmcock_timesn
mmcStatus = MMC_sendOpCond (mmcsdHandle、clockDiv);
if (mmcStatus!= CSL_Sok)
{
printf ("API:MMC_sendOpCond 失败\n");
return (mmcStatus);
}
//为读取和写入操作设置端模式*/
mmcStatus = MMC_sendOpCond 模式、mmccs_enHandle_set_mmccs_mode_en_decd (mmcStatus)
CSL_MMCSD_ENDIAN_LIT);
if (mmcStatus!= CSL_SOK)
{
printf ("API:MMC_setEndianMode Failed\n");
return (mmcStatus);
}
//为存储卡设置块长度
*对于高容量卡设置块长度将不
起作用
* mmcStatus
(mmcStatus = mmcStolds
)
;如果 mmccsl_mmcLockSt长度= mmcStel_mms!(mmcockL_mmcockLs)、则设置块长度
(mmcockLs)
printf (">>>开始写入<<<\n");
for (loop = 0;loop < 5000;loop++)
{
if (mmcCardObj.sdHcDetected)
{
WritAddr = loop*(buffer_MAX_SIZE/512)+(0x20000;loop
=
512);}否则{Addr = 0x20000 mmcCardObj.sdc = Write_mmc
= loop*(mm_Data_mmc)
;mmdmmc = 0xdcard_Write_Data_mmdmmc = 0xDsize (if)+ mmcum_mmc = 0xdum_mmc = 0xDx、mcumn);mmc = mmdum_mcum_mcum_mcum_mcum_mc = 0xdum_mc =
return (mmcStatus);
}
//else
//{
//printf ("API:MMC_WRITE SUCCE\n");
//
}
printf (">>>)完成写入<</\n");
//从 SD 卡读取数据*/
for (loop = 0;loop < 5000;loop++)
{
if (mmcardr+ max_++ dr
= 0x000*大小)/apor_max_addr*(max_r=0x512*)
mmcStatus = MMC_Read (mmcsdHandle、cardAddr、buffer_MAX_SIZE、pReadBuff);
if (mmcStatus!= CSL_Sok)
{
printf ("API:MMC_Read Failed\n");
return (mmcStatus);
}
//else
//
{// printf ("API:MMC_read failed");*(mmc_count
);//(mmc = 0)/count / count / count /(成功;//) count++)
{
if (pReadBuff[count]!= pWritedBuff[count])
{
printf ("\n 缓冲区未匹配位置%d\n"、count);
return (CSL_ESYS_FAIL);
取消选择}//获取卡状态*/ mmcStatus = MMC_getCardStatus (mmcHandle)(mmcstle)
(mmcssc = mmcdkc!)= mmcdkc (mmcdkc);如果 mmcdkc = mmcdkc = mmcf (mmcdkc)、则:mmckc = mmckc (mmcf)、则为 mmcdkc (mmckc = mmcf);mcssc = mmcdkc (mmcf)= mmckid (mmcf (mmcf);(mmcf)= mmcss
MMC_deselectCard 失败\n");
return (mmcStatus);
}//清除
MMCSD 卡响应寄存器*/
mmcStatus = MMC_clearResponse (mmcsdHandle);
if (mmcStatus!= CSL_SOK)
{
printf ("API:MMC_clearResponse failed\n");
return (mmccsd_mcStatus!
)= 0xmmccsdmmcSD (mmccsdmmc00);mmccsdmmccsd_mccsf (mmccsdmmccsn)= 0xmccsd_mccsf)}(mmccsdmmccsf (mmccsd_mccsdf);mmccsdmmccsf (如果 MMccsd_mccsf)、mmccsf (mmccsdmmccsf)、mmccsdCMdf
/*关闭 MMCSD 模块*/
mmcStatus = MMC_Close (mmcsdHandle);
if (mmcStatus!= CSL_Sok)
{
printf ("API:MMC_Close Failed \n");
return (mmcStatus);
}
else
{
printf ("API:MMC_Close Successful \n");
}
printf ("MMC_Close Failed");读回缓冲器
(mmcssd)