当前位置: 技术问答>linux和unix
SD 卡读写问题?高分求助
来源: 互联网 发布时间:2016-03-07
本文导语: 我使用的是AT91RM9200控制器,ATMEL的ARM,遵循的是SDcard的1。0标准 现在自己在做驱动 在我完成对SD卡的初始化之后,想对其做测试,测试代码如下 int AT91F_Test(void) { unsigned int Max_Read_DataBlock_Length; unsigned int Relative_A...
我使用的是AT91RM9200控制器,ATMEL的ARM,遵循的是SDcard的1。0标准
现在自己在做驱动
在我完成对SD卡的初始化之后,想对其做测试,测试代码如下
int AT91F_Test(void)
{
unsigned int Max_Read_DataBlock_Length;
unsigned int Relative_Address;
unsigned int RData;
int j=0,i=0;
AT91F_MCI_MMC_SelectCard(&MCI_Device,MCI_Device.pMCI_DeviceFeatures->Relative_Card_Address);//选择卡
Max_Read_DataBlock_Length =(MCI_Device.pMCI_DeviceFeatures->Max_Read_DataBlock_Length);
AT91C_BASE_MCI->MCI_MR |= (Max_Read_DataBlock_LengthMCI_TDR=Buffer[j];
}
}
printf("j %drn",j);
printf("send tdr over!rn");
AT91F_MCI_SendCommand(&MCI_Device,AT91C_READ_SINGLE_BLOCK_CMD,5*Max_Read_DataBlock_Length);
for(j=0;jMCI_SR>>1)&0x1)//检测接收状态位,准备接收数据,问题就出在这里,假如我不检测接收状态位直接读,则在我读一次接收寄存器之后,状态位显示为接收到新的数据,读两次之后则又变为没有收到新的数据,并且一直按照这种规则循环。
{
AT91F_MCIDeviceWaitReady(100);
RData=AT91C_BASE_MCI->MCI_RDR;
RData=AT91F_MCI_SWAP(RData);
printf("RData is %x,%d !rn",RData,j);
printf("AT91C_BASE_MCI->MCI_SR is %x!rn",AT91C_BASE_MCI->MCI_SR);
j++;
// }
}
AT91F_MCIDeviceWaitReady(100);
Delay_time(1000);
return TRUE;
}
问题在:
1、假如我每次只写一个数,然后跳过状态检测立即读出来(如果检测状态位,仍然过不去),则结果正确。
2、假如我每次写一个块的数据,然后读,无论怎样都不正确。
在这里我采用的是轮询的方式检测其读写状态,写操作能够完成。
但是读操作始终不能进行,状态寄存器显示没有收到数据。假如我
跳过状态检测直接读数据寄存器,也能够读到数据,并且我读一次接受数据寄存器之后,状态寄存器则变为接受到新的数据,只是数据不对。
现在自己在做驱动
在我完成对SD卡的初始化之后,想对其做测试,测试代码如下
int AT91F_Test(void)
{
unsigned int Max_Read_DataBlock_Length;
unsigned int Relative_Address;
unsigned int RData;
int j=0,i=0;
AT91F_MCI_MMC_SelectCard(&MCI_Device,MCI_Device.pMCI_DeviceFeatures->Relative_Card_Address);//选择卡
Max_Read_DataBlock_Length =(MCI_Device.pMCI_DeviceFeatures->Max_Read_DataBlock_Length);
AT91C_BASE_MCI->MCI_MR |= (Max_Read_DataBlock_LengthMCI_TDR=Buffer[j];
}
}
printf("j %drn",j);
printf("send tdr over!rn");
AT91F_MCI_SendCommand(&MCI_Device,AT91C_READ_SINGLE_BLOCK_CMD,5*Max_Read_DataBlock_Length);
for(j=0;jMCI_SR>>1)&0x1)//检测接收状态位,准备接收数据,问题就出在这里,假如我不检测接收状态位直接读,则在我读一次接收寄存器之后,状态位显示为接收到新的数据,读两次之后则又变为没有收到新的数据,并且一直按照这种规则循环。
{
AT91F_MCIDeviceWaitReady(100);
RData=AT91C_BASE_MCI->MCI_RDR;
RData=AT91F_MCI_SWAP(RData);
printf("RData is %x,%d !rn",RData,j);
printf("AT91C_BASE_MCI->MCI_SR is %x!rn",AT91C_BASE_MCI->MCI_SR);
j++;
// }
}
AT91F_MCIDeviceWaitReady(100);
Delay_time(1000);
return TRUE;
}
问题在:
1、假如我每次只写一个数,然后跳过状态检测立即读出来(如果检测状态位,仍然过不去),则结果正确。
2、假如我每次写一个块的数据,然后读,无论怎样都不正确。
在这里我采用的是轮询的方式检测其读写状态,写操作能够完成。
但是读操作始终不能进行,状态寄存器显示没有收到数据。假如我
跳过状态检测直接读数据寄存器,也能够读到数据,并且我读一次接受数据寄存器之后,状态寄存器则变为接受到新的数据,只是数据不对。
|
路过,顶一下.
|
你是用的4bit还是1bit模式来做的,如果一种不行换另外一种试一下