日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

使用STM32F103ZET霸道主板实现SD卡的读写(非文件系统)

發布時間:2025/3/14 windows 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用STM32F103ZET霸道主板实现SD卡的读写(非文件系统) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

了解STM32F103ZET是高容量多管腳的芯片

了解SD讀寫線路圖

了解SD的基地址

閱讀STM32F10xx英文參考 SDIO那章,我們編寫代碼邊看文檔解析

建工程,打開包含所有包括外設庫函數的樣本工程,然后留下如下的外設

  • 官方給的E:\2018-9-3\stm32-奮斗者\STM32 官方庫3.5版本\stm32f10x_stdperiph_lib35\STM32F10x_StdPeriph_Lib_V3.5.0\Utilities\STM32_EVAL\Common下的文件只是用于他們的測試版,因此需要修改stm32_eval_sdio_sd.h中的include,由原來的#include "stm32_eval.h"改為#include "stm32f10x.h"

在stm32_eval_sdio_sd.c(我改名為bsp_sdio_sdcard.c)添加新的功能函數

  • 宏定義:sd外設地址(stm32_eval_sdio_sd.h)
/** @defgroup STM32_EVAL_SDIO_SD_Exported_Constants* @{*/ /*宏定義*/ #define SDIO_FIFO_ADDRESS ((uint32_t)0x40018080) //SDIO_FIOF地址=SDIO地址+0x80至 sdio地址+0xfc /** * @brief SDIO Intialization Frequency (400KHz max)*/ #define SDIO_INIT_CLK_DIV ((uint8_t)0xB2) /** * @brief SDIO Data Transfer Frequency (25MHz max) */ /*!< SDIOCLK = HCLK, SDIO_CK = HCLK/(2 + SDIO_TRANSFER_CLK_DIV) */ #define SDIO_TRANSFER_CLK_DIV ((uint8_t)0x01)
  • GPIO 初始化
static void GPIO_Configuration(void) {GPIO_InitTypeDef GPIO_InitStructure;//使能gpio時鐘,判斷APB還是AHB,看System architecture圖(PDF搜)RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOC,ENABLE);//配置pc8,pc9,pc10,pc11,pc12為D0,D0,D2,D3,D4,CLK,看電路線路圖GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 |GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode= GPIO_Mode_AF_PP;GPIO_Init(GPIOC,&GPIO_InitStructure)//配置PD2 CMD引腳GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;GPIO_Init(GPIOD,&GPIO_InitStructure);//使能SDIO AHB時鐘RCC_AHBPeriphClockCmd(RCC_AHBPeriph_SDIO,ENABLE);//使能DMARCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2,ENABLE); }
  • DMA 配置(為啥選擇DMA2的channel4,DMA2的選擇是看System architecture,channel4看DMA2 request mapping)
/** 配置好dma2,一發現有中斷,就自動傳輸 Rx **/ void SD_DMA_RxConfig(uint32_t *BufferDST, uint32_t BufferSize) {DMA_InitTypeDef DMA_InitStructure;//清除標志位DMA_ClearFlag(DMA2_FLAG_TC4 | DMA2_FLAG_TE4 |DMA2_FLAG_HT4 | DMA2_FLAG_GL4);//禁止DMADMA_Cmd(DMA2_Channel4,DISABLE);//傳輸配置//外設地址,fifoDMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)SDIO_FIFO_ADDRESS;//目標地址DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)BufferDST;//傳輸方向DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//把字轉為字節DMA_InitStructure.DMA_BufferSize = BufferSize / 4;//存儲地址自增DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//不循環 When circular mode is activated, the number of data to be transferred is automatically reloaded with the initial value programmed during the channel configuration phase, and the DMA requests continue to be served.DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;//外設數據大小為字, 32 位DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;//存儲數據大小為字, 32 位DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;//通道優先級高DMA_InitStructure.DMA_Priority = DMA_Priority_High;//外設地址不自增DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//非 存儲器至存儲器模式 The DMA channels can also work without being triggered by a request from a peripheral. This mode is called Memory to Memory mode.DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA4_Channel4,&DMA_InitStructure); /*!< 使能 DMA 通道 */DMA_Cmd(DMA2_Channel4, ENABLE); } /** 配置好dma2,一發現有中斷,就自動傳輸 Tx **/ void SD_DMA_TxConfig(uint32_t *BufferSRC, uint32_t BufferSize) {DMA_InitTypeDef DMA_InitStructure;DMA_ClearFlag(DMA2_FLAG_TC4 | DMA2_FLAG_TE4 | DMA2_FLAG_HT4 | DMA2_FLAG_GL4);/*!< DMA2 Channel4 disable */DMA_Cmd(DMA2_Channel4, DISABLE);/*!< DMA2 Channel4 Config */DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)SDIO_FIFO_ADDRESS;DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)BufferSRC;DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;//外設為寫入目標DMA_InitStructure.DMA_BufferSize = BufferSize / 4;DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外設地址不自增DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;DMA_InitStructure.DMA_Priority = DMA_Priority_High;DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;DMA_Init(DMA2_Channel4, &DMA_InitStructure);/*!< DMA2 Channel4 enable */DMA_Cmd(DMA2_Channel4, ENABLE); }
  • 打開stm32_eval_sdio_sd.h文件中發現很多枚舉定義,等
    - 枚舉:SD_Error、 SDTransferState 和 SDCardState
    - 結構體定義: SD_CSD、 SD_CID、 SD_CardStatus 以及 SD_CardInfo
    - 宏定義:命令號定義、 SDIO 傳輸方式、 SD 卡插入狀態以及 SD 卡類型定義。

接下來我們就開始根據 SD 卡識別過程和數據傳輸過程理解 SD 卡驅動函數代碼。這部分代碼內容也是非常龐大,不可能全部在文檔中全部列出,對于部分函數只介紹其功能。

  • SD卡初始化
  • NVIC初始化
static void NVIC_Configuration(void) {NVIC_InitTypeDef NVIC_InitStructure;/* Configure the NVIC Preemption Priority Bits */NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//SDIO的中斷請求 配置好NVIC的中斷控制器和中斷來,判斷誰的優先級高(假設啟動多個中斷)。先配NVIC,在配外部中斷器來屏蔽--硬件或軟件(事件或中斷)NVIC_InitStructure.NVIC_IRQChannel = SDIO_IRQn;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_Init(&NVIC_InitStructure);//SDIO_IRQ不需要外部中斷/事件或軟件中斷/事件,因此不需要初始化EXIT控制器的全部寄存器,比如中斷屏蔽寄存器、事件屏蔽寄存器,看圖External interrupt/event controller block diagram }
  • 初始化SD卡
/**描述 :初始化SD卡,使卡處于就緒狀態(準備傳輸數據)*/ - 此函數原stm32_eval_sdio_sd.c有,不需添加,需要修改 SD_Error SD_Init(void) {/*重置SD_Error狀態*/SD_Error errorstatus = SD_OK;NVIC_Configuration();/* SDIO 外設底層引腳初始化 */GPIO_Configuration();/*對SDIO的所有寄存器進行復位*/SDIO_DeInit(); /*上電并進行卡識別流程,確認卡的操作電壓 */errorstatus = SD_PowerON(); /*如果上電,識別不成功,返回“響應超時”錯誤 */if (errorstatus != SD_OK){/*!< CMD Response TimeOut (wait for CMDSENT flag) */return(errorstatus); }/*卡識別成功,進行卡初始化 */errorstatus = SD_InitializeCards(); if (errorstatus != SD_OK) //失敗返回{/*!< CMD Response TimeOut (wait for CMDSENT flag) */return(errorstatus);}/*!< Configure the SDIO peripheral *//*!< on STM32F2xx devices, SDIOCLK is fixed to 48MHz */ /*!< SDIOCLK = HCLK, SDIO_CK = HCLK/(2 + SDIO_TRANSFER_CLK_DIV) *///重新配置 SDIO 外設,提高時鐘頻率,由卡識別模式的400khz提升到數據傳輸模式小于25MhzSDIO_InitStructure.SDIO_ClockDiv = SDIO_TRANSFER_CLK_DIV;//上升沿采集數據 SDIO_InitStructure.SDIO_ClockEdge = SDIO_ClockEdge_Rising;// 不使能Bypass,使SDIO_CK經過SDIO_ClockDiv分頻SDIO_InitStructure.SDIO_ClockBypass = SDIO_ClockBypass_Disable;//開啟的話,總線空閑時關閉SD_CLK 時鐘SDIO_InitStructure.SDIO_ClockPowerSave = SDIO_ClockPowerSave_Disable;//暫時配置成lbit模式SDIO_InitStructure.SDIO_BusWide = SDIO_BusWide_1b;//硬件流。若開啟,在FIFO不能進行發送和接受數據是,數據暫停SDIO_InitStructure.SDIO_HardwareFlowControl = SDIO_HardwareFlowControl_Disable;SDIO_Init(&SDIO_InitStructure);if (errorstatus == SD_OK){/*----------------- Read CSD/CID MSD registers ------------------*///用來讀取csd/cid寄存器/*調用 SD_GetCardInfo 函數獲取 SD 卡信息,它需要一個指向 SD_CardInfo 類型變 量地址的指針形參,這里賦值為 SDCardInfo 變量的地址。 SD 卡信息主要是 CID 和 CSD 寄存器內容,這兩個寄存器內容在 SD_InitializeCards 函數中都完成讀取過 程并將其分別存放在 CID_Tab 數組和 CSD_Tab 數組中,所以 SD_GetCardInfo 函 數只是簡單的把這兩個數組內容整合復制到 SDCardInfo 變量對應成員內。正確執 行 SD_GetCardInfo 函數后, SDCardInfo 變量就存放了 SD 卡的很多狀態信息,這 在之后應用中使用頻率是很高的。*/errorstatus = SD_GetCardInfo(&SDCardInfo);}if (errorstatus == SD_OK){/*----------------- Select Card --------------------------------*///通過cm7,rca選擇要操作的卡errorstatus = SD_SelectDeselect((uint32_t) (SDCardInfo.RCA << 16));}if (errorstatus == SD_OK){//提高讀寫,開啟4bit模式errorstatus = SD_EnableWideBusOperation(SDIO_BusWide_4b);} return(errorstatus); }
  • 調用 SD_PowerON 函數,它用于查詢卡的工作電壓和時鐘控制配置,并返回SD_Error 類型錯誤,該函數是整個 SD 識別精髓,
  • 此函數原stm32_eval_sdio_sd.c有,不需添加
//確保 SD 卡的工作電壓和配置控制時鐘 SD_Error SD_PowerON(void) {SD_Error errorstatus = SD_OK;uint32_t response = 0, count = 0, validvoltage = 0;uint32_t SDType = SD_STD_CAPACITY;/*!< Power ON Sequence -----------------------------------------------------*//*!< Configure the SDIO peripheral *//*!< SDIOCLK = HCLK, SDIO_CK = HCLK/(2 + SDIO_INIT_CLK_DIV) *//*!< on STM32F2xx devices, SDIOCLK is fixed to 48MHz *//*!< SDIO_CK for initialization should not exceed 400 KHz */ SDIO_InitStructure.SDIO_ClockDiv = SDIO_INIT_CLK_DIV;SDIO_InitStructure.SDIO_ClockEdge = SDIO_ClockEdge_Rising;SDIO_InitStructure.SDIO_ClockBypass = SDIO_ClockBypass_Disable;SDIO_InitStructure.SDIO_ClockPowerSave = SDIO_ClockPowerSave_Disable;// 初始化的時候暫時把數據線配置成一根SDIO_InitStructure.SDIO_BusWide = SDIO_BusWide_1b;//禁止硬件流控制SDIO_InitStructure.SDIO_HardwareFlowControl = SDIO_HardwareFlowControl_Disable;SDIO_Init(&SDIO_InitStructure);/*!< Set Power State to ON *///開啟外設電源SDIO_SetPowerState(SDIO_PowerState_ON);/*!< Enable SDIO Clock *///使能SDIO時鐘SDIO_ClockCmd(ENABLE);/*!< CMD0: GO_IDLE_STATE ---------------------------------------------------*//*!< No CMD response required *///發送一系列命令。開始卡的識別流程SDIO_CmdInitStructure.SDIO_Argument = 0x0;SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_GO_IDLE_STATE;//設置具體的返回類型,SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_No;//SDIO是否開啟或關閉等待中斷SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;/* CPSM 在開始發送命令之前等待數據傳輸結束 */SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;SDIO_SendCommand(&SDIO_CmdInitStructure);//檢測是否正確接收CM0 , CmdError 函數用于無需響應的命令發送errorstatus = CmdError();if (errorstatus != SD_OK){/*!< CMD Response TimeOut (wait for CMDSENT flag) *///響應超時return(errorstatus);}/*!< CMD8: SEND_IF_COND ----------------------------------------------------*//*!< Send CMD8 to verify SD card interface operating condition *//*!< Argument: - [31:12]: Reserved (shall be set to '0')- [11:8]: Supply Voltage (VHS) 0x1 (Range: 2.7-3.6 V)- [7:0]: Check Pattern (recommended 0xAA) *//*!< CMD Response: R7 *///發送CMD8檢查SD卡電壓操作 //發送 CMD8 命令,檢測 SD 卡支持的操作條件,主要就是電壓匹配, CMD8 的響//應類型是 R7,使用 CmdResp7Error 函數可獲取得到 R7 響應結果,它是通過檢測//SDIO_STA 寄 存 器 相 關 位 完 成 的 , 并 具 有 等 待 超 時 檢 測 功 能 。 SDIO_CmdInitStructure.SDIO_Argument = SD_CHECK_PATTERN;SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SEND_IF_COND;SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;SDIO_SendCommand(&SDIO_CmdInitStructure);//檢測是否正確接收 ,Checks for error conditions for R7 response. 搜索R7 (Card interface condition)errorstatus = CmdResp7Error();if (errorstatus == SD_OK){CardType = SDIO_STD_CAPACITY_SD_CARD_V2_0; /*!< SD Card 2.0 */SDType = SD_HIGH_CAPACITY;}else //無響應,說明1.x{/*!< CMD55 */SDIO_CmdInitStructure.SDIO_Argument = 0x00;SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_APP_CMD;SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;SDIO_SendCommand(&SDIO_CmdInitStructure);errorstatus = CmdResp1Error(SD_CMD_APP_CMD);}/*!< CMD55 *///發送CMD55,用于檢測sd卡還是mmc卡,或者不支持的卡SDIO_CmdInitStructure.SDIO_Argument = 0x00;SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_APP_CMD;SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;SDIO_SendCommand(&SDIO_CmdInitStructure);//是否響應,沒響應就是mmc或不支持的卡errorstatus = CmdResp1Error(SD_CMD_APP_CMD);/*!< If errorstatus is Command TimeOut, it is a MMC card *//*!< If errorstatus is SD_OK it is a SD card: SD card 2.0 (voltage range mismatch)or SD card 1.x */if (errorstatus == SD_OK) //響應cmd44.是sd卡,可能為1.x也可能2.x{//下面,循環發送sdio支持的電壓范圍,/*!< SD CARD *//*!< Send ACMD41 SD_APP_OP_COND with Argument 0x80100000 */while ((!validvoltage) && (count < SD_MAX_VOLT_TRIAL)){// 在發送 ACMD 命令前都要先向卡發送 CMD55 ,CMD55用于指示下一條指令是應用指令/*!< SEND CMD55 APP_CMD with RCA as 0 */SDIO_CmdInitStructure.SDIO_Argument = 0x00;SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_APP_CMD;SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;SDIO_SendCommand(&SDIO_CmdInitStructure);errorstatus = CmdResp1Error(SD_CMD_APP_CMD);if (errorstatus != SD_OK){return(errorstatus);}/* ACMD41 ,確定卡是不是 SDSC 還是 SDHC,返回R3(就是OCR寄存器),需要用CmdResp3Error返回狀態,主要從OCR寄存器31位0或1來判斷那種類型* 命令參數由支持的電壓范圍及 HCS 位組成, HCS 位置一來區分卡是 SDSC 還是 SDHC* 0:SDSC* 1:SDHC* 響應: R3,對應的是 OCR 寄存器*//*使用 ACMD41 命令判斷卡的具體類型。因為是 A 類命令,所以在發送 ACMD41 之前必須先發送 CMD55, CMD55 命令的響應類型的 R1。如果 CMD55 命令都沒 有響應說明是 MMC 卡或不可用卡。在正確發送 CMD55 之后就可以發送 ACMD41,并根據響應判斷卡類型, ACMD41 的響應號為 R3, CmdResp3Error 函 數用于檢測命令正確發送并帶有超時檢測功能,但并不具備響應內容接收功能, 需要在判定命令正確發送之后調用 SDIO_GetResponse 函數才能獲取響應的內容。*/SDIO_CmdInitStructure.SDIO_Argument = SD_VOLTAGE_WINDOW_SD | SDType;//0x80100000SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SD_APP_OP_COND;SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;SDIO_SendCommand(&SDIO_CmdInitStructure);errorstatus = CmdResp3Error();if (errorstatus != SD_OK){return(errorstatus);}/* 若卡需求電壓在 SDIO 的供電電壓范圍內,會自動上電并標志 pwr_up 位* 讀取卡寄存器,卡狀態*/response = SDIO_GetResponse(SDIO_RESP1);/* 讀取卡的 ocr 寄存器的 pwr_up 位,看是否已工作在正常電壓 */validvoltage = (((response >> 31) == 1) ? 1 : 0);count++; //計算循環}//結束循環// 循環檢測超過一定次數還沒上電if (count >= SD_MAX_VOLT_TRIAL){// SDIO 不支持 card 的供電電壓errorstatus = SD_INVALID_VOLTRANGE;return(errorstatus);}/*檢查卡返回信息中的 HCS 位*//* 判斷 ocr 中的 ccs 位 ,如果是 sdsc 卡則不執行下面的語句 */if (response &= SD_HIGH_CAPACITY) //判斷30位是否為1{CardType = SDIO_HIGH_CAPACITY_SD_CARD;}}/*!< else MMC Card */return(errorstatus); }

到此,程序執行SD卡的SD模式流程圖執行到如下圖、

判斷執行 SD_PowerON 函數無錯誤后,執行下面的 SD_InitializeCards 函數進行與 SD 卡相關的初始化,使得卡進入數據傳輸模式下的待機模式。

  • 此函數原stm32_eval_sdio_sd.c有,不需添加
//描述 :初始化所有的卡或者單個卡進入就緒狀態 SD_Error SD_InitializeCards(void) {SD_Error errorstatus = SD_OK;uint16_t rca = 0x01;if (SDIO_GetPowerState() == SDIO_PowerState_OFF){errorstatus = SD_REQUEST_NOT_APPLICABLE;return(errorstatus);}//判斷卡的類型if (SDIO_SECURE_DIGITAL_IO_CARD != CardType){/*!< Send CMD2 ALL_SEND_CID 響應: R2,對應 CID 寄存器*/SDIO_CmdInitStructure.SDIO_Argument = 0x0;SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_ALL_SEND_CID;SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Long;SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;SDIO_SendCommand(&SDIO_CmdInitStructure);errorstatus = CmdResp2Error();if (SD_OK != errorstatus){return(errorstatus);}/* 將返回的 CID 信息存儲起來 CID_Tab已經定義好了,不用我們自己,直接用 */CID_Tab[0] = SDIO_GetRespon se(SDIO_RESP1);CID_Tab[1] = SDIO_GetResponse(SDIO_RESP2);CID_Tab[2] = SDIO_GetResponse(SDIO_RESP3);CID_Tab[3] = SDIO_GetResponse(SDIO_RESP4);}if ((SDIO_STD_CAPACITY_SD_CARD_V1_1 == CardType) || (SDIO_STD_CAPACITY_SD_CARD_V2_0 == CardType) || (SDIO_SECURE_DIGITAL_IO_COMBO_CARD == CardType)|| (SDIO_HIGH_CAPACITY_SD_CARD == CardType)){/*!< Send CMD3 SET_REL_ADDR with argument 0* 要求各個 SD 卡返回自身的 RCA 地址. *//*!< SD Card publishes its RCA. */SDIO_CmdInitStructure.SDIO_Argument = 0x00;SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SET_REL_ADDR;SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;SDIO_SendCommand(&SDIO_CmdInitStructure);/* 把接收到的卡相對地址存起來 */errorstatus = CmdResp6Error(SD_CMD_SET_REL_ADDR, &rca);if (SD_OK != errorstatus){return(errorstatus);}}/*******************************************************************/if (SDIO_SECURE_DIGITAL_IO_CARD != CardType){RCA = rca;/*!< Send CMD9 SEND_CSD with argument as card's RCA 響應:R2 對應寄存器 CSD(Card-Specific Data)*/SDIO_CmdInitStructure.SDIO_Argument = (uint32_t)(rca << 16);SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SEND_CSD;SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Long;SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;SDIO_SendCommand(&SDIO_CmdInitStructure);errorstatus = CmdResp2Error();if (SD_OK != errorstatus){return(errorstatus);}CSD_Tab[0] = SDIO_GetResponse(SDIO_RESP1);CSD_Tab[1] = SDIO_GetResponse(SDIO_RESP2);CSD_Tab[2] = SDIO_GetResponse(SDIO_RESP3);CSD_Tab[3] = SDIO_GetResponse(SDIO_RESP4);}/*全部卡初始化成功 */errorstatus = SD_OK; /*!< All cards get intialized */return(errorstatus); }

;執行 SD_InitializeCards 函數無錯誤后 SD 卡就已經處于數據傳輸模式下的待機狀態,退出 SD_InitializeCards 后會返回前面的 SD_Init 函數,執行接下來代碼,以下是 SD_Init 函數的后續執行過程。執行之后,卡就從待機狀態轉變為傳輸模式,可以說數據傳輸已經是萬事俱備了。

SD 卡數據操作:包括數據讀取、數據寫入以及存儲區擦除。數據讀取和寫入都可以分為單塊操作和多塊操作。

  • 擦除函數
  • 此函數原stm32_eval_sdio_sd.c有,不需添加
SD_Error SD_Erase(uint32_t startaddr, uint32_t endaddr) {SD_Error errorstatus = SD_OK;uint32_t delay = 0;__IO uint32_t maxdelay = 0;uint8_t cardstate = 0;/*!< Check if the card coomnd class supports erase command */if (((CSD_Tab[1] >> 20) & SD_CCCC_ERASE) == 0){errorstatus = SD_REQUEST_NOT_APPLICABLE;return(errorstatus);}maxdelay = 120000 / ((SDIO->CLKCR & 0xFF) + 2);if (SDIO_GetResponse(SDIO_RESP1) & SD_CARD_LOCKED) //卡已上鎖{errorstatus = SD_LOCK_UNLOCK_FAILED;return(errorstatus);}if (CardType == SDIO_HIGH_CAPACITY_SD_CARD){//在 sdhc 卡中,地址參數為塊地址,每塊 512 字節,而 sdsc 卡地址為字節地址//所以若是 sdhc 卡要對地址/512 進行轉換startaddr /= 512;endaddr /= 512;}/*!< According to sd-card spec 1.0 ERASE_GROUP_START (CMD32) and erase_group_end(CMD33) */if ((SDIO_STD_CAPACITY_SD_CARD_V1_1 == CardType) || (SDIO_STD_CAPACITY_SD_CARD_V2_0 == CardType) || (SDIO_HIGH_CAPACITY_SD_CARD == CardType)){/*!< Send CMD32 SD_ERASE_GRP_START with argument as addr */SDIO_CmdInitStructure.SDIO_Argument = startaddr;SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SD_ERASE_GRP_START;SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; //R1SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;SDIO_SendCommand(&SDIO_CmdInitStructure);errorstatus = CmdResp1Error(SD_CMD_SD_ERASE_GRP_START);if (errorstatus != SD_OK){return(errorstatus);}/*!< Send CMD33 SD_ERASE_GRP_END with argument as addr */SDIO_CmdInitStructure.SDIO_Argument = endaddr;SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SD_ERASE_GRP_END;SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;SDIO_SendCommand(&SDIO_CmdInitStructure);errorstatus = CmdResp1Error(SD_CMD_SD_ERASE_GRP_END);if (errorstatus != SD_OK){return(errorstatus);}}/*!< Send CMD38 ERASE */SDIO_CmdInitStructure.SDIO_Argument = 0;SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_ERASE;SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;SDIO_SendCommand(&SDIO_CmdInitStructure);errorstatus = CmdResp1Error(SD_CMD_ERASE);if (errorstatus != SD_OK){return(errorstatus);}for (delay = 0; delay < maxdelay; delay++){}/*!< Wait till the card is in programming state */errorstatus = IsCardProgramming(&cardstate);while ((errorstatus == SD_OK) && ((SD_CARD_PROGRAMMING == cardstate) || (SD_CARD_RECEIVING == cardstate))){errorstatus = IsCardProgramming(&cardstate);}return(errorstatus); }

SD_WriteBlock 函數用于向指定的目標地址寫入一個塊的數據,它有三個形參,分別為指向待寫入數據的首地址的指針變量、目標寫入地址和塊大小。塊大小一般都設置為512 字節。 (函數不用自己添加,但需要修改)

SD_Error SD_WriteBlock(uint8_t *writebuff, uint64_t WriteAddr, uint16_t BlockSize) {SD_Error errorstatus = SD_OK;#if defined (SD_POLLING_MODE)uint32_t bytestransferred = 0, count = 0, restwords = 0;uint32_t *tempbuff = (uint32_t *)writebuff; #endifTransferError = SD_OK;TransferEnd = 0;StopCondition = 0;SDIO->DCTRL = 0x0;if (CardType == SDIO_HIGH_CAPACITY_SD_CARD){BlockSize = 512;WriteAddr /= 512;}/*-------------- add , 沒有這一段容易卡死在DMA檢測中 -------------------*//* Set Block Size for Card,cmd16,* 若是sdsc卡,可以用來設置塊大小,* 若是sdhc卡,塊大小為512字節,不受cmd16影響 */SDIO_CmdInitStructure.SDIO_Argument = (uint32_t) BlockSize;SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SET_BLOCKLEN;SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;SDIO_SendCommand(&SDIO_CmdInitStructure);errorstatus = CmdResp1Error(SD_CMD_SET_BLOCKLEN);if (SD_OK != errorstatus){return(errorstatus);}/*********************************************************************************//*!< Send CMD24 WRITE_SINGLE_BLOCK */SDIO_CmdInitStructure.SDIO_Argument = WriteAddr; //寫入地址SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_WRITE_SINGLE_BLOCK;SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; //r1SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;SDIO_SendCommand(&SDIO_CmdInitStructure);errorstatus = CmdResp1Error(SD_CMD_WRITE_SINGLE_BLOCK);if (errorstatus != SD_OK){return(errorstatus);}//配置sdio的寫數據寄存器SDIO_DataInitStructure.SDIO_DataTimeOut = SD_DATATIMEOUT;SDIO_DataInitStructure.SDIO_DataLength = BlockSize;SDIO_DataInitStructure.SDIO_DataBlockSize = (uint32_t) 9 << 4; //可用此參數代替SDIO_DataBlockSize_512bSDIO_DataInitStructure.SDIO_TransferDir = SDIO_TransferDir_ToCard;//寫數據,SDIO_DataInitStructure.SDIO_TransferMode = SDIO_TransferMode_Block;SDIO_DataInitStructure.SDIO_DPSM = SDIO_DPSM_Enable; //開啟數據通道狀態機SDIO_DataConfig(&SDIO_DataInitStructure);/*!< In case of single data block transfer no need of stop command at all */ #if defined (SD_POLLING_MODE) //普通模式while (!(SDIO->STA & (SDIO_FLAG_DBCKEND | SDIO_FLAG_TXUNDERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_STBITERR))){if (SDIO_GetFlagStatus(SDIO_FLAG_TXFIFOHE) != RESET){if ((512 - bytestransferred) < 32){restwords = ((512 - bytestransferred) % 4 == 0) ? ((512 - bytestransferred) / 4) : (( 512 - bytestransferred) / 4 + 1);for (count = 0; count < restwords; count++, tempbuff++, bytestransferred += 4){SDIO_WriteData(*tempbuff);}}else{for (count = 0; count < 8; count++){SDIO_WriteData(*(tempbuff + count));}tempbuff += 8;bytestransferred += 32;}}}if (SDIO_GetFlagStatus(SDIO_FLAG_DTIMEOUT) != RESET){SDIO_ClearFlag(SDIO_FLAG_DTIMEOUT);errorstatus = SD_DATA_TIMEOUT;return(errorstatus);}else if (SDIO_GetFlagStatus(SDIO_FLAG_DCRCFAIL) != RESET){SDIO_ClearFlag(SDIO_FLAG_DCRCFAIL);errorstatus = SD_DATA_CRC_FAIL;return(errorstatus);}else if (SDIO_GetFlagStatus(SDIO_FLAG_TXUNDERR) != RESET){SDIO_ClearFlag(SDIO_FLAG_TXUNDERR);errorstatus = SD_TX_UNDERRUN;return(errorstatus);}else if (SDIO_GetFlagStatus(SDIO_FLAG_STBITERR) != RESET){SDIO_ClearFlag(SDIO_FLAG_STBITERR);errorstatus = SD_START_BIT_ERR;return(errorstatus);} #elif defined (SD_DMA_MODE) //dma模式SDIO_ITConfig(SDIO_IT_DATAEND, ENABLE); //數據傳輸結束中斷SD_DMA_TxConfig((uint32_t *)writebuff, BlockSize); //配置dma,跟rx類似SDIO_DMACmd(ENABLE); // 使能sdio的dma請求 #endifreturn(errorstatus); }

SD_WaitWriteOperation 函數用于檢測和等待數據寫入完成,在調用數據寫入函數之后一般都需要調用, SD_WaitWriteOperation 函數適用于單塊及多塊寫入函數。

/*** 上述代碼調用庫函數 SD_DMAEndOfTransferStatus 一直檢測 DMA 的傳輸完成標志, 當 DMA 傳輸結束時,該函數會返回 SET 值。另外, while 循環中的判斷條件使用的 TransferEnd 和 TransferError 是全局變量,它們會在 SDIO 的中斷服務函數根據傳輸情況被 設置, 傳輸結束后,根據 TransferError 的值來確認是否正確傳輸,若不正確則直接返回錯 誤代碼。 SD_WaitWriteOperation 函數最后是清除相關標志位并返回錯誤。由于這個函數里 的 while 循環的存在, 它會確保 DMA 的傳輸結束。*/ SD_Error SD_WaitWriteOperation(void) {SD_Error errorstatus = SD_OK;//等待dma是否傳輸while ((SD_DMAEndOfTransferStatus() == RESET) && (TransferEnd == 0) && (TransferError == SD_OK)){}if (TransferError != SD_OK){return(TransferError);}/*!< Clear all the static flags */SDIO_ClearFlag(SDIO_STATIC_FLAGS);return(errorstatus); }

SD_ReadBlock函數:

SD_Error SD_ReadBlock(uint8_t *readbuff, uint64_t ReadAddr, uint16_t BlockSize) {SD_Error errorstatus = SD_OK; #if defined (SD_POLLING_MODE) uint32_t count = 0, *tempbuff = (uint32_t *)readbuff; #endifTransferError = SD_OK;TransferEnd = 0; //傳輸結束標置位,在中斷服務置1StopCondition = 0; SDIO->DCTRL = 0x0;if (CardType == SDIO_HIGH_CAPACITY_SD_CARD){BlockSize = 512;ReadAddr /= 512;}/*******************add,沒有這一段容易卡死在DMA檢測中*************************************//* Set Block Size for Card,cmd16,* 若是sdsc卡,可以用來設置塊大小,* 若是sdhc卡,塊大小為512字節,不受cmd16影響 */SDIO_CmdInitStructure.SDIO_Argument = (uint32_t) BlockSize;SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SET_BLOCKLEN;SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short; //r1SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;SDIO_SendCommand(&SDIO_CmdInitStructure);errorstatus = CmdResp1Error(SD_CMD_SET_BLOCKLEN);if (SD_OK != errorstatus){return(errorstatus);}/*********************************************************************************/SDIO_DataInitStructure.SDIO_DataTimeOut = SD_DATATIMEOUT;SDIO_DataInitStructure.SDIO_DataLength = BlockSize;SDIO_DataInitStructure.SDIO_DataBlockSize = (uint32_t) 9 << 4;SDIO_DataInitStructure.SDIO_TransferDir = SDIO_TransferDir_ToSDIO;SDIO_DataInitStructure.SDIO_TransferMode = SDIO_TransferMode_Block;SDIO_DataInitStructure.SDIO_DPSM = SDIO_DPSM_Enable;SDIO_DataConfig(&SDIO_DataInitStructure);/*!< Send CMD17 READ_SINGLE_BLOCK */SDIO_CmdInitStructure.SDIO_Argument = (uint32_t)ReadAddr;SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_READ_SINGLE_BLOCK;SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;SDIO_SendCommand(&SDIO_CmdInitStructure);errorstatus = CmdResp1Error(SD_CMD_READ_SINGLE_BLOCK);if (errorstatus != SD_OK){return(errorstatus);}#if defined (SD_POLLING_MODE) /*!< In case of single block transfer, no need of stop transfer at all.*//*!< Polling mode */while (!(SDIO->STA &(SDIO_FLAG_RXOVERR | SDIO_FLAG_DCRCFAIL | SDIO_FLAG_DTIMEOUT | SDIO_FLAG_DBCKEND | SDIO_FLAG_STBITERR))){if (SDIO_GetFlagStatus(SDIO_FLAG_RXFIFOHF) != RESET){for (count = 0; count < 8; count++){*(tempbuff + count) = SDIO_ReadData();}tempbuff += 8;}}if (SDIO_GetFlagStatus(SDIO_FLAG_DTIMEOUT) != RESET){SDIO_ClearFlag(SDIO_FLAG_DTIMEOUT);errorstatus = SD_DATA_TIMEOUT;return(errorstatus);}else if (SDIO_GetFlagStatus(SDIO_FLAG_DCRCFAIL) != RESET){SDIO_ClearFlag(SDIO_FLAG_DCRCFAIL);errorstatus = SD_DATA_CRC_FAIL;return(errorstatus);}else if (SDIO_GetFlagStatus(SDIO_FLAG_RXOVERR) != RESET){SDIO_ClearFlag(SDIO_FLAG_RXOVERR);errorstatus = SD_RX_OVERRUN;return(errorstatus);}else if (SDIO_GetFlagStatus(SDIO_FLAG_STBITERR) != RESET){SDIO_ClearFlag(SDIO_FLAG_STBITERR);errorstatus = SD_START_BIT_ERR;return(errorstatus);}while (SDIO_GetFlagStatus(SDIO_FLAG_RXDAVL) != RESET){*tempbuff = SDIO_ReadData();tempbuff++;}/*!< Clear all the static flags */SDIO_ClearFlag(SDIO_STATIC_FLAGS);#elif defined (SD_DMA_MODE)SDIO_ITConfig(SDIO_IT_DATAEND, ENABLE);SDIO_DMACmd(ENABLE);SD_DMA_RxConfig((uint32_t *)readbuff, BlockSize); #endifreturn(errorstatus); }

其他讀寫操作函數雷同,不用修改。但需要把最后面4句話替換成:

到此,SD卡初始化完成了,以上只是介紹重要那部分的函數,其他有些細微的修改,先引用,請點擊:SD讀寫測試

設置SDIO 中斷服務函數(stm32f10x_it.c)

// 在 SDIO_ITConfig()這個函數開啟了 sdio 中斷 , void SDIO_IRQHandler(void) {//SDIO中斷相關處理SD_ProcessIRQSrc(); //定義在bsp_sdio_sdcard.c} /** 函數名:SD_ProcessIRQSrc* 描述 :數據傳輸結束中斷* 輸入 :無 * 輸出 :SD錯誤類型*/ SD_Error SD_ProcessIRQSrc(void) {if (StopCondition == 1) //發送讀取、多塊讀寫命令時置1{SDIO->ARG = 0x0; //命令參數寄存器SDIO->CMD = 0x44C; // 命令寄存器: 0100 01 001100// [7:6] [5:0]// CPSMEN WAITRESP CMDINDEX// 開啟命令狀態機 短響應 cmd12 STOP_ TRANSMISSION TransferError = CmdResp1Error(SD_CMD_STOP_TRANSMISSION);}else{TransferError = SD_OK;}SDIO_ClearITPendingBit(SDIO_IT_DATAEND); //清中斷SDIO_ITConfig(SDIO_IT_DATAEND, DISABLE); //關閉sdio中斷使能TransferEnd = 1;return(TransferError); }

至此,我們已經介紹了 SD 卡初始化、 SD 卡數據操作的基礎功能函數以及 SDIO 相關中斷服務函數內容,利用這個 SDIO 驅動,可以編寫一些簡單的 SD 卡讀寫測試程序。

測試 SD 卡部分的函數是我們自己編寫的,存放在 sdio_test.c 文件等。

最后附上我編寫的程序代碼,主要實現串口輸入內容,然后保存到sd卡中。再讀取出來,輸出到串口那里。

點擊下載:【sd卡讀取】

轉載于:https://www.cnblogs.com/guguobao/p/10123755.html

總結

以上是生活随笔為你收集整理的使用STM32F103ZET霸道主板实现SD卡的读写(非文件系统)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

日本三级中文字幕在线观看 | 特级xxxxx欧美 | 国产精品久久久久久一区二区 | 在线a人v观看视频 | 狠狠干激情| 99婷婷狠狠成为人免费视频 | 精品国产一区二区三区不卡 | 91av蜜桃| 天天干天天做天天爱 | 欧美激情视频一区二区三区免费 | 操操操综合| 色欲综合视频天天天 | 97在线观看免费高清 | 亚洲精品理论 | 午夜久久久久久久久久久 | 亚洲精品在线观看中文字幕 | 中文字幕国产在线 | 中文字幕在线乱 | 波多野结衣久久精品 | 91视频亚洲 | 成人欧美在线 | www婷婷| 国产尤物一区二区三区 | 国产精品久久久久久久久久白浆 | 四虎国产精品成人免费4hu | 亚洲视频999| 99热.com| 狠狠伊人 | 欧美大片aaa | 欧美色图88 | 天天爽人人爽 | 九九九九热精品免费视频点播观看 | 91.麻豆视频 | www色网站 | 99精品视频精品精品视频 | 视频二区| 91av播放| 国产精品久久久久久影院 | 精品亚洲视频在线观看 | 在线播放第一页 | 国产麻豆视频在线观看 | 久久精品亚洲一区二区三区观看模式 | a黄色片 | 狠狠久久婷婷 | 日韩videos高潮hd| 国产一级黄色免费看 | 免费a一级 | 久久99精品久久久久久秒播蜜臀 | 欧美超碰在线 | 亚洲成人免费在线观看 | 开心激情综合网 | 久久9999久久免费精品国产 | 国产精品video | 色综合久久五月 | 欧美一区二区在线刺激视频 | 狠狠色噜噜狠狠狠狠2022 | 欧美高清视频不卡网 | 天天射天天色天天干 | 国产麻豆电影在线观看 | 五月婷影院 | 欧美美女视频在线观看 | 超碰97人 | 国产午夜麻豆影院在线观看 | 成年人毛片在线观看 | 粉嫩高清一区二区三区 | 国产色视频一区二区三区qq号 | 色的网站在线观看 | 国内精品美女在线观看 | 黄色看片| 精品在线观 | 国产99久久久国产精品成人免费 | 欧美91精品久久久久国产性生爱 | 国产精品对白一区二区三区 | 久久在线看 | 久久高清精品 | 色网站国产精品 | 91麻豆免费版 | 亚洲好视频| 在线免费观看国产精品 | 在线观看视频一区二区三区 | 日韩欧美视频在线观看免费 | 久久国产a| av免费电影网站 | 久久久午夜精品福利内容 | 在线亚洲天堂网 | 久久这里只有精品9 | 激情综合狠狠 | 日韩精品久久久久久 | 日日夜夜av| 日韩艹| 日韩欧美在线高清 | 国产麻豆电影在线观看 | 视频91 | av中文字幕亚洲 | 国产日韩中文字幕 | 天天操月月操 | 成人黄色av免费在线观看 | 国产视频观看 | 日韩中文字幕在线看 | 最新av中文字幕 | 久久久这里有精品 | 特级黄色视频毛片 | 热久久99这里有精品 | 9幺看片 | 高清av中文在线字幕观看1 | 中文字幕一区二区三区在线观看 | 五月婷婷激情综合 | 91麻豆免费视频 | 日韩精品一区二区三区中文字幕 | 日韩超碰在线 | 69亚洲乱 | 免费看黄色毛片 | 久久免费看毛片 | 亚洲男女精品 | 国产成人av网站 | 国产a级片免费观看 | 99久久精品免费看国产免费软件 | avlulu久久精品| 久久国内精品 | 久久一线 | 午夜视频一区二区 | 97成人资源 | 久久精品五月 | 国产亚洲精品久久久久久久久久 | 国产精品久久久久久久久久久免费看 | 国产精品免费大片视频 | av网站在线观看免费 | 成年人在线观看 | 日韩欧美高清视频在线观看 | 成人免费在线观看电影 | 国产亚洲精品久久久久久久久久 | 免费看片黄色 | 欧美一级免费在线 | 亚洲精品黄 | 久久在线精品视频 | 国产在线久草 | 亚洲国产片色 | 91精品一区二区三区蜜臀 | 九九久久免费视频 | 亚洲涩涩涩涩涩涩 | 日本动漫做毛片一区二区 | 久久看看 | 午夜美女wwww | 欧美坐爱视频 | 在线观看的黄色 | 亚洲精品视 | 日韩激情第一页 | 国产97在线观看 | 久久综合色天天久久综合图片 | 97超视频在线观看 | 色综合色综合久久综合频道88 | 亚洲三级在线 | 在线一区av| 激情五月婷婷综合网 | 国产免费一区二区三区最新 | 9i看片成人免费看片 | 成人va天堂 | 91视频在线 | 最新av电影网址 | 久精品视频免费观看2 | 久久99精品热在线观看 | 在线观看日韩国产 | 日韩欧美一区二区不卡 | 国产高清不卡一区二区三区 | 久久狠狠婷婷 | 欧美最猛性xxxxx(亚洲精品) | 欧美激情片在线观看 | 日韩av图片 | 久久久久亚洲最大xxxx | 成人免费观看网站 | 六月色| 精品夜夜嗨av一区二区三区 | 五月亚洲 | 精品久久久久一区二区国产 | 成人一级在线观看 | 91精品在线免费观看 | 国产18精品乱码免费看 | 六月丁香婷婷在线 | 日本性xxx| 人人爱人人舔 | 久久精品精品 | 最新国产一区二区三区 | 国产99精品| 精品亚洲免费视频 | 国产成人精品一区二 | 男女激情免费网站 | 免费在线精品视频 | 日韩手机在线 | 免费99精品国产自在在线 | 二区三区视频 | 国产精品久免费的黄网站 | 久久夜色精品亚洲噜噜国4 午夜视频在线观看欧美 | 国产亚洲免费的视频看 | 久久综合九色欧美综合狠狠 | 99热国内精品 | 一区二区中文字幕在线 | 视频在线观看91 | 日韩一区精品 | 日韩精品一区二区三区中文字幕 | 国产美女精品人人做人人爽 | 欧美一级电影免费观看 | 欧美福利视频一区 | 国产精品va | 精品国内自产拍在线观看视频 | 正在播放国产精品 | 缴情综合网五月天 | 中文字幕资源网 国产 | 一区二区电影网 | 日日草av| 久久狠狠一本精品综合网 | 日韩精品中文字幕av | 久久九九国产视频 | 亚洲精选在线 | 99热这里只有精品8 久久综合毛片 | 亚洲日本va午夜在线电影 | 欧美日韩高清国产 | av免费在线播放 | 国产日产精品一区二区三区四区的观看方式 | 色婷婷中文 | 国产精国产精品 | 国产精品嫩草55av | 97视频在线观看视频免费视频 | 国产a级片免费观看 | 久久久精华网 | 国产又粗又猛又黄又爽的视频 | 亚洲精品动漫久久久久 | 国产精品美女久久久久久网站 | 亚洲精品乱码久久久久久蜜桃动漫 | 成年人黄色大片在线 | 日韩专区av | 99在线观看免费视频精品观看 | 国产成人精品一区在线 | 在线国产日韩 | 极品久久久久久久 | 九九视频免费观看视频精品 | 国产免费又粗又猛又爽 | 午夜色影院 | 国产美腿白丝袜足在线av | 91网页版在线观看 | 夜夜夜夜操 | 在线观看你懂的网址 | 国产一区二区三区久久久 | 久久免费视频在线 | 免费看网站在线 | 国产中文字幕视频在线观看 | 一区三区视频 | 国产丝袜在线 | www国产亚洲精品久久网站 | 成人在线播放av | 伊人久久一区 | 香蕉视频国产在线观看 | 五月色丁香 | 手机版av在线 | 精品久久福利 | 日韩视频一区二区三区在线播放免费观看 | 婷婷亚洲五月 | 国产精品视频你懂的 | 日韩欧美一区二区三区黑寡妇 | 一区二区三区四区不卡 | 国产在线欧美 | 国产午夜精品一区二区三区嫩草 | 国产精品福利视频 | av网址在线播放 | 亚洲精品视频在线观看视频 | 亚洲精品视频一二三 | 久草影视在线 | 综合网中文字幕 | 成人av动漫在线 | 夜夜夜夜猛噜噜噜噜噜初音未来 | 涩涩网站在线 | 91成人精品在线 | 国产日韩精品视频 | 欧美成人高清 | 又色又爽的网站 | 日韩三级视频在线看 | 伊人久久在线观看 | 91av在线不卡| 丁香在线视频 | 日韩三区在线观看 | 91免费在线视频 | 天天色成人网 | 久久精品视频日本 | 国产精品99久久久精品免费观看 | 蜜臀av麻豆| 黄色的网站免费看 | 69av视频在线观看 | 婷婷亚洲综合 | 视频在线观看入口黄最新永久免费国产 | 欧美日韩在线视频一区二区 | 91精品天码美女少妇 | 国产福利一区在线观看 | 96久久精品 | 国产一区视频导航 | 欧美日韩国产精品一区二区亚洲 | 中文字幕一区二区三区乱码在线 | 亚洲有 在线 | 免费又黄又爽视频 | 中文字幕av在线播放 | 97视频免费播放 | 日韩免费在线观看网站 | 91在线视频播放 | 久久综合中文字幕 | 国产精品久久久久久久久久新婚 | 天天爱天天舔 | 国产精品99久久久久久久久久久久 | 人人操日日干 | 国产香蕉97碰碰碰视频在线观看 | 高清在线一区 | 婷婷色婷婷 | 69久久99精品久久久久婷婷 | 国产人成一区二区三区影院 | 日韩视频一区二区 | 久久人人爽人人人人片 | 黄污在线观看 | 免费观看一级 | 99这里精品| 91桃色在线免费观看 | 麻豆免费看片 | 99久久99久国产黄毛片 | 成人午夜精品久久久久久久3d | 中文字幕中文字幕在线中文字幕三区 | 四虎在线免费视频 | 视频在线国产 | 欧美一级久久久久 | 狠狠色噜噜狠狠狠狠2022 | 欧美国产日韩一区二区三区 | av一级片网站 | 一本一道久久a久久精品蜜桃 | 日日干天夜夜 | 国产一二三精品 | 天天插日日射 | 久久这里只有精品首页 | 免费视频一二三区 | 在线国产精品视频 | 久久综合欧美精品亚洲一区 | 亚洲精品综合在线 | 成人免费一区二区三区在线观看 | 玖玖精品在线 | 91免费版在线观看 | 在线观看黄色免费视频 | 欧美日韩另类视频 | 午夜久久久久久久久久久 | 久久一区二区三区超碰国产精品 | 天躁狠狠躁 | 色av婷婷 | 欧美精品免费在线 | 日本高清中文字幕有码在线 | 免费91在线 | 99亚洲天堂 | 激情深爱.com | 久久久色 | 欧美日韩色婷婷 | 91视频高清免费 | 四虎免费在线观看 | 亚洲乱码一区 | 国产高清永久免费 | 三级免费黄色 | 亚洲精品乱码久久久久久蜜桃91 | 黄色毛片视频 | 日日躁你夜夜躁你av蜜 | 骄小bbw搡bbbb揉bbbb | 99精品一区 | 手机在线观看国产精品 | 91人人爱| 天堂av色婷婷一区二区三区 | a成人v在线 | 国偷自产视频一区二区久 | 香蕉影视在线观看 | 中文字幕中文字幕 | 亚洲精品无 | 黄色影院在线观看 | 欧美另类成人 | 超碰精品在线 | 日本精品久久久一区二区三区 | 精品国产一区二区三区久久久久久 | 在线观看的av | 青春草免费视频 | 亚洲一区黄色 | 正在播放一区二区 | 久久国产视频网站 | 国产精品九九久久久久久久 | 免费观看午夜视频 | 黄色aa久久| 最近中文字幕免费观看 | 狠狠干综合网 | 99在线精品免费视频九九视 | 久草剧场| 国产不卡一二三区 | 成人小电影在线看 | 国产香蕉在线 | 日韩在线国产 | www.com.黄| 曰韩在线| 免费在线精品视频 | 在线成人短视频 | 日韩精品一区二区三区丰满 | 久操视频在线播放 | 婷婷久久婷婷 | 国产高清不卡在线 | 婷香五月 | 日韩福利在线观看 | 色婷婷av在线 | 亚洲婷久久 | 日韩狠狠操 | 五月婷婷在线观看视频 | 中文字幕乱视频 | 国产高清av免费在线观看 | 人人看人人草 | 国产精品理论片在线播放 | 日韩一区二区三区免费电影 | 亚洲成av人片 | 久久亚洲福利视频 | 亚洲h色精品 | 成人免费在线播放视频 | 精品久久片| 五月天综合在线 | 日韩电影在线看 | 久草国产视频 | 成片免费观看视频大全 | 亚洲精品在线观看av | 亚洲欧美日韩一区二区三区在线观看 | 国产精品成人自产拍在线观看 | 91麻豆高清视频 | 不卡av在线免费观看 | 国产视频高清 | 97色在线观看 | 欧美成人一二区 | 日韩网站中文字幕 | 99久久久久国产精品免费 | 国产超碰在线 | 午夜视频黄 | 中文日韩在线视频 | 久草在线免费看视频 | 国产男女无遮挡猛进猛出在线观看 | 91成人网在线播放 | 日韩在线视频一区二区三区 | 射久久 | 国产免费午夜 | 热99久久精品 | 97在线视频免费观看 | 亚洲精品456在线播放 | 国产性天天综合网 | 日韩aa视频 | 亚洲激情婷婷 | 在线观看韩日电影免费 | 国产精品黄色影片导航在线观看 | 午夜精品电影一区二区在线 | 91在线看网站 | 久久不卡免费视频 | 免费网址在线播放 | 中文在线8资源库 | 69久久99精品久久久久婷婷 | 久久婷婷一区二区三区 | 日韩不卡高清视频 | 日韩av高清 | 久久成人免费 | www.com久久久 | 国产精品国产三级国产不产一地 | 97在线观看免费观看高清 | 91精品在线免费视频 | 一级片观看 | 成人三级视频 | 四虎国产精品免费观看视频优播 | 久久久国产精品成人免费 | 国产伦精品一区二区三区高清 | 亚洲电影久久 | 色播五月激情五月 | 欧美性精品| 亚洲黄色av网址 | 一本色道久久综合亚洲二区三区 | 亚洲国产日韩欧美 | 国产精品亚洲片夜色在线 | 婷婷久久久 | 精品国产大片 | 91精品网站 | 国产高清综合 | 国产色区 | 在线观看视频97 | 欧美aⅴ在线观看 | 久草在线视频精品 | 欧洲精品视频一区 | 欧美福利网站 | 99在线热播精品免费99热 | 在线黄频 | 国产999视频在线观看 | 欧美男同视频网站 | 亚洲电影自拍 | 国产一级二级在线播放 | 色鬼综合网 | 在线综合 亚洲 欧美在线视频 | 日韩www在线 | 亚洲成av人片 | 国产原创av在线 | 日韩av电影一区 | 操操日日 | 国产亚洲欧美在线视频 | 欧美 国产 视频 | 国产美女网| 香蕉视频久久 | 中文字幕二区在线观看 | 色狠狠干 | 三上悠亚一区二区在线观看 | 91精品久久久久久综合乱菊 | 天天操天天干天天综合网 | 国产1区在线 | 六月激情婷婷 | 国产在线传媒 | 欧美在线不卡一区 | 黄色小说网站在线 | 久久日韩精品 | 欧美大香线蕉线伊人久久 | av免费观看高清 | 在线观看成人网 | 激情视频免费在线观看 | 涩涩爱夜夜爱 | 九九九热精品免费视频观看 | 日韩高清成人 | 国内久久久久 | 99视频在线 | 水蜜桃亚洲一二三四在线 | 国产婷婷精品av在线 | 特级毛片网 | 日本中文字幕视频 | 亚洲精品午夜aaa久久久 | 五月综合久久 | 狠狠色丁香婷婷综合橹88 | 国产自产在线视频 | 久久av不卡| av九九九| 中文字幕日韩精品有码视频 | 亚洲有 在线 | 免费午夜视频在线观看 | 亚洲精品mv在线观看 | 日本一区二区三区免费观看 | 狠狠干成人| 一区二区三区四区五区六区 | 99久久99视频只有精品 | 午夜精品久久久久久久99 | 国产精品一区电影 | 日韩视频一区二区三区 | 天天射天天干天天爽 | 午夜12点| 天堂在线一区二区三区 | 成人一级片视频 | 国色天香在线观看 | 久久久久久国产一区二区三区 | 狠狠干干 | 国产无套一区二区三区久久 | 亚洲精品乱码久久久久 | 人人插人人做 | 天天色图| 99国产精品视频免费观看一公开 | 国产亚洲精品久久久久久久久久久久 | 日本精品在线看 | 伊人精品影院 | av高清影院 | 久久久久久久久国产 | 天天草天天色 | 国产成人黄色av | 国产首页| 久久成年人视频 | 在线观看亚洲免费视频 | 97在线免费| 韩国一区二区三区视频 | 91在线精品观看 | 亚洲欧美视频在线观看 | 久久精品一区二区三区四区 | 蜜桃视频在线观看一区 | 黄色软件在线看 | 91av久久 | 久久免费国产视频 | 丁香六月天婷婷 | 国产在线综合视频 | 国产精品第一视频 | 亚洲精品乱码久久久久久写真 | 亚洲免费精品视频 | 国产色视频123区 | 亚洲精品www久久久久久 | 97狠狠干 | 国产精品久久久久久av | 六月婷色| 在线观看黄网站 | 亚洲人成在线电影 | a黄色片在线观看 | 国产高清在线 | 91观看视频| 一区二区三区四区免费视频 | 亚洲成人国产精品 | 天天干天天操天天拍 | 中文在线免费视频 | 91成人在线视频 | 国产高清一级 | 啪啪资源 | 日韩亚洲在线 | 激情 婷婷 | 成年人在线观看免费视频 | 看片黄网站 | 天天爱天天操天天爽 | 91丨九色丨高潮丰满 | 亚洲视频久久 | 国产123区在线观看 国产精品麻豆91 | 日韩在线高清视频 | 久久理伦片| 在线精品视频在线观看高清 | 69久久夜色精品国产69 | 成人网444ppp| 香蕉久久久久久av成人 | 亚洲精品美女视频 | 日韩成人在线免费观看 | 91丨九色丨高潮 | 91精品在线播放 | 久草亚洲视频 | 国产在线观看一 | 操操操操网 | 欧美综合国产 | 国产视频欧美视频 | 国产精品18久久久久久久网站 | 国产精品18久久久久久vr | av在线网站免费观看 | 久久精品站| 亚洲日本精品 | 日韩三级免费观看 | 国产精品完整版 | 波多野结衣在线观看一区 | 国产精品久久在线观看 | 久操伊人| 91在线免费视频 | 中文字幕在线免费看 | 免费高清在线视频一区· | 国产成人a亚洲精品 | 91探花在线视频 | 成人 国产 在线 | 国产精品一区二区三区四区在线观看 | 日韩精品一区二区三区视频播放 | 天堂激情网| 色多多视频在线观看 | 久久精品波多野结衣 | 四虎影视成人永久免费观看亚洲欧美 | 麻豆视频在线免费观看 | 日本少妇久久久 | 国产精品久久电影观看 | 天天操天天射天天操 | 毛片网站免费 | 国产精品九九九 | 国产又粗又猛又黄又爽 | 91精品久久久久久久久久入口 | 欧美日韩在线观看一区二区 | 亚洲美女精品区人人人人 | 国产成人精品亚洲日本在线观看 | 国产成人黄色在线 | 国产精品1区2区 | 欧美在线视频第一页 | 国产午夜三级一区二区三 | 九九精品毛片 | 亚洲爽爽网 | 午夜美女福利直播 | 麻豆国产视频下载 | 欧美日韩免费观看一区二区三区 | 久久成人综合视频 | 91精品办公室少妇高潮对白 | 激情久久综合 | 日韩高清一二区 | 国内精品视频久久 | 国产午夜精品一区二区三区在线观看 | 黄色精品免费 | 亚洲精品国精品久久99热 | 久久亚洲私人国产精品 | 欧美国产一区在线 | 欧美另类网站 | 黄色一集片 | 午夜电影久久 | 在线国产片 | 国产一二三四在线视频 | 欧美日韩国产精品一区二区亚洲 | 国产成人精品女人久久久 | 久久精品激情 | 国产成人精品一区二区三区 | 久久久精品欧美一区二区免费 | 亚洲免费精彩视频 | 五月激情婷婷丁香 | 在线免费观看视频一区 | 中文字幕在线视频第一页 | 日本性xxxxx 亚洲精品午夜久久久 | 性色av免费看 | 日韩高清在线不卡 | 麻豆视频国产在线观看 | 国产成人精品三级 | 久久国产一区二区 | 国产精品理论视频 | 狠狠色婷婷丁香六月 | 亚洲永久精品在线观看 | 国产区精品区 | av蜜桃在线 | 久久高清片 | 久久国产高清视频 | 99视频在线观看一区三区 | 人人超碰免费 | 午夜av不卡| 91在线视频观看免费 | 九色91在线视频 | 国产精品一区二区三区四区在线观看 | 久久国产免费视频 | 国产破处精品 | 日韩欧美在线一区二区 | 国产原创在线 | 色中射| 国产精品 日韩精品 | 色999视频 | 在线观看视频国产一区 | 九九影视理伦片 | 婷婷色婷婷 | 人人干人人超 | 在线观看一 | 成人av电影免费在线观看 | 最新av电影网址 | 欧美久久综合 | 免费激情网 | 久草在线99 | 一区二区三区免费在线播放 | 精品欧美小视频在线观看 | 91精品伦理 | 成年人免费在线观看网站 | 免费97视频 | 亚洲成av人片一区二区梦乃 | 国产香蕉97碰碰碰视频在线观看 | 91在线看片 | 国产精品理论片在线播放 | 97在线观看免费观看 | 国产色a在线观看 | 国产精品日韩 | 9在线观看免费高清完整版在线观看明 | 最近乱久中文字幕 | 国产免费xvideos视频入口 | 伊人婷婷综合 | 亚洲一区二区精品在线 | 在线看岛国av| 国产精品成人国产乱一区 | 中文字幕免费看 | 亚洲午夜激情网 | 五月天六月丁香 | 在线观看福利网站 | 成人av在线电影 | 久久精品国产一区 | 一级黄色在线视频 | 午夜成人免费影院 | 国产成人免费av电影 | 国产人成在线视频 | av在线电影网站 | 亚洲每日更新 | 国产人成看黄久久久久久久久 | 91在线精品一区二区 | 色999视频 | 亚洲精品欧洲精品 | 久艹在线播放 | a色视频 | 久久九九久久 | 夜夜夜夜猛噜噜噜噜噜初音未来 | 最近中文字幕免费 | 久久不见久久见免费影院 | 91亚洲精品乱码久久久久久蜜桃 | 婷婷激情站 | 91一区啪爱嗯打偷拍欧美 | 日本资源中文字幕在线 | 久久久免费播放 | av网站在线免费观看 | 国产视频二区三区 | 婷婷综合久久 | 国产一区二区日本 | 国产一区免费在线观看 | 91热视频| 久久国产网站 | 五月天婷亚洲天综合网精品偷 | 午夜av不卡 | 国产一级黄色av | 久av在线 | 人人草人 | 亚洲成人网av | 四虎影视成人永久免费观看亚洲欧美 | 国产日产精品久久久久快鸭 | 69xxxx欧美| 91在线看免费 | 久久免费毛片 | 深爱激情亚洲 | 国产精品欧美日韩在线观看 | 色婷婷福利 | 欧美久久久久久久久久久 | 中文字幕资源网 | 一区二区三区在线视频观看58 | 免费福利在线视频 | 日本中文在线播放 | 精品亚洲网 | 亚在线播放中文视频 | 97成人精品 | 狠狠色免费 | 99在线视频播放 | 夜夜视频资源 | 又黄又爽又湿又无遮挡的在线视频 | 久草在线视频在线观看 | 久久国产区 | 伊人婷婷色 | 久久综合狠狠综合久久激情 | 手机版av在线 | 91精品天码美女少妇 | 国产精品网址在线观看 | 亚洲精品乱码久久久久久蜜桃动漫 | www黄色大片 | www.亚洲视频 | 最近高清中文字幕在线国语5 | 日韩美一区二区三区 | 人人盈棋牌 | 国产麻豆电影在线观看 | 99久热在线精品 | 在线视频 亚洲 | 国产一级视频在线免费观看 | 国产手机视频在线播放 | 超级碰碰碰视频 | 天天射天天干天天插 | 亚洲国产精品99久久久久久久久 | 探花在线观看 | 国产69久久久 | 18久久久久| 国产精品6999成人免费视频 | 丰满少妇高潮在线观看 | 2024av| 热久久国产精品 | 国产精品一级在线 | 五月亚洲综合 | 日日夜夜亚洲 | 久久久免费| 在线观看av中文字幕 | www.香蕉视频 | 日韩欧美视频免费在线观看 | 日本在线精品视频 | 亚洲国产中文在线 | 免费观看www小视频的软件 | 久久99亚洲精品 | 日韩在线一区二区免费 | 欧美日韩一区二区免费在线观看 | 成人免费观看a | 日本中文字幕高清 | 91色偷偷 | 国产精品久久久免费 | 日韩成人高清在线 | 日韩影片在线观看 | av 一区二区三区 | 日韩欧美一区二区三区黑寡妇 | 国产日韩精品一区二区 | 日韩精品视频免费专区在线播放 | 久草视频看看 | 亚洲欧洲精品视频 | 在线免费视频a | 一区二区三区在线视频111 | 亚洲激情 在线 | 国产精品视频在线看 | 国产成人一区二区三区影院在线 | 草久在线视频 | 久久免费视频这里只有精品 | 99色资源 | 91视频在线免费看 | 天天爽天天摸 | 四虎免费在线观看视频 | 日日麻批40分钟视频免费观看 | 日本资源中文字幕在线 | 久久免费美女视频 | 欧美日韩国产在线观看 | 国产手机视频在线观看 | 成人av网站在线 | www.色综合.com| 日韩精品一区二区不卡 | 一区二区三区在线免费观看视频 | 正在播放一区 | 色综合久 | 日韩毛片一区 | 成人免费在线播放视频 | av在线电影播放 | 日韩精品一区二区在线视频 | 最近高清中文在线字幕在线观看 | 91视频 - 88av | 在线观看黄色大片 | 亚洲精品系列 | 亚洲日本国产 | 黄污在线观看 | 五月婷婷综 | 成人在线视频网 | 午夜成人免费电影 | 97视频在线观看网址 | 中文字幕乱码亚洲精品一区 | 精品色999| 久久一线| 伊人射| 亚洲粉嫩av | 国产精品初高中精品久久 | 国产精品一区二区三区免费看 | 中文字幕国产一区二区 | 婷婷成人亚洲综合国产xv88 | 欧美精品一区二区免费 | 久久久夜色| 999精品| 成年人免费观看在线视频 | www.久久视频 | 日本在线观看一区 | 午夜久久福利视频 | 精品久久91 | 999视频在线播放 | 五月婷婷黄色网 | 91传媒激情理伦片 | 人人草在线观看 | 精品字幕 | 一本一本久久a久久精品综合小说 | 日韩影视精品 | 免费视频区| 久久视频在线免费观看 | 在线观看视频免费播放 | 久久99精品久久久久久清纯直播 | 黄色av成人在线 | 91桃色免费观看 | 五月婷婷久 | 蜜桃视频在线观看一区 | 精品视频中文字幕 | www.一区二区三区 | www最近高清中文国语在线观看 | 在线观看免费版高清版 | 久久韩国免费视频 | 欧美黑吊大战白妞欧美 | 狠狠狠色丁香婷婷综合激情 | 麻豆视频免费版 | 91网在线观看 | 久久草网站 | 日韩亚洲欧美中文字幕 | 日本中文在线播放 | 成 人 黄 色 片 在线播放 | 国产精品第 | 伊人影院99 | 超碰在线人人艹 | 五月婷婷激情网 | 欧美在线一| 深爱激情综合网 | 国产精品久久电影网 | 草莓视频在线观看免费观看 | 五月婷婷黄色网 | 99视频精品在线 | 美女国产免费 | 天天搞夜夜骑 | a精品视频 | 一区二区高清在线 | 免费福利视频导航 | 日韩高清在线一区二区三区 | 日韩av电影免费观看 | 日韩一区二区三区免费电影 | 色射色| 成年人在线播放视频 | www.天天色.com | 国产99久久久国产精品 | 美女禁18| 黄色免费av | 日韩av成人在线 | 蜜臀久久99精品久久久酒店新书 | 黄色成人av| 国产精品第二页 | 精品一区三区 | 亚洲午夜精品一区 | 四虎影视成人永久免费观看亚洲欧美 | av丁香花 | 天天摸天天干天天操天天射 | 欧美日韩精品国产 | 五月天激情综合 | 国产精品福利久久久 | 午夜丁香网 | 国产精品入口麻豆www | 亚洲免费精品视频 | 免费国产在线精品 | 国产一区二区三区在线 | 婷婷激情网站 | 99视频国产精品 | 成人在线视频观看 | 国产 日韩 欧美 自拍 | 日日爽天天 | 五月婷婷在线观看 | 五月天色丁香 | 在线观看视频黄 | 日韩欧美成人网 | 手机成人av | 五月天伊人网 | 久久国产经典 | 国产一级在线 | 久久福利| av蜜桃在线 | 国产日韩欧美中文 | 亚洲 成人 一区 | 国产精品视频久久 | 欧美91精品久久久久国产性生爱 | 韩日av一区二区 | 精一区二区| 国产精品视频免费观看 | 婷婷丁香激情五月 | 96视频免费在线观看 | 狠狠夜夜 | 黄色成人免费电影 |