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.

[参考译文] CCS/TMS320C5535:SDCard 写入操作锁

Guru**** 2538955 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/609249/ccs-tms320c5535-the-sdcard-write-operation-lock

器件型号:TMS320C5535

工具/软件: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))

如何解决问题  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    出错时:
    MMCST1 = 0х0012 Ω
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    我已通知软件团队。 他们的反馈将在此处发布。

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    GenaChap、
    您基于什么代码库开始开发? 是基于 software-dl.ti.com/.../index_FDS.html 上的 C55x CSL 3.07

    在下面的路径上有 SD 示例、这些示例在 C5535 eZdsp 上工作。 因此、我建议查看这些示例以构建代码。
    C:\ti\c55_lp\c55_CSL_3.07\ccs_v6.x_examples\mmc_sd

    希望这对您有所帮助。
    Lali