Hi all,
I am trying to write/read to an SD card using a baremetal application. I DO NOT want to format it as FAT32. I simply want to do the simplest bare read/write possible. I am using the Zynq 7Z02.
I've tracked it down to failing within the "readpolled" function call (a function in the xsdps.c file). Within that file, it fails somewhere in here because apparently StatusReg & XSDPS_INTR_ERR_MASK == 1 (aka, read has failed):
do {
StatusReg = XSdPs_ReadReg16(InstancePtr-Config.BaseAddress,
tXSDPS_NORM_INTR_STS_OFFSET);
if (StatusReg & XSDPS_INTR_ERR_MASK) {
t/*
t * Write to clear error bits
t */
tXSdPs_WriteReg16(InstancePtr->Config.BaseAddress,
tttXSDPS_ERR_INTR_STS_OFFSET,
tttXSDPS_ERROR_INTR_ALL_MASK);
tStatus = XST_FAILURE;
tgoto RETURN_PATH;
t}
} while((StatusReg & XSDPS_INTR_TC_MASK) == 0);
I hope someone can help. Below you'll find the code which initializes the SD card.
This is what I have so far:
uint8_t tSCR[8] __attribute__ ((aligned(32)));
uint8_t tReadBuff[64] __attribute__ ((aligned(32)));
XSdPs_Config *SdConfig;
int statusSdFlash = 0;
int readSd = 0;
// Check if card is in the socket
uint32_t StatusReg = XSdPs_GetPresentStatusReg(XPAR_XSDPS_0_BASEADDR);
if ((StatusReg & XSDPS_PSR_CARD_INSRT_MASK) == 0){
return 1;tt// No disk
}
//Initialize the host controller
SdConfig = XSdPs_LookupConfig(XPAR_PS7_SD_0_DEVICE_ID);
tif (NULL == SdConfig){
ttreturn 1;
t}
statusSdFlash = XSdPs_CfgInitialize(&sd0Inst, SdConfig, SdConfig->BaseAddress);
t
if (statusSdFlash != XST_SUCCESS){
ttreturn 1;
t}
statusSdFlash = XSdPs_SdCardInitialize(&sd0Inst);
if (statusSdFlash != XST_SUCCESS){
treturn 1;
t}
statusSdFlash = XSdPs_Change_ClkFreq(&sd0Inst, 25000000/*XPAR_PS7_SD_0_SDIO_CLK_FREQ_HZ*/);
tif (statusSdFlash != XST_SUCCESS){
ttreturn 1;
t}
statusSdFlash = XSdPs_Select_Card(&sd0Inst);
tif (statusSdFlash != XST_SUCCESS){
ttreturn 1;
t}
statusSdFlash = XSdPs_Get_BusWidth(&sd0Inst, SCR);
tif (statusSdFlash != XST_SUCCESS){
ttreturn 1;
t}
statusSdFlash = XSdPs_Get_BusSpeed(&sd0Inst, ReadBuff);
tif (statusSdFlash != XST_SUCCESS){
ttreturn 1;
t}
if(ReadBuff[13] & HIGH_SPEED_SUPPORT){
tstatusSdFlash = XSdPs_Change_BusSpeed(&sd0Inst);
ttif (statusSdFlash != XST_SUCCESS){
tttreturn 1;
tt}
t}
statusSdFlash = XSdPs_Pullup(&sd0Inst);
tif (statusSdFlash != XST_SUCCESS){
ttreturn 1;
t}
if (SCR[1] & WIDTH_4_BIT_SUPPORT){
tstatusSdFlash = XSdPs_Change_BusWidth(&sd0Inst);
ttif (statusSdFlash != XST_SUCCESS){
tttreturn 1;
tt}
t}
statusSdFlash = XSdPs_SetBlkSize(&sd0Inst, XSDPS_BLK_SIZE_512_MASK);
tif (statusSdFlash != XST_SUCCESS){
ttreturn 1;
t}
statusSdFlash = XSdPs_ReadPolled(&sd0Inst, 1, 1, sdBuf);
tif (statusSdFlash != XST_SUCCESS){
ttreturn 1;
t}
}
//separate function
XSdPs_Config *XSdPs_LookupConfig(uint16_t DeviceId){
tXSdPs_Config *CfgPtr = NULL;
tint Index;
tXSdPs_Config XSdPs_ConfigTable[] =
t{
tt{
ttXPAR_XSDPS_0_DEVICE_ID,
ttXPAR_XSDPS_0_BASEADDR,
ttXPAR_XSDPS_0_SDIO_CLK_FREQ_HZ
tt}
t};
t
for (Index = 0; Index < XPAR_XSDPS_NUM_INSTANCES; Index++) {
if (XSdPs_ConfigTable[Index].DeviceId == DeviceId) {
tCfgPtr = &XSdPs_ConfigTable[Index];
tbreak;
t}
}
return CfgPtr;
}