koyodza (29.09.2011 22:09, просмотров: 211) ответил Гудвин на Может быть и не 100 - лень вспоминать/думать ;) Проще было найти заведомо рабочий кусок кода (мега тактируется от встроенного генератора 8 МГц):
слишком много магических чисел у меня как-то так:
static SD_Error SD_GoIdleState(void)
{
Pins(CARD_CS, LOW);
SD_SendCmd(SD_CMD_GO_IDLE_STATE, 0, 0x95); // CMD0 (SD_CMD_GO_IDLE_STATE) to put SD in SPI mode
if (SD_GetResponse(SD_IN_IDLE_STATE)) // Idle State Response (R1 Format) 0x01
return SD_RESPONSE_FAILURE;
do
{
Pins(CARD_CS, HIGH);
SD_WriteByte(SD_DUMMY_BYTE);
Pins(CARD_CS, LOW);
SD_SendCmd(SD_CMD_SEND_OP_COND, 0, 0xFF); // CMD1 (Activates the card process)
}
while (SD_GetResponse(SD_RESPONSE_NO_ERROR));
Pins(CARD_CS, HIGH);
SD_WriteByte(SD_DUMMY_BYTE);
// SetHighSpeed
while(SPI_I2S_GetFlagStatus(CARD_SPI, SPI_I2S_FLAG_TXE) == RESET);
CARD_SPI->CR1 = (CARD_SPI->CR1 & (~SPI_BaudRatePrescaler_256)) | SPI_BaudRatePrescaler_2;
CARD_READY = TRUE;
return SD_RESPONSE_NO_ERROR;
}
SD_Error SD_Init(void)
{
SD_LowLevel_Init();
Pins(CARD_CS, HIGH);
for (int i = 0; i < 10; i++)
SD_WriteByte(SD_DUMMY_BYTE);
return SD_GoIdleState();
}