implemented clock switch

This commit is contained in:
Mario Hüttel 2016-09-27 17:34:06 +02:00
parent 1004efa300
commit 9bce46516a

View File

@ -28,7 +28,7 @@ typedef enum {ACMD41_RESP_INIT, ACMD41_RESP_ERR, ACMD41_RESP_SDSC, ACMD41_RESP_S
typedef enum {CMD8_RESP_TIMEOUT, CMD8_RESP_ACK, CMD8_RESP_ERR} CMD8_RESP_t; typedef enum {CMD8_RESP_TIMEOUT, CMD8_RESP_ACK, CMD8_RESP_ERR} CMD8_RESP_t;
typedef uint8_t CID_t; typedef uint8_t CID_t;
void SDIO_InitModule(); void initModuleHw();
int SDIO_sendCmd(uint8_t CMD, uint32_t arg, uint8_t expectedAns); int SDIO_sendCmd(uint8_t CMD, uint32_t arg, uint8_t expectedAns);
int SDIO_getResp(uint8_t expectedCMD, uint8_t typeOfAns, uint32_t* responseBuffer); int SDIO_getResp(uint8_t expectedCMD, uint8_t typeOfAns, uint32_t* responseBuffer);
@ -45,7 +45,7 @@ CMD8_RESP_t SDIO_send_CMD8();
void initDetectandProtectionPins(); void initDetectandProtectionPins();
int checkNotInserted(); // Returns 0 if inserted! int checkNotInserted(); // Returns 0 if inserted!
int checkWriteProtection(); // returns 0 if write protected int checkWriteProtection(); // returns 0 if write protected
void switchPrescaler(uint8_t clkdiv);
//BYTE rxtxbuffer[1<<BLOCKSIZE]; //Data RX and TX Buffer not needed anymore. thanks to DMA //BYTE rxtxbuffer[1<<BLOCKSIZE]; //Data RX and TX Buffer not needed anymore. thanks to DMA
SDInfo_t cardInfo; // = {.type = CARD_NONE}; SDInfo_t cardInfo; // = {.type = CARD_NONE};
@ -72,7 +72,7 @@ DSTATUS SDIO_initialize(){
cardInfo.rca = 0; cardInfo.rca = 0;
cardInfo.type = CARD_NONE; cardInfo.type = CARD_NONE;
SDIO_InitModule(); initModuleHw();
initDetectandProtectionPins(); initDetectandProtectionPins();
@ -126,6 +126,10 @@ DSTATUS SDIO_initialize(){
//TODO: Set 4 bit mode //TODO: Set 4 bit mode
//TODO: //TODO:
switchPrescaler(WORKCLK);
if (checkWriteProtection()) { if (checkWriteProtection()) {
return STA_PROTECT; return STA_PROTECT;
} else } else
@ -168,7 +172,7 @@ DWORD __attribute__((weak)) get_fattime(){
void SDIO_InitModule(){ void initModuleHw(){
//Init Clocks //Init Clocks
RCC->AHB1ENR |= PORTCLKMASK; RCC->AHB1ENR |= PORTCLKMASK;
RCC->APB2ENR |= RCC_APB2ENR_SDIOEN; RCC->APB2ENR |= RCC_APB2ENR_SDIOEN;
@ -209,6 +213,15 @@ void SDIO_InitModule(){
} }
void switchPrescaler(uint8_t clkdiv) {
SDIO->POWER = 0;
__DSB();
SDIO->CLKCR &= ~SDIO_CLKCR_CLKDIV; // Clear prescaler
SDIO->CLKCR |= (SDIO_CLKCR_CLKDIV & clkdiv); // Set bits
__DSB();
SDIO->POWER = SDIO_POWER_PWRCTRL_0 | SDIO_POWER_PWRCTRL_1;
}
//Send Command //Send Command
//Clear respone Flags //Clear respone Flags