[sdlogger] added sdcard error status

This commit is contained in:
Bart Slinger
2015-10-28 21:08:09 +01:00
parent ec15491b9a
commit eef767ed46
3 changed files with 37 additions and 0 deletions
+1
View File
@@ -13,6 +13,7 @@
<dl_settings NAME="SD Logger">
<dl_setting module="loggers/sdlogger_spi_direct" var="sdlogger_spi.status" min="0" max="20" step="1"/>
<dl_setting module="loggers/sdlogger_spi_direct" var="sdcard1.status" min="0" max="40" step="1"/>
<dl_setting module="loggers/sdlogger_spi_direct" var="sdcard1.error_status" min="0" max="15" step="1"/>
<dl_setting module="loggers/sdlogger_spi_direct" var="sdlogger_spi.last_completed" min="0" max="42" step="1"/>
<dl_setting module="loggers/sdlogger_spi_direct" var="sdlogger_spi.next_available_address" min="16384" max="4294967295" step="1" />
<dl_setting module="loggers/sdlogger_spi_direct" var="sdlogger_spi.command" min="1" max="42" step="1" />
+16
View File
@@ -89,6 +89,7 @@ void sdcard_spi_init(struct SDCard *sdcard, struct spi_periph *spi_p, const uint
sdcard->status = SDCard_BeforeDummyClock;
sdcard->card_type = SDCardType_Unknown;
sdcard->error_status = SDCardError_None;
}
/**
@@ -179,6 +180,7 @@ void sdcard_spi_spicallback(struct spi_transaction *t)
sdcard1.status = SDCard_SendingCMD8;
} else if (sdcard1.response_counter >= 9) {
sdcard1.status = SDCard_Error;
sdcard1.error_status = SDCardError_InitializationNoResponse;
} else {
sdcard_spi_request_bytes(&sdcard1, 1);
}
@@ -198,6 +200,7 @@ void sdcard_spi_spicallback(struct spi_transaction *t)
sdcard1.status = SDCard_ReadingCMD8Parameter;
} else if (sdcard1.response_counter >= 9) {
sdcard1.status = SDCard_Error;
sdcard1.error_status = SDCardError_CardInfoNoResponse;
} else {
sdcard_spi_request_bytes(&sdcard1, 1);
}
@@ -211,6 +214,7 @@ void sdcard_spi_spicallback(struct spi_transaction *t)
sdcard1.timeout_counter = 0;
} else {
sdcard1.status = SDCard_Error;
sdcard1.error_status = SDCardError_InvalidCardInfo;
}
break;
@@ -228,12 +232,14 @@ void sdcard_spi_spicallback(struct spi_transaction *t)
sdcard1.status = SDCard_SendingACMD41v2;
} else {
sdcard1.status = SDCard_Error;
sdcard1.error_status = SDCardError_ACMD41Timeout;
}
} else if (t->input_buf[0] == 0x00) {
sdcard_spi_send_cmd(&sdcard1, 58, 0x00000000);
sdcard1.status = SDCard_SendingCMD58;
} else if (sdcard1.response_counter >= 9) {
sdcard1.status = SDCard_Error;
sdcard1.error_status = SDCardError_ACMD41NoResponse;
} else {
sdcard_spi_request_bytes(&sdcard1, 1);
}
@@ -250,6 +256,7 @@ void sdcard_spi_spicallback(struct spi_transaction *t)
case SDCard_ReadingCMD58Resp:
if (sdcard1.response_counter >= 9) {
sdcard1.status = SDCard_Error;
sdcard1.error_status = SDCardError_CMD58NoResponse;
} else if (sdcard1.input_buf[0] == 0x00) {
sdcard_spi_request_bytes(&sdcard1, 4);
sdcard1.status = SDCard_ReadingCMD58Parameter;
@@ -271,6 +278,7 @@ void sdcard_spi_spicallback(struct spi_transaction *t)
}
} else { // bit 31 not set, CCS bit is unvalid
sdcard1.status = SDCard_Error;
sdcard1.error_status = SDCardError_CCSBitInvalid;
}
break;
@@ -287,6 +295,7 @@ void sdcard_spi_spicallback(struct spi_transaction *t)
sdcard1.status = SDCard_Idle;
} else if (sdcard1.response_counter >= 9) {
sdcard1.status = SDCard_Error;
sdcard1.error_status = SDCardError_SetBlockSizeNoResponse;
} else {
sdcard_spi_request_bytes(&sdcard1, 1);
}
@@ -306,6 +315,7 @@ void sdcard_spi_spicallback(struct spi_transaction *t)
sdcard1.status = SDCard_BeforeSendingDataBlock;
} else if (sdcard1.response_counter >= 9) {
sdcard1.status = SDCard_Error;
sdcard1.error_status = SDCardError_WriteBlockNoResponse;
} else {
sdcard_spi_request_bytes(&sdcard1, 1);
}
@@ -325,6 +335,7 @@ void sdcard_spi_spicallback(struct spi_transaction *t)
sdcard1.status = SDCard_SendingDataBlock;
} else {
sdcard1.status = SDCard_Error;
sdcard1.error_status = SDCardError_SpiDriverError;
}
break;
@@ -334,6 +345,7 @@ void sdcard_spi_spicallback(struct spi_transaction *t)
sdcard1.status = SDCard_Busy;
} else {
sdcard1.status = SDCard_Error;
sdcard1.error_status = SDCardError_BlockWriteError;
}
sdcard1.spi_t.output_buf = sdcard1.output_buf;
break;
@@ -359,6 +371,7 @@ void sdcard_spi_spicallback(struct spi_transaction *t)
sdcard1.status = SDCard_WaitingForDataToken;
} else if (sdcard1.response_counter >= 9) {
sdcard1.status = SDCard_Error;
sdcard1.error_status = SDCardError_ReadBlockNoResponse;
} else {
sdcard_spi_request_bytes(&sdcard1, 1);
}
@@ -379,6 +392,7 @@ void sdcard_spi_spicallback(struct spi_transaction *t)
sdcard1.status = SDCard_ReadingDataBlock;
} else if (sdcard1.timeout_counter > 498) {
sdcard1.status = SDCard_Error;
sdcard1.error_status = SDCardError_ReadBlockTimeout;
}
break;
@@ -404,6 +418,7 @@ void sdcard_spi_spicallback(struct spi_transaction *t)
sdcard1.status = SDCard_MultiWriteIdle;
} else if (sdcard1.response_counter >= 9) {
sdcard1.status = SDCard_Error;
sdcard1.error_status = SDCardError_MultiWriteNoResponse;
} else {
sdcard_spi_request_bytes(&sdcard1, 1);
}
@@ -418,6 +433,7 @@ void sdcard_spi_spicallback(struct spi_transaction *t)
}
} else {
sdcard1.status = SDCard_Error;
sdcard1.error_status = SDCardError_MultiWriteError;
}
break;
+20
View File
@@ -87,6 +87,25 @@ enum SDCardStatus {
SDCard_MultiWriteStopping, /**< Busy sending the stop token */
};
enum SDCardErrorStatus {
SDCardError_None,
SDCardError_InitializationNoResponse,
SDCardError_CardInfoNoResponse,
SDCardError_InvalidCardInfo,
SDCardError_ACMD41Timeout,
SDCardError_ACMD41NoResponse,
SDCardError_CMD58NoResponse,
SDCardError_CCSBitInvalid,
SDCardError_SetBlockSizeNoResponse,
SDCardError_WriteBlockNoResponse,
SDCardError_SpiDriverError,
SDCardError_BlockWriteError,
SDCardError_ReadBlockNoResponse,
SDCardError_ReadBlockTimeout,
SDCardError_MultiWriteNoResponse,
SDCardError_MultiWriteError,
};
struct SDCard {
struct spi_periph *spi_p; /**< The SPI peripheral for the connection */
struct spi_transaction spi_t; /**< The SPI transaction used for the writing and reading of registers */
@@ -96,6 +115,7 @@ struct SDCard {
uint8_t response_counter; /**< Response counter used at various locations */
uint32_t timeout_counter; /**< Timeout counter used for initialization checks with ACMD41 */
enum SDCardType card_type; /**< Type of SDCard */
enum SDCardErrorStatus error_status; /**< Contains information on where the error has occured */
SDCardCallback external_callback; /**< Callback to call when external operation finishes */
};