📄 mmcsd.c
字号:
//-----> UWORD16 value = *(UWORD16*)(MMCSD_ADP_RSP6_REG_ADDR);
//----->
//-----> return value;
//----->}
//----->
//----->//
//----->//-------------------------------------------------------------------------
//----->// read_mmcsd_adp_rsp7_reg
//----->// DESCRIPTION : read MMCSD ADAPTER response register7
//----->//
//----->//-------------------------------------------------------------------------
//----->//
//----->UWORD16 read_mmcsd_adp_rsp7_reg(void)
//----->{
//----->//----->
//-----> UWORD16 value = *(UWORD16*)(MMCSD_ADP_RSP7_REG_ADDR);
//----->
//-----> return value;
//----->}
//----->
////////////////////////////////////////////////////////////////////////////////////////
//------------------------------------------------------------------------
// MMCSD_ReadWord16AtAddress16
//
// DESCRPTION : read a 16 bits word length
//------------------------------------------------------------------------
//
UWORD16 MMCSD_ReadWord16AtAddress16(UWORD16 address)
{
//UWORD16 value = *(UWORD16*)(address);
UWORD16 value = *(REGISTER_UWORD16*)(address);
return value;
}
//
//-------------------------------------------------------------------------
// NAME : MMC_SetMmcCommand
// DESCRIPTION : set mmc command with its arguments
//
//-------------------------------------------------------------------------
//
void MMCSD_SetMmcsdCommand(UWORD16 value_in_mmcsd_arg1_reg,UWORD16 mmcsd_arg1_reg_address,
UWORD16 value_in_mmcsd_arg2_reg,UWORD16 mmcsd_arg2_reg_address,
UWORD16 CMD_number, UWORD16 mmcsd_adp_cmd_reg_addr)
{
//////////////////////////////////////////////////////////////////
//
// RQE :
// TO WRITE IN THE MMCSD_ADP_CMD_REG
// BIT(0) <-> BIT(5) NAME : COMMAND NUMBER, THE NUMBER OF THE COMMAND.
//
// BIT(6) NAME : OPEN DRAIN MODE, AT 1 FOR COMMANDS 0, 1, 2, 3, 15 & 40
// BIT(7) NAME : SEND INITIALIZATION STREAM, AT 1 FOR COMMANDS 0, 1
// BIT(8) <-> BIT(10) NAME : COMMAND RESPONSE
// BIT(11) NAME : COMMAND WITH BUSY RESPONSE
// BIT(12) <-> BIT(13) NAME : COMMAND TYPE
// BIT(14) NAME : STREAM COMMAND, ONLY FOR MMC CARD COMMANDS 11, 20
// BIT(15) NAME : DATA DIRECTION
//
//////////////////////////////////////////////////////////////////
write_word16_at_address16( value_in_mmcsd_arg1_reg, mmcsd_arg1_reg_address);
write_word16_at_address16( value_in_mmcsd_arg2_reg, mmcsd_arg2_reg_address);
write_word16_at_address16( CMD_number, mmcsd_adp_cmd_reg_addr);
}
///////////////////////////REMPLACER PAR LES NOUVELLES FONCTIONS Cmdxx ou ACmdxx
///////// CE QUI SUIT
///////
/////
///
//----->//-------------------------------------------------------------------------
//----->// NAME : Cmd0
//----->// DESCRIPTION : set mmcsd command 0 with its arguments, GO_IDLE_STATE,
//----->// resets all cards to idle state.
//----->// PARAMETERS :
//----->//
//----->//
//----->// RETURN VALUE:
//----->// LIMITATIONS : None
//----->//-------------------------------------------------------------------------
//----->void Cmd0(void)
//----->{
//----->
//-----> UWORD8 Counter_time_out;
//-----> //////////////////////CMD0///////////////////////////////
//----->
//-----> //configure interrupt MMCSD_ADP_IE_REG RQUE :
//-----> //a bit of MMCSD_ADP_IE_REG at 1 <=> demask the interrupt,
//-----> //a bit of MMCSD_ADP_IE_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;
//----->
//-----> //////////////////////////////////////////////////////
//-----> //CMD0, this command resets all cards to idle state : GO_IDLE_STATE.
//-----> //Bits of mmcsd_adp_stat_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' OK----------------
//-----> RES_Set(0xCD00);//detection of CMD
//-----> MMC_SetMmcCommand(NO_ARGUMENT_BITS_IN_MMCSD_ARG1_REG, MMCSD_ADP_ARG1_REG_ADDR,
//-----> NO_ARGUMENT_BITS_IN_MMCSD_ARG2_REG, MMCSD_ADP_ARG2_REG_ADDR,
//-----> CMD0, MMCSD_ADP_CMD_REG_ADDR);
//-----> //CMD0
//-----> ///////////////////////////////////////////////
//----->
//-----> 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)
//-----> )
//-----> &&
//-----> (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);
//----->
//-----> ////////////////CMD0/////////////////////////////
//----->}
//----->
//----->
//----->//-------------------------------------------------------------------------
//----->// NAME : Cmd1
//----->// DESCRIPTION : set mmcsd command 1 with its arguments, SEND_OP_COND,
//----->// asks all cards in idle state to send their operation
//----->// conditions register content in the response on the CMD
//----->// line.
//----->//
//----->// PARAMETERS :
//----->//
//----->//
//----->// RETURN VALUE:
//----->// LIMITATIONS : None
//----->//-------------------------------------------------------------------------
//----->UWORD16 Cmd1(void)
//----->{
//-----> UWORD16 result_value;
//----->
//-----> UWORD8 Counter_time_out;
//----->
//-----> result_value = MMCSD_ADP_STAT_REG_CMD_TIMEOUT_NO_RESPONSE_BIT_EQUAL_NO_CMD_TIME_OUT_ERROR;
//----->
//-----> ////////////////CMD1/////////////////////////////
//----->
//-----> //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 = 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;
//-----> Ocr_Busy_Bit_of_MMCSD_Adp_Stat_Reg = NEGATION_OF_MMCSD_ADP_STAT_REG_OCR_BUSY_AFTER_CMD1_OR_ACMD41_BIT_EQUAL_NO_OCR_BUSY;
//-----> ( Bit_39_Response_R3_ie_Bit15_MMCSD_adp_rsp7_reg_after_CMD1_OR_ACMD41
//-----> =
//-----> NEGATION_OF_BIT39_RESPONSE_R3_ie_BIT15_MMCSD_ADP_RSP7_REG_AFTER_CMD1_OR_ACMD41_EQUAL1
//-----> );
//----->
//-----> //////////////////////////////////////////////
//-----> //CMD1:SEND_OP_COND, allowing to fix alimentation voltage range of MMC card.register concerned OCR register.
//-----> //puts in arg_reg_1 and arg_reg_2 the alimentation voltage range.if no voltage range imposed,
//-----> //set all the bits available (i-e bits no reserved) at 1.
//-----> //Currently with MMC model, CMD1 must be set 2 times.
//-----> //At the first time Ocr_Busy_Bit_of_MMCSD_Adp_Stat_Reg is set at 1 and
//-----> //at the second time this Ocr_Busy_Bit_of_MMCSD_Adp_Stat_Reg is set at 0,
//-----> //it is the reason why we wait the Ocr_Busy_Bit_of_MMCSD_Adp_Stat_Reg to be set at 0
//-----> //and the Testing Adp_St_Reg is in do{...}while(...) loop in order to reset its content.
//-----> //
//-----> //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---------------
//-----> //---------------bit 12 : Ocr_Busy_Bit_of_MMCSD_Adp_Stat_Reg at 0 it's OK------------------
//-----> //
//-----> //Bits of OCR register concerned:
//-----> //---------------bit 31 : Bit_39_Response_R3_ie_Bit15_MMCSD_adp_rsp7_reg_after_CMD1_OR_ACMD41 at 1 it's OK-----------------
//-----> RES_Set(0xCD01);//detection of CMD
//-----> MMC_SetMmcCommand(MMC_OCR_REG_VOLTAGE_RANGE_LEAST_SIGNIFICANTS_BITS, MMCSD_ADP_ARG1_REG_ADDR,
//-----> MMC_OCR_REG_VOLTAGE_RANGE_MOST_SIGNIFICANTS_BITS, MMCSD_ADP_ARG2_REG_ADDR,
//-----> CMD1, MMCSD_ADP_CMD_REG_ADDR);
//-----> //CMD1
//-----> //////////////////////////////////////////////
//----->
//-----> Test_IRQ();
//----->
//-----> if(
//-----> 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
//-----> )
//-----> { result_value = NEGATION_OF_MMCSD_ADP_STAT_REG_CMD_TIMEOUT_NO_RESPONSE_BIT_EQUAL_NO_CMD_TIME_OUT_ERROR;
//-----> break;
//-----> }
//----->
//-----> }
//-----> 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)
//-----> ||
//-----> (Ocr_Busy_Bit_of_MMCSD_Adp_Stat_Reg != MMCSD_ADP_STAT_REG_OCR_BUSY_AFTER_CMD1_OR_ACMD41_BIT_EQUAL_NO_OCR_BUSY)
//-----> ||
//-----> (
//-----> Bit_39_Response_R3_ie_Bit15_MMCSD_adp_rsp7_reg_after_CMD1_OR_ACMD41
//-----> !=
//-----> BIT39_RESPONSE_R3_ie_BIT15_MMCSD_ADP_RSP7_REG_AFTER_CMD1_OR_ACMD41_EQUAL1
//-----> )
//-----> //Bit_39_Response_R3_ie_Bit15_MMCSD_adp_rsp7_reg_after_CMD1_OR_ACMD41 = 0 <=> card has not finished the power up //----->routine
//-----> )
//-----> &&
//-----> (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(Ocr_Busy_Bit_of_MMCSD_Adp_Stat_Reg != MMCSD_ADP_STAT_REG_OCR_BUSY_AFTER_CMD1_OR_ACMD41_BIT_EQUAL_NO_OCR_BUSY)
//-----> // RES_Set(RES_BAD);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -