This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320C5535:SDHC 卡读/写速度

Guru**** 2595805 points
Other Parts Discussed in Thread: TMS320C5535

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/641264/tms320c5535-sdhc-card-read-write-speed

器件型号: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)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我已通知 RTOS 团队。 他们的反馈将在此处发布。

    请发帖、您使用的是哪个 SDK 版本?

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你(们)好 谢谢。

    我只能在 它的包装盒上看到“Rev D”。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Vlad、

    请参阅此帖子、了解如何提高 SD RW 速度。 我认为此处发布的示例将对您有用。
    e2e.ti.com/.../401918

    Lali