📄 mmcsd.c
字号:
//-----> // else RES_Set(RES_OK);
//----->
//----->
//-----> /////////////////////CMD3///////////////////////////////////
//----->}
//----->
//----->
//----->//-------------------------------------------------------------------------
//----->// NAME : Cmd7
//----->// DESCRIPTION : set mmcsd command 7 with its arguments, SELECT/DESELECT_CARD,
//----->// command toggles a card between the stand-by and transfer states
//----->// or between the programming and disconnect states. In both cases
//----->// the card is selected by its own relative address and gets deselected
//----->// by any other address; address 0 deselects all.
//----->//
//----->// PARAMETERS :
//----->//
//----->//
//----->// RETURN VALUE:
//----->// LIMITATIONS : None
//----->//-------------------------------------------------------------------------
//----->void Cmd7(UWORD16 relative_card_address)
//----->{
//----->
//-----> UWORD8 Counter_time_out;
//-----> /////////////////////////////CMD7/////////////////////////
//----->
//-----> //configure interrupt int_mask_reg RQUE : a bit of int_mask_reg at 1 <=> demask the interrupt,
//-----> //a bit of int_mask_reg at 0 <=> mask the interrupt
//----->
//-----> write_word16_at_address16((DEMASK_ALL_IRQ_IN_MMCSD_ADP_IE_REG & MASK_OF_MMCSD_ADP_IE_REG), MMCSD_ADP_IE_REG_ADDR);
//----->
//-----> Counter_time_out = 0;
//-----> Counter_IRQ_MMCSD = 0;
//-----> Content_of_MMCSDAdp_Stat_Reg = INITIALISATION_CONTENT_OF_MMCSD_ADP_STAT_REG;
//-----> do
//-----> {
//-----> End_of_Cmd_Bit_of_MMCSD_Adp_Stat_Reg = NEGATION_OF_MMCSD_ADP_STAT_REG_END_OF_CMD_BIT_EQUAL_END_OF_CMD;
//-----> Cmd_Timeout_Bit_of_MMCSD_Adp_Stat_Reg = //----->NEGATION_OF_MMCSD_ADP_STAT_REG_CMD_TIMEOUT_NO_RESPONSE_BIT_EQUAL_NO_CMD_TIME_OUT_ERROR;
//-----> Cmd_Crc_Error_Bit_of_MMCSD_Adp_Stat_Reg = NEGATION_OF_MMCSD_ADP_STAT_REG_CMD_CRC_ERROR_BIT_EQUAL_NO_CRC_ERROR;
//-----> Card_Err_Bit_of_MMCSD_Adp_Stat_Reg = NEGATION_OF_MMCSD_ADP_STAT_REG_CARD_ERR_BIT_EQUAL_NO_ERROR;
//-----> Response_R1b_IN_MMCSD_adp_rsp6_reg_of_CMD7 = NEGATION_OF_CARD_STATUS_IS_IN_STAND_BY_STATE;
//----->
//-----> //////////////////////////////////////////////////////
//-----> //CMD7:SELECT/DESELECT_CARD,
//-----> //this command selects or deselects a card with an RCA,
//-----> //arguments :arg_reg_1 <-- nothing,
//-----> //arg_reg_2 <-- [31:16] RCA (Relative Card Address register).
//-----> //RESPONSE:response R1b, between CMD3 and CMD7, the card state must be in stand-by state (stby).
//-----> //response R1b read in the do{}while() stop condition
//-----> //
//-----> // Bits of mmc_adp_st_reg concerned:
//-----> //---------------bit 0 : End_of_Cmd_Bit_of_MMCSD_Adp_Stat_Reg at 1 it's OK----------------
//-----> //---------------bit 7 : Cmd_Timeout_Bit_of_MMCSD_Adp_Stat_Reg at 0 it's OK----------------
//-----> //---------------bit 8 : Cmd_Crc_Error_Bit_of_MMCSD_Adp_Stat_Reg at 0 it's OK---------------
//-----> //
//-----> //in the RESPONSE R1b of CMD7, read response R1b bits 39<->8 to detect
//-----> //CARD_STATUS_IS_IN_STAND_BY_STATE
//-----> RES_Set(0xCD07);//detection of CMD
//-----> MMC_SetMmcCommand(NO_ARGUMENT_BITS_IN_MMCSD_ARG1_REG, MMCSD_ADP_ARG1_REG_ADDR,
//-----> relative_card_address, MMCSD_ADP_ARG2_REG_ADDR,
//-----> CMD7, MMCSD_ADP_CMD_REG_ADDR
//-----> );
//-----> //CMD7
//-----> //////////////////////////////////////////////////////
//----->
//-----> Test_IRQ();
//----->
//-----> }
//-----> while(
//-----> (
//-----> (End_of_Cmd_Bit_of_MMCSD_Adp_Stat_Reg != MMCSD_ADP_STAT_REG_END_OF_CMD_BIT_EQUAL_END_OF_CMD)
//-----> ||
//-----> (Cmd_Timeout_Bit_of_MMCSD_Adp_Stat_Reg != MMCSD_ADP_STAT_REG_CMD_TIMEOUT_NO_RESPONSE_BIT_EQUAL_NO_CMD_TIME_OUT_ERROR)
//-----> ||
//-----> (Cmd_Crc_Error_Bit_of_MMCSD_Adp_Stat_Reg != MMCSD_ADP_STAT_REG_CMD_CRC_ERROR_BIT_EQUAL_NO_CRC_ERROR)
//-----> ||
//-----> (Card_Err_Bit_of_MMCSD_Adp_Stat_Reg != MMCSD_ADP_STAT_REG_CARD_ERR_BIT_EQUAL_NO_ERROR)
//-----> ||
//-----> (Response_R1b_IN_MMCSD_adp_rsp6_reg_of_CMD7 != CARD_STATUS_IS_IN_STAND_BY_STATE)
//-----> )
//-----> &&
//-----> (Counter_time_out++ < TIME_OUT)
//-----> );
//----->
//-----> // if(End_of_Cmd_Bit_of_MMCSD_Adp_Stat_Reg != MMCSD_ADP_STAT_REG_END_OF_CMD_BIT_EQUAL_END_OF_CMD)
//-----> // RES_Set(RES_BAD);
//-----> // else RES_Set(RES_OK);
//----->
//-----> // if(Cmd_Timeout_Bit_of_MMCSD_Adp_Stat_Reg != //----->MMCSD_ADP_STAT_REG_CMD_TIMEOUT_NO_RESPONSE_BIT_EQUAL_NO_CMD_TIME_OUT_ERROR)
//-----> // RES_Set(RES_BAD);
//-----> // else RES_Set(RES_OK);
//----->
//-----> // if(Cmd_Crc_Error_Bit_of_MMCSD_Adp_Stat_Reg != MMCSD_ADP_STAT_REG_CMD_CRC_ERROR_BIT_EQUAL_NO_CRC_ERROR)
//-----> // RES_Set(RES_BAD);
//-----> // else RES_Set(RES_OK);
//----->
//-----> // if(Card_Err_Bit_of_MMCSD_Adp_Stat_Reg != MMCSD_ADP_STAT_REG_CARD_ERR_BIT_EQUAL_NO_ERROR)
//-----> // RES_Set(RES_BAD);
//-----> // else RES_Set(RES_OK);
//----->
//-----> // if(Response_R1b_IN_MMCSD_adp_rsp6_reg_of_CMD7 != CARD_STATUS_IS_IN_STAND_BY_STATE)
//-----> // RES_Set(RES_BAD);
//-----> // else RES_Set(RES_OK);
//----->
//-----> /////////////////////////////CMD7/////////////////////////
//----->
//----->
//----->}
//----->
//----->
//----->
//----->
//----->
//----->//-------------------------------------------------------------------------
//----->// NAME : Cmd16
//----->// DESCRIPTION : set mmcsd command 16 with its arguments, SET_BLOCKLEN,
//----->// sets the block length (in bytes) for all following block
//----->// commands(read and write). Default block length is specified
//----->// in the CSD. supported only if partial RD/WR operation are allowed
//----->// in CSD.
//----->//
//----->// PARAMETERS :
//----->//
//----->//
//----->// RETURN VALUE:
//----->// LIMITATIONS : None
//----->//-------------------------------------------------------------------------
//----->void Cmd16(UWORD16 least_significants_bits_data_block_length_to_write_read_in_mmcsd_card,
//-----> UWORD16 most_significants_bits_data_block_length_to_write_read_in_mmcsd_card)
//----->{
//----->
//-----> UWORD8 Counter_time_out;
//----->
//-----> /////////////////////////////CMD16/////////////////////////
//----->
//-----> //configure interrupt int_mask_reg RQUE : a bit of int_mask_reg at 1 <=> demask the interrupt,
//-----> //a bit of int_mask_reg at 0 <=> mask the interrupt
//----->
//-----> write_word16_at_address16((DEMASK_ALL_IRQ_IN_MMCSD_ADP_IE_REG & MASK_OF_MMCSD_ADP_IE_REG), MMCSD_ADP_IE_REG_ADDR);
//----->
//-----> Counter_time_out = 0;
//-----> Counter_IRQ_MMCSD = 0;
//-----> Content_of_MMCSDAdp_Stat_Reg = INITIALISATION_CONTENT_OF_MMCSD_ADP_STAT_REG;
//-----> do
//-----> {
//-----> End_of_Cmd_Bit_of_MMCSD_Adp_Stat_Reg = NEGATION_OF_MMCSD_ADP_STAT_REG_END_OF_CMD_BIT_EQUAL_END_OF_CMD;
//-----> Cmd_Timeout_Bit_of_MMCSD_Adp_Stat_Reg = //----->NEGATION_OF_MMCSD_ADP_STAT_REG_CMD_TIMEOUT_NO_RESPONSE_BIT_EQUAL_NO_CMD_TIME_OUT_ERROR;
//-----> Cmd_Crc_Error_Bit_of_MMCSD_Adp_Stat_Reg = NEGATION_OF_MMCSD_ADP_STAT_REG_CMD_CRC_ERROR_BIT_EQUAL_NO_CRC_ERROR;
//-----> Card_Err_Bit_of_MMCSD_Adp_Stat_Reg = NEGATION_OF_MMCSD_ADP_STAT_REG_CARD_ERR_BIT_EQUAL_NO_ERROR;
//-----> Response_R1_IN_MMCSD_adp_rsp6_reg_of_cmd16 = NEGATION_OF_CARD_STATUS_IS_IN_TRANSFER_STATE;
//----->
//-----> ///////////////////////////////////////////////////////
//-----> //CMD16:SET_BLOCKLEN,
//-----> //this command sets the block length (in bytes) for
//-----> //all following block commands (read and write).
//-----> //Arguments: on procede a une ecriture par bloc,mettre la taille du bloc qui correpond
//-----> //a la longueur totale des mots ecrits precedement dans le buffer data register.
//-----> //Caution: Modificate the value of :
//-----> //#define LEAST_SIGNIFICANTS_BITS_DATA_BLOCK_LENGTH_TO_WRITE_READ_IN_MMC_CARD 0x000A
//-----> //#define MOST_SIGNIFICANTS_BITS_DATA_BLOCK_LENGTH_TO_WRITE_READ_IN_MMC_CARD 0x0000
//-----> //in case of change of the total length of words written previously in the buf_data_reg
//-----> //
//-----> // Bits of mmc_adp_st_reg concerned:
//-----> //---------------bit 0 : End_of_Cmd_Bit_of_MMCSD_Adp_Stat_Reg at 1 it's OK----------------
//-----> //---------------bit 7 : Cmd_Timeout_Bit_of_MMCSD_Adp_Stat_Reg at 0 it's OK----------------
//-----> //---------------bit 8 : Cmd_Crc_Error_Bit_of_MMCSD_Adp_Stat_Reg at 0 it's OK---------------
//-----> //---------------bit14 : Card_Err_Bit_of_MMCSD_Adp_Stat_Reg at 0 it's OK----------
//-----> //
//-----> //response R1 of CMD16 : read response R1 bits 39<->8 to detect
//-----> //CARD_STATUS_IS_IN_TRANSFER_STATE
//-----> RES_Set(0xCD16);//detection of CMD
//-----> MMC_SetMmcCommand(least_significants_bits_data_block_length_to_write_read_in_mmcsd_card, MMCSD_ADP_ARG1_REG_ADDR,
//-----> most_significants_bits_data_block_length_to_write_read_in_mmcsd_card, MMCSD_ADP_ARG2_REG_ADDR,
//-----> CMD16, MMCSD_ADP_CMD_REG_ADDR);
//----->
//-----> write_word16_at_address16(IN_MMCSD_ADP_BLEN_REG_BLOCK_LENGTH_EQUAL_10, MMCSD_ADP_BLEN_REG_ADDR);
//-----> //CMD16
//-----> /////////////////////////////////////////////////////
//----->
//-----> Test_IRQ();
//----->
//-----> }
//-----> while(
//-----> (
//-----> (End_of_Cmd_Bit_of_MMCSD_Adp_Stat_Reg != MMCSD_ADP_STAT_REG_END_OF_CMD_BIT_EQUAL_END_OF_CMD)
//-----> ||
//-----> (Cmd_Timeout_Bit_of_MMCSD_Adp_Stat_Reg != MMCSD_ADP_STAT_REG_CMD_TIMEOUT_NO_RESPONSE_BIT_EQUAL_NO_CMD_TIME_OUT_ERROR)
//-----> ||
//-----> (Cmd_Crc_Error_Bit_of_MMCSD_Adp_Stat_Reg != MMCSD_ADP_STAT_REG_CMD_CRC_ERROR_BIT_EQUAL_NO_CRC_ERROR)
//-----> ||
//-----> (Card_Err_Bit_of_MMCSD_Adp_Stat_Reg != MMCSD_ADP_STAT_REG_CARD_ERR_BIT_EQUAL_NO_ERROR)
//-----> ||
//-----> (Response_R1_IN_MMCSD_adp_rsp6_reg_of_cmd16 != CARD_STATUS_IS_IN_TRANSFER_STATE)
//-----> )
//-----> &&
//-----> (Counter_time_out++ < TIME_OUT)
//-----> );
//----->
//-----> // if(End_of_Cmd_Bit_of_MMCSD_Adp_Stat_Reg != MMCSD_ADP_STAT_REG_END_OF_CMD_BIT_EQUAL_END_OF_CMD)
//-----> // RES_Set(RES_BAD);
//-----> // else RES_Set(RES_OK);
//----->
//-----> // if(Cmd_Timeout_Bit_of_MMCSD_Adp_Stat_Reg != //----->MMCSD_ADP_STAT_REG_CMD_TIMEOUT_NO_RESPONSE_BIT_EQUAL_NO_CMD_TIME_OUT_ERROR)
//-----> // RES_Set(RES_BAD);
//-----> // else RES_Set(RES_OK);
//----->
//-----> // if(Cmd_Crc_Error_Bit_of_MMCSD_Adp_Stat_Reg != MMCSD_ADP_STAT_REG_CMD_CRC_ERROR_BIT_EQUAL_NO_CRC_ERROR)
//-----> // RES_Set(RES_BAD);
//-----> // else RES_Set(RES_OK);
//----->
//-----> // if(Card_Err_Bit_of_MMCSD_Adp_Stat_Reg != MMCSD_ADP_STAT_REG_CARD_ERR_BIT_EQUAL_NO_ERROR)
//-----> // RES_Set(RES_BAD);
//-----> // else RES_Set(RES_OK);
//----->
//-----> // if(Response_R1_IN_MMCSD_adp_rsp6_reg_of_cmd16 != CARD_STATUS_IS_IN_TRANSFER_STATE)
//-----> // RES_Set(RES_BAD);
//-----> // else RES_Set(RES_OK);
//----->
//-----> /////////////////////////////CMD16/////////////////////////
//----->
//----->}
//----->
//----->
//----->//-------------------------------------------------------------------------
//----->// NAME : Cmd24
//----->// DESCRIPTION : set mmcsd command 24 with its arguments, WRITE_BLOCK,
//----->// writes a block of the size selected by the SET_BLOCKLEN
//----->// command.
//----->//
//----->// PARAMETERS :
//----->//
//----->//
//----->// RETURN VALUE:
//----->// LIMITATIONS : None
//----->//-------------------------------------------------------------------------
//----->void Cmd24(void)
//----->{
//----->
//-----> UWORD8 Counter_time_out;
//-----> UWORD8 loop_counter_wait_after_CMD24;
//----->
//-----> /////////////////////////////CMD24/////////////////////////
//----->
//-----> //configure interrupt int_mask_reg RQUE : a bit of int_mask_reg at 1 <=> demask the interrupt,
//-----> //a bit of int_mask_reg at 0 <=> mask the interrupt
//----->
//-----> write_word16_at_address16((DEMASK_ALL_IRQ_IN_MMCSD_ADP_IE_REG & MASK_OF_MMCSD_ADP_IE_REG), MMCSD_ADP_IE_REG_ADDR);
//----->
//-----> Counter_time_out = 0;
//-----> Counter_IRQ_MMCSD = 0;
//-----> Content_of_MMCSDAdp_Stat_Reg = INITIALISATION_CONTENT_OF_MMCSD_ADP_STAT_REG;
//-----> do
//-----> {
//-----> End_of_Cmd_Bit_of_MMCSD_Adp_Stat_Reg = NEGATION_OF_MMCSD_ADP_STAT_REG_END_OF_CMD_BIT_EQUAL_END_OF_CMD;
//-----> Card_Busy_State_Bit_of_MMCSD_Adp_Stat_Reg = NEGATION_OF_MMCSD_ADP_STAT_REG_CARD_BUSY_BIT_EQUAL_DATA_LINE_BUSY;
//-----> Block_Received_Sent_Bit_of_MMCSD_Adp_Stat_Reg = NEGATION_OF_MMCSD_ADP_STAT_REG_BLOCK_RS_BIT_EQUAL_BLOCK_SENT_RECEIVED;
//-----> EOF_Busy_State_Bit_of_MMCSD_Adp_Stat_Reg = NEGATION_OF_MMCSD_ADP_STAT_REG_EOF_BUSY_BIT_EQUAL_DATA_LINE_RELEASED;
//-----> Data_Crc_Error_Bit_of_MMCSD_Adp_Stat_Reg = NEGATION_OF_MMCSD_ADP_STAT_REG_DATA_CRC_ERROR_BIT_EQUAL_NO_CRC_ERROR;
//-----> Cmd_Timeout_Bit_of_MMCSD_Adp_Stat_Reg = //----->NEGATION_OF_MMCSD_ADP_STAT_REG_CMD_TIMEOUT_NO_RESPONSE_BIT_EQUAL_NO_CMD_TIME_OUT_ERROR;
//-----> Cmd_Crc_Error_Bit_of_MMCSD_Adp_Stat_Reg = NEGATION_OF_MMCSD_ADP_STAT_REG_CMD_CRC_ERROR_BIT_EQUAL_NO_CRC_ERROR;
//-----> // Buffer_Almost_Empty_Bit_of_MMCSD_Adp_Stat_Reg = NEGATION_OF_MMCSD_ADP_STAT_REG_A_EMPTY_BIT_EQUAL_BUFFER_ALMOST_EMPTY;
//-----> Card_Err_Bit_of_MMCSD_Adp_Stat_Reg = NEGATION_OF_MMCSD_ADP_STAT_REG_CARD_ERR_BIT_EQUAL_NO_ERROR;
//----->
//----->
//-----> ////////////////////////////////////////////////////
//-----> //CMD24:WRITE_BLOCK, arguments:on procede a une ecriture par bloc,
//-----> //mettre l adresse de base physique (0x00000000) de la MMC card.
//-----> //mmc_arg_reg_1 <-- 0x0000, mmc_arg_reg_2 <-- 0x0000
//-----> //
//-----> // Bits of mmc_adp_st_reg concerned:
//-----> //---------------bit 0 : End_of_Cmd_Bit_of_MMCSD_Adp_Stat_Reg at 1 it's OK---------------------------------
//-----> //---------------bit 2 : Card_Busy_State_Bit_of_MMCSD_Adp_Stat_Reg at 1 it's OK----------------
//-----> //---------------bit 3 : Block_Received_Sent_Bit_of_MMCSD_Adp_Stat_Reg at 1 it's OK------------------------
//-----> //---------------bit 4 : EOF_Busy_State_Bit_of_MMCSD_Adp_Stat_Reg at 1 it's OK------------------
//-----> //---------------bit 6 : Data_Crc_Error_Bit_of_MMCSD_Adp_Stat_Reg at 0 it's OK------------------------------
//-----> //---------------bit 7 : Cmd_Timeout_Bit_of_MMCSD_Adp_Stat_Reg at 0 it's OK---------------------------------
//-----> //---------------bit 8 : Cmd_Crc_Error_Bit_of_MMCSD_Adp_Stat_Reg at 0 it's OK--------------------------------
//-----> //---------------bit 11 :
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -