[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_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="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.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.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.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" /> <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->status = SDCard_BeforeDummyClock;
sdcard->card_type = SDCardType_Unknown; 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; sdcard1.status = SDCard_SendingCMD8;
} else if (sdcard1.response_counter >= 9) { } else if (sdcard1.response_counter >= 9) {
sdcard1.status = SDCard_Error; sdcard1.status = SDCard_Error;
sdcard1.error_status = SDCardError_InitializationNoResponse;
} else { } else {
sdcard_spi_request_bytes(&sdcard1, 1); sdcard_spi_request_bytes(&sdcard1, 1);
} }
@@ -198,6 +200,7 @@ void sdcard_spi_spicallback(struct spi_transaction *t)
sdcard1.status = SDCard_ReadingCMD8Parameter; sdcard1.status = SDCard_ReadingCMD8Parameter;
} else if (sdcard1.response_counter >= 9) { } else if (sdcard1.response_counter >= 9) {
sdcard1.status = SDCard_Error; sdcard1.status = SDCard_Error;
sdcard1.error_status = SDCardError_CardInfoNoResponse;
} else { } else {
sdcard_spi_request_bytes(&sdcard1, 1); sdcard_spi_request_bytes(&sdcard1, 1);
} }
@@ -211,6 +214,7 @@ void sdcard_spi_spicallback(struct spi_transaction *t)
sdcard1.timeout_counter = 0; sdcard1.timeout_counter = 0;
} else { } else {
sdcard1.status = SDCard_Error; sdcard1.status = SDCard_Error;
sdcard1.error_status = SDCardError_InvalidCardInfo;
} }
break; break;
@@ -228,12 +232,14 @@ void sdcard_spi_spicallback(struct spi_transaction *t)
sdcard1.status = SDCard_SendingACMD41v2; sdcard1.status = SDCard_SendingACMD41v2;
} else { } else {
sdcard1.status = SDCard_Error; sdcard1.status = SDCard_Error;
sdcard1.error_status = SDCardError_ACMD41Timeout;
} }
} else if (t->input_buf[0] == 0x00) { } else if (t->input_buf[0] == 0x00) {
sdcard_spi_send_cmd(&sdcard1, 58, 0x00000000); sdcard_spi_send_cmd(&sdcard1, 58, 0x00000000);
sdcard1.status = SDCard_SendingCMD58; sdcard1.status = SDCard_SendingCMD58;
} else if (sdcard1.response_counter >= 9) { } else if (sdcard1.response_counter >= 9) {
sdcard1.status = SDCard_Error; sdcard1.status = SDCard_Error;
sdcard1.error_status = SDCardError_ACMD41NoResponse;
} else { } else {
sdcard_spi_request_bytes(&sdcard1, 1); sdcard_spi_request_bytes(&sdcard1, 1);
} }
@@ -250,6 +256,7 @@ void sdcard_spi_spicallback(struct spi_transaction *t)
case SDCard_ReadingCMD58Resp: case SDCard_ReadingCMD58Resp:
if (sdcard1.response_counter >= 9) { if (sdcard1.response_counter >= 9) {
sdcard1.status = SDCard_Error; sdcard1.status = SDCard_Error;
sdcard1.error_status = SDCardError_CMD58NoResponse;
} else if (sdcard1.input_buf[0] == 0x00) { } else if (sdcard1.input_buf[0] == 0x00) {
sdcard_spi_request_bytes(&sdcard1, 4); sdcard_spi_request_bytes(&sdcard1, 4);
sdcard1.status = SDCard_ReadingCMD58Parameter; 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 } else { // bit 31 not set, CCS bit is unvalid
sdcard1.status = SDCard_Error; sdcard1.status = SDCard_Error;
sdcard1.error_status = SDCardError_CCSBitInvalid;
} }
break; break;
@@ -287,6 +295,7 @@ void sdcard_spi_spicallback(struct spi_transaction *t)
sdcard1.status = SDCard_Idle; sdcard1.status = SDCard_Idle;
} else if (sdcard1.response_counter >= 9) { } else if (sdcard1.response_counter >= 9) {
sdcard1.status = SDCard_Error; sdcard1.status = SDCard_Error;
sdcard1.error_status = SDCardError_SetBlockSizeNoResponse;
} else { } else {
sdcard_spi_request_bytes(&sdcard1, 1); sdcard_spi_request_bytes(&sdcard1, 1);
} }
@@ -306,6 +315,7 @@ void sdcard_spi_spicallback(struct spi_transaction *t)
sdcard1.status = SDCard_BeforeSendingDataBlock; sdcard1.status = SDCard_BeforeSendingDataBlock;
} else if (sdcard1.response_counter >= 9) { } else if (sdcard1.response_counter >= 9) {
sdcard1.status = SDCard_Error; sdcard1.status = SDCard_Error;
sdcard1.error_status = SDCardError_WriteBlockNoResponse;
} else { } else {
sdcard_spi_request_bytes(&sdcard1, 1); sdcard_spi_request_bytes(&sdcard1, 1);
} }
@@ -325,6 +335,7 @@ void sdcard_spi_spicallback(struct spi_transaction *t)
sdcard1.status = SDCard_SendingDataBlock; sdcard1.status = SDCard_SendingDataBlock;
} else { } else {
sdcard1.status = SDCard_Error; sdcard1.status = SDCard_Error;
sdcard1.error_status = SDCardError_SpiDriverError;
} }
break; break;
@@ -334,6 +345,7 @@ void sdcard_spi_spicallback(struct spi_transaction *t)
sdcard1.status = SDCard_Busy; sdcard1.status = SDCard_Busy;
} else { } else {
sdcard1.status = SDCard_Error; sdcard1.status = SDCard_Error;
sdcard1.error_status = SDCardError_BlockWriteError;
} }
sdcard1.spi_t.output_buf = sdcard1.output_buf; sdcard1.spi_t.output_buf = sdcard1.output_buf;
break; break;
@@ -359,6 +371,7 @@ void sdcard_spi_spicallback(struct spi_transaction *t)
sdcard1.status = SDCard_WaitingForDataToken; sdcard1.status = SDCard_WaitingForDataToken;
} else if (sdcard1.response_counter >= 9) { } else if (sdcard1.response_counter >= 9) {
sdcard1.status = SDCard_Error; sdcard1.status = SDCard_Error;
sdcard1.error_status = SDCardError_ReadBlockNoResponse;
} else { } else {
sdcard_spi_request_bytes(&sdcard1, 1); sdcard_spi_request_bytes(&sdcard1, 1);
} }
@@ -379,6 +392,7 @@ void sdcard_spi_spicallback(struct spi_transaction *t)
sdcard1.status = SDCard_ReadingDataBlock; sdcard1.status = SDCard_ReadingDataBlock;
} else if (sdcard1.timeout_counter > 498) { } else if (sdcard1.timeout_counter > 498) {
sdcard1.status = SDCard_Error; sdcard1.status = SDCard_Error;
sdcard1.error_status = SDCardError_ReadBlockTimeout;
} }
break; break;
@@ -404,6 +418,7 @@ void sdcard_spi_spicallback(struct spi_transaction *t)
sdcard1.status = SDCard_MultiWriteIdle; sdcard1.status = SDCard_MultiWriteIdle;
} else if (sdcard1.response_counter >= 9) { } else if (sdcard1.response_counter >= 9) {
sdcard1.status = SDCard_Error; sdcard1.status = SDCard_Error;
sdcard1.error_status = SDCardError_MultiWriteNoResponse;
} else { } else {
sdcard_spi_request_bytes(&sdcard1, 1); sdcard_spi_request_bytes(&sdcard1, 1);
} }
@@ -418,6 +433,7 @@ void sdcard_spi_spicallback(struct spi_transaction *t)
} }
} else { } else {
sdcard1.status = SDCard_Error; sdcard1.status = SDCard_Error;
sdcard1.error_status = SDCardError_MultiWriteError;
} }
break; break;
+20
View File
@@ -87,6 +87,25 @@ enum SDCardStatus {
SDCard_MultiWriteStopping, /**< Busy sending the stop token */ 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 SDCard {
struct spi_periph *spi_p; /**< The SPI peripheral for the connection */ 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 */ 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 */ uint8_t response_counter; /**< Response counter used at various locations */
uint32_t timeout_counter; /**< Timeout counter used for initialization checks with ACMD41 */ uint32_t timeout_counter; /**< Timeout counter used for initialization checks with ACMD41 */
enum SDCardType card_type; /**< Type of SDCard */ 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 */ SDCardCallback external_callback; /**< Callback to call when external operation finishes */
}; };