在线时间32 小时
UID2100670
注册时间2015-7-28
NXP金币0
该用户从未签到
注册会员

- 积分
- 180
- 最后登录
- 2019-12-27
|
本帖最后由 andyxu 于 2016-11-9 21:32 编辑
芯片型号:MK60DN512ZVLQ10
我想利用CMD53先实现单块字节流的读取,但是不知道数据在哪儿读?
我调用自己写的函数:
_io_rw_extended(0, 0, 0, 1, &data[0], 1, 6);
函数定义如下(函数有点啰嗦,因为在调试阶段)int _io_rw_extended(int write, unsigned fn,
unsigned addr, int incr_addr, uint8_t *buf, unsigned blocks, unsigned blksz)
{
SDHC_Cmd_t cmd;
uint32_t *pBuffer = (uint32_t*)buf;
printf("1. SDHC_PRSSTAT = %x IRQSTAT = %x\r\n", SDHC->PRSSTAT, SDHC->IRQSTAT); 打印结果:1. SDHC_PRSSTAT = ff8800f8 IRQSTAT = 80
cmd.cmd = ESDHC_CMD53; /* xfertype */
cmd.arg = write ? 0x80000000 : 0x00000000;
cmd.arg |= fn << 28;
cmd.arg |= incr_addr ? 0x04000000 : 0x00000000; /* OP code */
cmd.arg |= addr << 9;
/* Block mode && Byte/Block count */
if (blocks == 1 && blksz < 256)
cmd.arg |= blksz; /* multi-byte mode */
else
cmd.arg |= 0x08000000 | blocks; /* multi-block mode */
cmd.blkSize = blksz;
cmd.blkCount = blocks;
uint32_t xfertyp;
uint32_t blkattr;
xfertyp = cmd.cmd;
/* resume cmd must set DPSEL */
if (ESDHC_XFERTYP_CMDTYP_RESUME == ((xfertyp & SDHC_XFERTYP_CMDTYP_MASK) >> SDHC_XFERTYP_CMDTYP_SHIFT))
{
xfertyp |= SDHC_XFERTYP_DPSEL_MASK;
}
if ((0 != cmd.blkCount) && (0 != cmd.blkSize))
{
xfertyp |= SDHC_XFERTYP_DPSEL_MASK;
/* multi-block transfer */
if (cmd.blkCount != 1)
{
//多块传输
xfertyp |= SDHC_XFERTYP_MSBSEL_MASK;
}
/* if 0xffffffff, then infinite transfer */
if ((uint32_t)-1 == cmd.blkCount)
{
//大量传输
blkattr = SDHC_BLKATTR_BLKSIZE(cmd.blkSize) | SDHC_BLKATTR_BLKCNT(0xFFFF);
}
else
{
blkattr = SDHC_BLKATTR_BLKSIZE(cmd.blkSize) | SDHC_BLKATTR_BLKCNT(cmd.blkCount);
xfertyp |= SDHC_XFERTYP_BCEN_MASK; /* enable the Block Count register */
}
}
else
{
blkattr = 0;
}
/* Read or Write */
if(write)
xfertyp &= ~SDHC_XFERTYP_DTDSEL_MASK;
else
xfertyp |= SDHC_XFERTYP_DTDSEL_MASK;
/* 卡移除状态清除,每次传输完成都会有该中断标记 */
SDHC->IRQSTAT |= SDHC_IRQSTAT_CRM_MASK;
/* set water level ,0x10 by default*/
// SDHC->WML = SDHC_WML_RDWML(1);
SDHC->IRQSTATEN |= SDHC_IRQSTATEN_BRRSEN_MASK;
SDHC->IRQSIGEN |= SDHC_IRQSIGEN_BRRIEN_MASK;
/* 等待CMD\DAT线空闲 */
SDHC_WaitCommandLineIdle();
printf("2. SDHC_PRSSTAT = %x IRQSTAT = %x xfertyp = %x\r\n", SDHC->PRSSTAT, SDHC->IRQSTAT, xfertyp); 打印结果:2. SDHC_PRSSTAT = ff8800f8 IRQSTAT = 0 xfertyp = 353a0012
printf("2. CMDARG = %x\r\n", cmd.arg);
打印结果:2. CMDARG = 4000006
/* issue cmd */
SDHC->CMDARG = cmd.arg;
SDHC->BLKATTR = blkattr;
SDHC->DSADDR = 0;
SDHC->XFERTYP = xfertyp;
/* 判断命令是否传输完成 SDHC_IRQSTAT_CC_MASK标志位 CMD Complete */
if(SD_StatusWait (SDHC_IRQSTAT_CIE_MASK | SDHC_IRQSTAT_CEBE_MASK | SDHC_IRQSTAT_CCE_MASK | SDHC_IRQSTAT_CC_MASK) != SDHC_IRQSTAT_CC_MASK)
{
SDHC->IRQSTAT |= SDHC_IRQSTAT_CTOE_MASK | SDHC_IRQSTAT_CIE_MASK | SDHC_IRQSTAT_CEBE_MASK | SDHC_IRQSTAT_CCE_MASK | SDHC_IRQSTAT_CC_MASK;
return ESDHC_ERROR_cmd_FAILED;
}
printf("3. SDHC_PRSSTAT = %x IRQSTAT = %x\r\n", SDHC->PRSSTAT, SDHC->IRQSTAT); /* Command complete */
打印结果:3. SDHC_PRSSTAT = ff88020e IRQSTAT = 81
/* get respond data */
if ((xfertyp & SDHC_XFERTYP_RSPTYP_MASK) != SDHC_XFERTYP_RSPTYP(ESDHC_XFERTYP_RSPTYP_NO))
{
cmd.resp[0] = SDHC->CMDRSP[0];
if ((xfertyp & SDHC_XFERTYP_RSPTYP_MASK) == SDHC_XFERTYP_RSPTYP(ESDHC_XFERTYP_RSPTYP_136))
{
cmd.resp[1] = SDHC->CMDRSP[1];
cmd.resp[2] = SDHC->CMDRSP[2];
cmd.resp[3] = SDHC->CMDRSP[3];
}
}
printf("4. SDHC_PRSSTAT = %x IRQSTAT = %x resp[0] = 0x%x\r\n", SDHC->PRSSTAT, SDHC->IRQSTAT, cmd.resp[0]);
打印结果:4. SDHC_PRSSTAT = ff88020e IRQSTAT = 81 resp[0] = 0x1000,从SDHC_PRSSTAT 的结果来看,Read Transfer Active是激活了,0e也是表示各个clock也是active的,感觉就差一步读数据了。
/* receive data */
uint32_t i, j;
for(i = 0; i < blocks; i++)
{
for (j = (blksz + 3) >> 2;j != 0;j--)
{
*pBuffer++ = SDHC->DATPORT;
}
}
return 0;
}
下面是打印的结果:
下面这个是协议上的多块读写的说明。
|
|