Hi,
Try - if this helps you, this is my MQX function to determine the speed of card:
static int_32 _set_sd_high_speed_mode(SDCARD_STRUCT_PTR sdcard_ptr, uint_32 baudrate)
{
ESDHC_COMMAND_STRUCT command;
uint_32 param;
uint_8 cmd6_data[64];
#define SFS_FUNC_GROUP1_BIT 400
#define SFS_FUNC_GROUP2_BIT 416
#define SFS_FUNC_GROUP3_BIT 432
#define SFS_FUNC_GROUP4_BIT 448
#define SFS_FUNC_GROUP5_BIT 464
#define SFS_FUNC_GROUP6_BIT 480
#define SFS_FUNC_GROUP1_FUNC 376
#define SFS_GET_BYTE_CNT(bit) (63 - (bit) / 8)
// set BLKCNT field to 1 (block), set BLKSIZE field to 64 (bytes);
// send CMD6, with argument 0xFFFFF1 and read 64 bytes of data accompanying the R1 response;
// wait data transfer done bit is set;
/* Check the card capability of bus speed*/
command.COMMAND = ESDHC_CREATE_CMD(6, ESDHC_COMMAND_TYPE_NORMAL, ESDHC_COMMAND_RESPONSE_R1, ESDHC_COMMAND_DATACMD_FLAG | ESDHC_COMMAND_DATA_READ_FLAG);
command.ARGUMENT = 0xFFFFF1;
command.BLOCKS = 1;
command.BLOCKSIZE = 64;
if (ESDHC_OK != ioctl (sdcard_ptr->COM_DEVICE, IO_IOCTL_ESDHC_SEND_COMMAND, &command))
{
return IO_ERROR;
}
if (64 != fread (cmd6_data, 1, 64, sdcard_ptr->COM_DEVICE))
{
return IO_ERROR;
}
if (ESDHC_OK != fflush (sdcard_ptr->COM_DEVICE))
{
return IO_ERROR;
}
// Check the response
// in the function group 1, check the first function availability
if((cmd6_data[SFS_GET_BYTE_CNT(SFS_FUNC_GROUP1_BIT)] & 0x01) == 0)
return MQX_IO_OPERATION_NOT_AVAILABLE; // if (bit 401 is '0') report the SD card does not support high speed mode and return;
/* Set the high speed of bus */
command.COMMAND = ESDHC_CREATE_CMD(6, ESDHC_COMMAND_TYPE_NORMAL, ESDHC_COMMAND_RESPONSE_R1, ESDHC_COMMAND_DATACMD_FLAG | ESDHC_COMMAND_DATA_READ_FLAG);
command.ARGUMENT = 0x80FFFFF1;
command.BLOCKS = 1;
command.BLOCKSIZE = 64;
if (ESDHC_OK != ioctl (sdcard_ptr->COM_DEVICE, IO_IOCTL_ESDHC_SEND_COMMAND, &command))
{
return IO_ERROR;
}
if (64 != fread (cmd6_data, 1, 64, sdcard_ptr->COM_DEVICE))
{
return IO_ERROR;
}
if (ESDHC_OK != fflush (sdcard_ptr->COM_DEVICE))
{
return IO_ERROR;
}
// Check the response
// in the function group 1, check the first function availability
if((cmd6_data[SFS_GET_BYTE_CNT(SFS_FUNC_GROUP1_FUNC)] & 0x0F) != 0x01)
return MQX_IO_OPERATION_NOT_AVAILABLE; // if (bit 401 is '0') report the SD card does not support high speed mode and return;
param = baudrate;
if (ESDHC_OK != ioctl (sdcard_ptr->COM_DEVICE, IO_IOCTL_ESDHC_SET_BAUDRATE, ¶m))
{
return IO_ERROR;
}
return 0;
}
Petr