久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運營的一線實戰(zhàn)洞察。

STM32實戰(zhàn):SPI從機主動發(fā)送數(shù)據(jù)的3種實現(xiàn)方案

STM32實戰(zhàn):SPI從機主動發(fā)送數(shù)據(jù)的3種實現(xiàn)方案 做嵌入式這些年SPI 算是我用得最多的接口之一。前段時間有個項目兩個 STM32 要高速交換數(shù)據(jù)從機采集完一批數(shù)據(jù)后必須“立刻”發(fā)給主機。需求一提出來很多人第一反應(yīng)是SPI 從機怎么主動發(fā)數(shù)據(jù)SPI 主機才能提供時鐘從機連時鐘都沒有怎么主動這句話對但也不全對。SPI 從機確實不能憑空發(fā)起傳輸?shù)梢酝ㄟ^別的辦法“通知”主機來讀數(shù)據(jù)。這篇文章我就拿 STM32 為例分享從機主動發(fā)送數(shù)據(jù)的 3 種實現(xiàn)方式方案一是 GPIO 請求線加中斷方案二是主機輪詢方案三是 DMA 加乒乓緩沖各有優(yōu)缺點代碼也都給出來。1. 先搞清楚SPI從機憑什么“主動”1.1 SPI主從機制的底層邏輯SPI 之所以叫同步串行接口關(guān)鍵在于“同步”這兩個字。通信時誰提供 SCK 時鐘誰就是主機。主機控制 CS 片選信號決定跟哪個從機通信主機也決定什么時候開始傳輸、傳多少字節(jié)。從機的角色是被動的它只能檢測 CS 是否拉低、SCK 有沒有時鐘過來然后在時鐘的驅(qū)動下把數(shù)據(jù)從移位寄存器里送出去或者把總線上的數(shù)據(jù)收進來。所以從機“主動發(fā)送數(shù)據(jù)”這句話嚴格來說在 SPI 協(xié)議層面是不成立的。SCK 是主機的專屬資源從機沒有能力拉出 SCK 波形自然也就沒法啟動一次完整傳輸。我們要做的是在應(yīng)用層解決“從機有數(shù)據(jù)要發(fā)給主機”這個需求本質(zhì)思路都指向一句話讓從機通過某種方式告訴主機“我這有數(shù)據(jù)了你趕緊來讀”然后由主機發(fā)起 SPI 傳輸。這篇文章講的三種方式全是在這句話的基礎(chǔ)上展開的。1.2 三種思路的出發(fā)點第一種方式最直接從機專門拉一根 GPIO 線接到主機的 EXTI 中斷腳。從機有數(shù)據(jù)要發(fā)時先把 SPI 發(fā)送寄存器準備好再把這根請求線拉高主機收到中斷后就知道從機在等自己讀數(shù)據(jù)于是拉低 CS、啟動 SPI 接收。第二種方式省掉這根請求線主機按照固定周期主動發(fā)一個“讀命令”給從機從機收到命令后回傳數(shù)據(jù)。這種方式從機永遠不會主動開口但它實現(xiàn)了“從機數(shù)據(jù)能被及時拿走”的效果。代價是主機必須一直輪詢實時性和總線利用率都一般。第三種方式是把第一種方式的請求線和 DMA 結(jié)合適合數(shù)據(jù)量大、要求 CPU 占用低的場景。從機采集完數(shù)據(jù)后先啟動 SPI 的 DMA 發(fā)送然后拉高請求線主機在中斷里只用啟動 DMA 接收剩下的事全部交給 DMA 搬運。數(shù)據(jù)吞吐高而且不需要 CPU 一字節(jié)一字節(jié)地去處理。三種方式并不沖突實際項目里甚至可以組合使用。下面我分別把硬件連接、CubeMX 配置思路和 STM32 HAL 庫代碼拆開講。2. 方式一請求線EXTI中斷最快最直觀2.1 硬件連接與CubeMX配置思路方式一需要額外一根 GPIO 線我習慣叫它 REQ 線。連接是這樣的從機某個 GPIO 配置成推挽輸出接到主機的另一個 GPIO 輸入腳主機這個 GPIO 配置成 EXTI 外部中斷上升沿觸發(fā)。其他四根線照舊SCK、MOSI、MISO、CS 都接好主機和從機共地。CubeMX 里主機的 SPI 配置為 Full-Duplex Master從機配置為 Full-Duplex Slave。傳輸模式建議先用 Mode 0也就是 CPOL0、CPHA0這樣不容易出錯。主機 CS 引腳用普通 GPIO 輸出即可我習慣叫 CS_GPIO_Port / CS_Pin。從機的 NSS 如果不想用硬件控制可以把從機 SPI 的 NSS 設(shè)為 Software然后在初始化后把 SSI 置 1讓從機始終處于選中狀態(tài)真正的外部 CS 線就不參與 SPI 外設(shè)的使能判斷了。如果從機使用硬件 NSS則需要確保主機 CS 拉低時從機能檢測到片選有效時序要求更高新手階段容易被 NSS 的電平搞得一頭霧水所以軟件 NSS 更穩(wěn)。從機的 REQ 引腳在 CubeMX 里配成 GPIO_Output初始狀態(tài)輸出低電平主機的 REQ 引腳在 GPIO 配置里選擇 External Interrupt Mode with Rising edge trigger使能 EXTI 中斷。這里要注意主機的 GPIO 模式如果支持內(nèi)部上拉/下拉最好根據(jù)實際情況選擇是否啟用。REQ 線一般沒有高速翻轉(zhuǎn)要求普通推挽輸出就夠了。2.2 主機端代碼實現(xiàn)主機端的核心邏輯是在 EXTI 回調(diào)函數(shù)里只做一個標志位置位真正耗時的 SPI 接收放到主循環(huán)里處理不要在中斷服務(wù)函數(shù)里直接跑阻塞式 HAL_SPI_Receive否則主機整個中斷會被拉得很長其他實時任務(wù)可能被餓死。/* main.c 全局變量 */ volatile uint8_t g_slave_req 0; uint8_t g_rx_buf[32]; /* EXTI 回調(diào)REQ 引腳上升沿觸發(fā) */ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if (GPIO_Pin REQ_Pin) { g_slave_req 1; } } /* 主循環(huán) */ while (1) { if (g_slave_req) { g_slave_req 0; /* 拉低片選通知從機開始傳輸 */ HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_RESET); /* 主機提供時鐘接收從機數(shù)據(jù) */ HAL_SPI_Receive(hspi1, g_rx_buf, sizeof(g_rx_buf), 100); /* 拉高片選結(jié)束本次傳輸 */ HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET); ProcessData(g_rx_buf, sizeof(g_rx_buf)); } }這里有一個關(guān)鍵點主機的 HAL_SPI_Receive 在讀數(shù)據(jù)的同時SPI 硬件也會把數(shù)據(jù)線上的數(shù)據(jù)移位進來但根據(jù) SPI 全雙工特性主機發(fā)送的字節(jié)是 0x00 或 0xFF具體由 HAL 庫的清零處理決定。所以從機側(cè)只要提前把數(shù)據(jù)放進發(fā)送寄存器主機這邊就能完整收到。2.3 從機端代碼實現(xiàn)從機端要做的事就是應(yīng)用層準備好了數(shù)據(jù)后先把數(shù)據(jù)放進 SPI 發(fā)送通道再拉高 REQ 線通知主機。為什么要先放數(shù)據(jù)再拉高 REQ因為主機接收到中斷后馬上就會拉低 CS 并啟動時鐘如果從機這時候才開始填 SPI 數(shù)據(jù)寄存器第一個字節(jié)大概率來不及主機收到的第一個字節(jié)就是錯的。/* main.c 從機側(cè) */ uint8_t g_tx_buf[32]; volatile uint8_t g_tx_busy 0; void Slave_SendData(uint8_t *data, uint16_t len) { while (g_tx_busy); // 等待上一次發(fā)送完成 memcpy(g_tx_buf, data, len); /* 先啟動中斷發(fā)送讓第一個字節(jié)預(yù)裝載到 SPI 數(shù)據(jù)寄存器 */ HAL_SPI_Transmit_IT(hspi1, g_tx_buf, len); g_tx_busy 1; /* 再通知主機過來讀 */ HAL_GPIO_WritePin(REQ_GPIO_Port, REQ_Pin, GPIO_PIN_SET); } /* 從機發(fā)送完成回調(diào) */ void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi) { if (hspi hspi1) { /* 主機已經(jīng)讀完撤下請求線允許下一次請求 */ HAL_GPIO_WritePin(REQ_GPIO_Port, REQ_Pin, GPIO_PIN_RESET); g_tx_busy 0; } }從機調(diào)用 HAL_SPI_Transmit_IT 的時候CS 可能還是高電平SCK 也沒有時鐘但這不是問題。SPI 外設(shè)使能后數(shù)據(jù)寄存器是可寫的HAL_SPI_Transmit_IT 會把第一字節(jié)寫到數(shù)據(jù)寄存器里然后等 TXE 事件。等到主機拉低 CS、開始產(chǎn)生 SCK 時鐘時第一字節(jié)被移出去TXE 置位中斷再填充第二字節(jié)。所以“先啟動發(fā)送再通知主機”這個順序絕對不能反。2.4 方式一的關(guān)鍵細節(jié)第一個細節(jié)是請求線觸發(fā)方式。我在代碼里用的是上升沿觸發(fā)從機拉高 REQ 請求主機收到上升沿中斷。主機的判斷要帶標志位去清不要在主循環(huán)和 EXTI 回調(diào)之間出現(xiàn)競態(tài)。如果同時來了多個請求可以給標志位加計數(shù)但如果只需要“有數(shù)據(jù)就讀”一個標志位就夠了。第二個細節(jié)是 CS 的時序。對從機來說主機 CS 拉低后從機 SPI 外設(shè)才真正進入被選中狀態(tài)。如果從機用的是硬件 NSS那么 CS 線必須先于 SCK 拉低且持續(xù)到整個幀結(jié)束如果從機用軟件 NSS則外部 CS 不直接控制 SPI 外設(shè)但仍建議用 GPIO 模擬 CS 來保證從機應(yīng)用層能知道當前是否被選中這樣在調(diào)試時你能清楚看見時序。第三個細節(jié)是中斷優(yōu)先級。主機 EXTI 中斷不要設(shè)置成最高優(yōu)先級因為中斷里只置標志位實際 SPI 接收在主循環(huán)里所以優(yōu)先級比系統(tǒng)節(jié)拍低一點即可。從機 SPI 發(fā)送中斷的優(yōu)先級則要看實時性要求數(shù)據(jù)量大時建議把 SPI 中斷優(yōu)先級調(diào)高避免 SCK 時鐘太快導(dǎo)致 TXE 中斷沒來得及填充下一字節(jié)從而出現(xiàn)丟數(shù)據(jù)。3. 方式二主機輪詢命令應(yīng)答省一根請求線3.1 兩階段讀命令協(xié)議設(shè)計方式二適合不想多拉線的場景主機只要定時發(fā)命令從機在命令的驅(qū)動下返回數(shù)據(jù)。很多人寫到這里會忽略一個問題SPI 是全雙工通信主機發(fā)命令字節(jié)的同時從機的 MISO 線上其實也在輸出數(shù)據(jù)。從機在收到命令之后才準備數(shù)據(jù)那就晚了因為這個字節(jié)已經(jīng)隨著時鐘移出去了。所以需要把一次“讀取操作”拆成兩個階段。第一階段主機發(fā)送一字節(jié)命令從機接收命令的同時MISO 上送出的是上一次預(yù)留的應(yīng)答字節(jié)或者占位字節(jié)這一階段主機收到的數(shù)據(jù)一般丟棄。第二階段主機再發(fā)送一字節(jié)啞數(shù)據(jù)從機在收到第一階段的命令后已經(jīng)把真正的數(shù)據(jù)放到 SPI 發(fā)送數(shù)據(jù)寄存器里了這一次時鐘會把數(shù)據(jù)完整送出主機收到的就是有效數(shù)據(jù)。計算一下開銷每次讀取有效數(shù)據(jù) 1 字節(jié)實際總線傳輸 2 字節(jié)。如果主機輪詢周期是 1ms那么當前這包數(shù)據(jù)的最大延遲大約是 2ms平均延遲 1ms 左右。數(shù)據(jù)量小、實時性要求不高時這種方式很實用。3.2 主機輪詢代碼主機端比較簡單用一個定時器或者直接在主循環(huán)里做周期輪詢。我建議用定時器的回調(diào)置一個標志位主循環(huán)里處理避免在定時器中斷里阻塞太久。每次讀完再啟動下一次。/* main.c 主機 */ uint8_t cmd CMD_READ_DATA; uint8_t dummy 0; uint8_t rx_dummy; uint8_t rx_data; void TimerPeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim htim2) { g_poll_flag 1; } } while (1) { if (g_poll_flag) { g_poll_flag 0; /* CS 拉低 */ HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_RESET); /* 階段 1發(fā)送命令收到的是從機的占位數(shù)據(jù) */ HAL_SPI_TransmitReceive(hspi1, cmd, rx_dummy, 1, 10); /* 階段 2發(fā)送啞字節(jié)同時讀取從機的有效數(shù)據(jù) */ HAL_SPI_TransmitReceive(hspi1, dummy, rx_data, 1, 10); /* CS 拉高 */ HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET); ProcessSensorData(rx_data); } }如果主機需要一次讀取多個字節(jié)可以從機側(cè)在命令階段之后連續(xù)輸出多個有效字節(jié)。比如讀取 16 字節(jié)溫度數(shù)據(jù)主機第一階段發(fā)命令第二階段連續(xù)發(fā) 16 個啞字節(jié)從機狀態(tài)機里根據(jù)命令把 16 字節(jié)連續(xù)發(fā)送出來。3.3 從機狀態(tài)機代碼從機側(cè)我推薦用 HAL 庫的 HAL_SPI_TransmitReceive_IT讓狀態(tài)機始終處于接收狀態(tài)。初始化時先啟動一次“命令接收”傳輸收到命令后在回調(diào)里切換到“數(shù)據(jù)發(fā)送”狀態(tài)發(fā)送完成后再切換回“命令接收”狀態(tài)。/* 從機全局變量 */ uint8_t rx_byte; uint8_t tx_byte; uint8_t tx_dummy 0xFF; volatile uint8_t spi_state STATE_WAIT_CMD; // 0等命令1發(fā)數(shù)據(jù) /* 初始化時啟動命令接收 */ void Slave_SPI_Init(void) { spi_state STATE_WAIT_CMD; HAL_SPI_TransmitReceive_IT(hspi1, tx_dummy, rx_byte, 1); } /* 發(fā)送接收完成回調(diào) */ void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi) { if (hspi ! hspi1) return; if (spi_state STATE_WAIT_CMD) { if (rx_byte CMD_READ_DATA) { tx_byte ReadSensorData(); spi_state STATE_SEND_DATA; } /* 不管是不是有效命令都回到等待命令狀態(tài) 但若收到有效命令下一階段就會發(fā)送有效數(shù)據(jù) */ if (spi_state STATE_SEND_DATA) { /* 階段 2主機發(fā)送啞字節(jié)時從機發(fā)送 tx_byte */ HAL_SPI_TransmitReceive_IT(hspi1, tx_byte, rx_byte, 1); } else { HAL_SPI_TransmitReceive_IT(hspi1, tx_dummy, rx_byte, 1); } } else if (spi_state STATE_SEND_DATA) { /* 數(shù)據(jù)發(fā)送完成重新等命令 */ spi_state STATE_WAIT_CMD; HAL_SPI_TransmitReceive_IT(hspi1, tx_dummy, rx_byte, 1); } }這個狀態(tài)機代碼的精髓在于從機永遠在等主機發(fā)起的 SPI 傳輸永遠處于“接收命令或發(fā)送數(shù)據(jù)”的循環(huán)中。主機不來時鐘這個狀態(tài)機就一直掛著主機時鐘來了從機的數(shù)據(jù)就會自動被讀走。這種方式雖然叫“從機主動發(fā)送”但實際協(xié)議層面是主機一直在主動讀從機的主動性體現(xiàn)在“有數(shù)據(jù)時能及時通過命令應(yīng)答帶出去”。3.4 延遲與總線效率分析方式二最怕的是主機輪詢周期和數(shù)據(jù)到達時機不對齊。比如傳感器每 10ms 更新一次主機若 5ms 輪詢一次那讀取到的數(shù)據(jù)平均會有 2.5ms 左右的陳舊延遲。主機若在數(shù)據(jù)更新前讀拿到的就是上一周期的舊值如果業(yè)務(wù)要求拿到“最新值”可以給協(xié)議加一個狀態(tài)字段從機在應(yīng)答數(shù)據(jù)里帶一個“數(shù)據(jù)更新序號”或者“數(shù)據(jù)有效標志”主機讀到舊值時可以選擇連續(xù)重讀或丟棄??偩€效率方面方式二每一字節(jié)有效數(shù)據(jù)都要消耗兩個時鐘字節(jié)效率是 50%。如果主機能接受問題不大如果對總線效率敏感建議用方式一或方式三。另外主機輪詢會持續(xù)產(chǎn)生 SPI 時鐘對一些低功耗場景不友好因為主機不能一直跑否則系統(tǒng)功耗壓不下去。4. 方式三DMA批量搬運乒乓緩沖高性能大頭兵4.1 DMA請求線的配合方式方式三是方式一的升級版思路仍然是“從機請求主機讀取”但把“逐字節(jié)中斷搬運”替換成“DMA 搬運”。使用 DMA 的好處很明顯主機收到 REQ 中斷后只需拉低 CS、啟動一次 HAL_SPI_Receive_DMACPU 就可以去做別的事了DMA 會在 SPI 時鐘驅(qū)動下把數(shù)據(jù)自動搬到內(nèi)存。從機這邊也一樣數(shù)據(jù)在 DMA 的驅(qū)動下自動從內(nèi)存搬到 SPI 發(fā)送數(shù)據(jù)寄存器不需要內(nèi)核逐字節(jié)處理。這里有一個很重要的硬性約束從機必須先啟動 DMA 發(fā)送讓 DMA 把第一字節(jié)送到 SPI 數(shù)據(jù)寄存器再拉高 REQ 線。主機收到 REQ 后立即拉低 CS 并啟動讀取此時 SPI 時鐘一產(chǎn)生第一字節(jié)就能直接移出。如果順序顛倒從機先拉高 REQ主機隨后馬上產(chǎn)生時鐘而 DMA 還沒來得及把第一字節(jié)寫入 SPI 數(shù)據(jù)寄存器第一個字節(jié)就會變成上一個殘留數(shù)據(jù)或者干脆是空數(shù)據(jù)主機接收到的第一字節(jié)就會錯位。4.2 乒乓緩沖為了什么DMA 搬運數(shù)據(jù)是直接從內(nèi)存緩沖區(qū)搬到 SPI 外設(shè)不需要 CPU 參與。這意味著 CPU 可以在 DMA 正在發(fā)送緩沖區(qū) A 的時候去往緩沖區(qū) B 填充新數(shù)據(jù)等下一輪發(fā)送輪到緩沖區(qū) B 時CPU 又可以去填充緩沖區(qū) A。這叫乒乓緩沖。為什么一定要乒乓因為如果你只有一個緩沖區(qū)CPU 在一輪采集后填充完數(shù)據(jù)啟動 DMA 發(fā)送接著 CPU 又想在新一輪數(shù)據(jù)到達時填充同一個緩沖區(qū)就會導(dǎo)致 DMA 還沒發(fā)完的數(shù)據(jù)被新數(shù)據(jù)覆蓋主機讀到的數(shù)據(jù)前后撕裂或者出現(xiàn)半個新幀、半個舊幀。乒乓緩沖把“填充數(shù)據(jù)”和“發(fā)送數(shù)據(jù)”在時間上錯開只要 CPU 填充緩沖區(qū) B 的速度比 DMA 發(fā)送緩沖區(qū) A 的速度快就不會互相干擾。乒乓緩沖的代碼結(jié)構(gòu)簡單說就是兩個數(shù)組一個正在被 DMA 讀另一個正在被 CPU 填。發(fā)送完成后交換角色。我這里給一個單緩沖的簡化版本重點是把 DMA 和 REQ 請求怎么配合講清楚真正做乒乓時把下面代碼里的單個 buffer 換成 buffer[2]再用一個索引來切換即可。4.3 從機和主機代碼骨架從機側(cè)代碼假設(shè)傳感器采集好的數(shù)據(jù)已經(jīng)放在 g_tx_buffer 里長度為 BUF_LEN。/* 從機 */ #define BUF_LEN 256 uint8_t g_tx_buffer[BUF_LEN]; /* 應(yīng)用層數(shù)據(jù)準備好后主動發(fā)送 */ void Slave_RequestSend(uint8_t *data) { /* 拷貝數(shù)據(jù)到 DMA 發(fā)送緩沖區(qū) */ memcpy(g_tx_buffer, data, BUF_LEN); /* 等待上一次 DMA 發(fā)送完全結(jié)束 */ while (HAL_SPI_GetState(hspi1) ! HAL_SPI_STATE_READY); /* 先啟動 DMA 發(fā)送讓第一字節(jié)預(yù)裝載 */ HAL_SPI_Transmit_DMA(hspi1, g_tx_buffer, BUF_LEN); /* 再通知主機來讀 */ HAL_GPIO_WritePin(REQ_GPIO_Port, REQ_Pin, GPIO_PIN_SET); } /* 從機 DMA 發(fā)送完成回調(diào) */ void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi) { if (hspi hspi1) { /* 主機讀完了撤下請求線 */ HAL_GPIO_WritePin(REQ_GPIO_Port, REQ_Pin, GPIO_PIN_RESET); } }主機側(cè)代碼收到 REQ 中斷后啟動 DMA 接收。/* 主機全局變量 */ uint8_t g_rx_buffer[BUF_LEN]; volatile uint8_t g_slave_req 0; void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if (GPIO_Pin REQ_Pin) { g_slave_req 1; } } /* 主循環(huán) */ while (1) { if (g_slave_req) { g_slave_req 0; /* 拉低 CS從機開始輸出數(shù)據(jù) */ HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_RESET); /* 啟動 DMA 接收主機產(chǎn)生 BUF_LEN 個時鐘 */ HAL_SPI_Receive_DMA(hspi1, g_rx_buffer, BUF_LEN); } } /* DMA 接收完成回調(diào) */ void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi) { if (hspi hspi1) { /* 拉高 CS結(jié)束本次傳輸 */ HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET); /* 處理數(shù)據(jù) */ ProcessData(g_rx_buffer, BUF_LEN); } }這段代碼看起來很簡單但實際項目里我會把 HAL_SPI_Receive_DMA 放到 EXTI 回調(diào)里直接啟動因為函數(shù)本身只是配置 DMA 并開啟傳輸耗時極短。主循環(huán)里置標志位再處理也是一種穩(wěn)妥做法優(yōu)先級上并沒有問題。真正要注意的是 CS 引腳和 DMA 狀態(tài)的配合如果上一次 DMA 還沒有完成下一次 REQ 就來了主機這邊必須等待或做保護否則 CS 拉低之后啟動 DMA 會出現(xiàn)并發(fā)錯誤。4.4 避免DMA傳輸踩坑DMA 的第一個坑是緩沖區(qū)長度超長時SPI 時鐘連續(xù)翻轉(zhuǎn)如果主機和從機的波特率分頻設(shè)置不一致或者主頻不同就可能導(dǎo)致采樣點偏移。STM32 的 SPI 從模式一般可以跟得上主機速率但要注意 SPI 的時鐘極性和相位必須完全一致特別是 Mode 0 和 Mode 3 這兩個模式都不難配只是千萬別一邊配 Mode 0、一邊配 Mode 3。第二個坑是 DMA 中斷和 SPI 中斷的優(yōu)先級。從機在 DMA 發(fā)送完整個緩沖區(qū)后觸發(fā)完成中斷這個中斷里要拉低 REQ不能拖太久。如果 REQ 線被長時間占用主機可能來不及在下一輪請求前釋放資源。實際上我在做高速傳輸時會把從機的 DMA 中斷優(yōu)先級設(shè)置為較高主機的 EXTI 請求線中斷優(yōu)先級設(shè)置為中等SPI 的全局中斷優(yōu)先級設(shè)置為比 EXTI 低一點保證“請求”和“發(fā)送完成”不會被 DMA 中斷的長時間處理拖延。第三個坑是首字節(jié)錯誤。前面反復(fù)強調(diào)過從機要先啟動 DMA 再拉高 REQ。但還有一個細節(jié)是 DMA 配置里 Data Width 要和 SPI 數(shù)據(jù)寬度一致。STM32 的 SPI 通常配置 8 位數(shù)據(jù)DMA 的 Peripheral Data Size 和 Memory Data Size 都應(yīng)該是 Byte。如果配成 Half Word 或者 WordDMA 搬運的數(shù)據(jù)寬度會和 SPI 外設(shè)不匹配收發(fā)內(nèi)容直接亂掉。第四個坑是 CS 線。數(shù)據(jù)量大時CS 全程拉低直到 DMA 結(jié)束這一點協(xié)議上沒有爭議。但 CS 拉高前要確保主機已經(jīng)不再產(chǎn)生 SCK 時鐘。有些 HAL 庫版本在 SPI 完成 DMA 后會自動處理但 CS 是普通 GPIO不會自動拉高所以必須在 DMA 完成回調(diào)里手動操作。從機側(cè)如果使用硬件 NSS當 CS 拉高時從機 SPI 外設(shè)會強制停止當前傳輸導(dǎo)致 DMA 發(fā)送了一半被中止這個現(xiàn)象在調(diào)試時非常隱蔽。所以我個人強烈建議從機用軟件 NSS外部 CS 只做電平參考SPI 外設(shè)的選中狀態(tài)靠 SSI 位保持這樣即使 CS 提前拉高從機 DMA 也不會突然中斷。5. 三種方式怎么選一張表講清楚5.1 核心維度對比我把三種實現(xiàn)方式的關(guān)鍵參數(shù)放在一起直接對照著看更清楚。對比維度方式一請求線EXTI方式二主機輪詢方式三DMA請求線額外硬件引腳需要 1 根 REQ 線不需要額外引腳需要 1 根 REQ 線實時性高從機一拉線主機馬上響應(yīng)中取決于輪詢周期高請求后 DMA 批量讀取從機數(shù)據(jù)量小到中幾十字節(jié)合適小以單字節(jié)或短數(shù)據(jù)為主大幾百字節(jié)到幾 KB 最合適CPU 占用主機接收時消耗 CPU主機持續(xù)輪詢占用高主機和從機 CPU 占用都很低總線效率高一次傳輸全是有用數(shù)據(jù)低需要命令啞字節(jié)兩階段高批量數(shù)據(jù)一次傳完實現(xiàn)復(fù)雜度簡單簡單但協(xié)議要設(shè)計好較復(fù)雜需要處理 DMA 和乒乓典型場景按鍵、告警、小包數(shù)據(jù)傳感器周期上報、狀態(tài)查詢音頻、波形、高速數(shù)據(jù)采集5.2 實際項目選型經(jīng)驗如果從機只是偶發(fā)地報一下狀態(tài)比如按鍵按下、溫度越限、設(shè)備故障我一般選方式一。請求線加中斷代碼量小實時性高主機不需要一直跑輪詢功耗也低。如果是周期性的傳感器數(shù)據(jù)比如溫度、濕度、轉(zhuǎn)速這些數(shù)據(jù)本身量不大而且業(yè)務(wù)上允許幾百微秒到幾毫秒的延遲方式二最合適。它省了請求線主機按固定周期讀一次從機端只需要維護一個很簡單的狀態(tài)機。缺點就是主機輪詢必須一直跑不能停太久如果主機本身還在做其他實時任務(wù)要考慮輪詢周期是否影響整體調(diào)度。如果是做雙機間的高速數(shù)據(jù)交換比如從機采集 ADC 波形、音頻數(shù)據(jù)或者 IMU 九軸數(shù)據(jù)用方式三。請求線負責通知DMA 負責搬運乒乓緩沖負責把采集和發(fā)送流水線化。這種方式開發(fā)周期長一點但一旦調(diào)通效果非常穩(wěn)定主機側(cè)的 CPU 幾乎不用管數(shù)據(jù)搬運留給應(yīng)用層做算法和顯示。6. 常見問題與排查實錄6.1 一上電就是亂碼亂碼最常見的原因是 SPI 模式不一致。主機配置成 Mode 0從機配置成 Mode 3兩邊采樣點對不上數(shù)據(jù)就會錯位。碰到亂碼先把兩邊都改成 Mode 0CPOL0CPHA0然后檢查波特率分頻。STM32 主機 SPI 時鐘不能超過從機允許的極限從機 F103 一般建議主機 SPI 時鐘在 9 MHz 以下保守一點用 4.5 MHz 或 2.25 MHz 調(diào)通再說。另一個容易忽略的是 MISO 和 MOSI 接反。STM32 主機的 MISO 必須接從機的 MISO主機的 MOSI 必須接從機的 MOSI。很多杜邦線項目里顏色一多就容易把兩根數(shù)據(jù)線對調(diào)結(jié)果主機發(fā)命令從機收不到從機發(fā)數(shù)據(jù)主機也收不到。6.2 主機收不到從機數(shù)據(jù)先量一下 REQ 線有沒有正常拉高。如果 REQ 線一直是低電平說明從機應(yīng)用層可能沒走到發(fā)送函數(shù)或者發(fā)送函數(shù)卡在 while 等待里。再量 CS 線有沒有在主機收到請求后拉低。CS 線拉低但 MISO 沒有數(shù)據(jù)大概率是從機還沒準備好數(shù)據(jù)就通知了主機或者從機 SPI 沒有正確使能。還要檢查從機的 NSS 配置。如果從機用的硬件 NSS而主機的 CS 線和從機的 NSS 引腳沒接到一起或者電平邏輯反了從機 SPI 外設(shè)根本沒被選中自然發(fā)不出數(shù)據(jù)。從機用軟件 NSS 時要在 SPI 初始化后把 SSI 位置 1否則從機以為自己沒被選中也會罷工。6.3 請求線誤觸發(fā)或丟失請求線誤觸發(fā)大多是因為 REQ 線上有毛刺。從機 REQ 是普通 GPIO 推挽輸出正常不會有毛刺但如果主機 REQ 輸入引腳沒有使能內(nèi)部上拉懸空時很容易受干擾。建議主機 REQ 引腳配置上拉輸入并且在 EXTI 回調(diào)里加一個軟件去抖比如連續(xù)檢測兩次電平都滿足條件再置標志位。請求線丟失則要檢查從機拉高 REQ 之后是不是馬上又被自己的發(fā)送完成回調(diào)拉低了。比如主機響應(yīng)得很快CS 拉低、SCK 開始、DMA/中斷發(fā)送完成后從機立刻拉低 REQ。如果這個拉低發(fā)生在主機 EXTI 上升沿還沒被正確鎖存之前某些單片機可能會丟中斷。解決辦法是 REQ 拉低的時機不要放在從機發(fā)送完成回調(diào)里而是放到主機讀取完成后由主機主動拉低或者從機發(fā)送完成后再等一小段時間再拉低。實際項目里我習慣用從機發(fā)送完成回調(diào)拉低 REQ只要主機 EXTI 是上升沿觸發(fā)且中斷正?;径寄苕i住但如果性能測試發(fā)現(xiàn)偶發(fā)丟請求可以考慮把 REQ 改成電平觸發(fā)加標志位輪詢。6.4 DMA傳輸和中斷卡死DMA 卡死的典型現(xiàn)象是程序跑著跑著SPI 不再產(chǎn)生時鐘REQ 線一直高主機的 DMA 接收回調(diào)一直不執(zhí)行。原因一般有兩個。第一個是主機在 DMA 接收過程中再次收到 REQ 中斷主循環(huán)又把 CS 拉低、再次啟動 DMA導(dǎo)致上一次 DMA 還沒完成就被新的 DMA 請求覆蓋HAL 庫內(nèi)部狀態(tài)錯亂。解決辦法是加一個 g_dma_busy 標志DMA 接收完成回調(diào)里清除下次請求到來時如果 busy 還在就直接忽略或者排隊處理。第二個是從機 DMA 發(fā)送緩沖區(qū)在發(fā)送過程中被應(yīng)用層覆蓋了。我在做乒乓緩沖時遇到過從機正在 DMA 發(fā)送 buffer A采集任務(wù)卻把新數(shù)據(jù)寫到 buffer A導(dǎo)致發(fā)送數(shù)據(jù)被新數(shù)據(jù)污染。加乒乓緩沖后這個問題就消失了核心原則是DMA 正在用的緩沖區(qū)應(yīng)用層絕對不能寫。6.5 FreeRTOS下SPI中斷優(yōu)先級怎么設(shè)置如果項目里用了 FreeRTOSSPI 中斷和 EXTI 中斷的優(yōu)先級不能隨便給。HAL 庫在中斷回調(diào)里可能會調(diào)用portYIELD_FROM_ISR這樣的 FreeRTOS 宏如果中斷優(yōu)先級比configMAX_SYSCALL_INTERRUPT_PRIORITY更高FreeRTOS 就不允許在該中斷里調(diào)用任何與系統(tǒng)相關(guān)的 API否則會觸發(fā)斷言或直接卡死。我的習慣是把 STM32 的中斷優(yōu)先級分組設(shè)置為 4 位搶占優(yōu)先級然后 SPI 中斷和 EXTI 中斷的搶占優(yōu)先級都設(shè)置在 5~7 之間不要設(shè)到 0~3。這樣 FreeRTOS 可以管理這些中斷而且不會影響系統(tǒng)節(jié)拍。如果業(yè)務(wù)上確實需要更高的實時性可以把 SPI 中斷優(yōu)先級設(shè)為 4但代價是不能在中斷回調(diào)里調(diào)用任何 FreeRTOS API只能通過信號量或標志位通知任務(wù)不能直接在回調(diào)里osSemaphoreRelease或osMessageQueuePut。6.6 硬件NSS與軟件NSS的選擇STM32 的 SPI 支持硬件 NSS 和軟件 NSS初學者經(jīng)常在這上面踩坑。硬件 NSS 由 SPI 外設(shè)自動控制主機模式下可以在一次傳輸開始時自動拉低 NSS傳輸結(jié)束后拉高從機模式下 NSS 引腳的外部電平會直接決定從機是否被選中??雌饋砗芊奖愕珜嶋H調(diào)試時NSS 和 SCK 的相對時序、多從機沖突、以及 DMA 傳輸過程中 CS 自動變化都會引入隱蔽問題。軟件 NSS 則是把 NSS 功能交給 GPIO 手動控制。主機側(cè) CS 引腳用普通 GPIO 拉低拉高完全由自己控制時序從機側(cè) SPI 的 NSS 配置為軟件模式然后設(shè)置 SPI 的 SSI 位為 1讓從機一直處于“邏輯選中”狀態(tài)外部 CS 線只作為應(yīng)用層判斷。這樣 SPI 外設(shè)的數(shù)據(jù)收發(fā)不會因為 CS 時序問題突然中止代碼也更好調(diào)。我個人做雙機通信更推薦軟件 NSS雖然要自己管理 CS 引腳但穩(wěn)定性會明顯好很多。7. 一點額外體會如果讓我在新項目里重新選一次偶發(fā)小數(shù)據(jù)我會選方式一周期性傳感器數(shù)據(jù)選方式二大數(shù)據(jù)量高速傳輸選方式三。實際項目里我更多是把方式一和方式三結(jié)合使用請求線負責通知DMA 負責搬運既能保證實時性又能把 CPU 從繁重的數(shù)據(jù)搬運里解放出來。SPI 的從機“主動發(fā)送”說到底只能做到通知主機來讀真正的主從關(guān)系并沒有變。選型時先想清楚數(shù)據(jù)量、延遲要求和引腳余量就不會走彎路。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
av亚欧| 六月天婷婷| 欧洲熟妇xxXx欧美老妇裸体| 99re99视频在线免费观看| 色汉综合| AV 少妇 人妻 偷拍| 9久9久9久9久视频网站| 黄色视频60分钟| 九九精品美女高溯喷水| 神马久久久久| 啊啊好多水| 久久人妻| 国产精品香蕉热久久新品| 日韩大香蕉AV影片| 亚洲色欲天天天堂色欲网女| 97免费免费视频网| 久久狠狠色噜噜狠狠狠狠97| 五月婷婷六月色| 日韩欧美麻豆 | 亚洲清纯综合| 日韩黄色一区二区三区| 久草综合视频| 综合欧美日韩在线观看| 大香蕉琪琪日本女优不卡| 亚洲无码精品AV久久久| 你操综合| 久久透逼视频| 97 视频在线| 久久婷婷电影网| 五月天婷婷色色| 校园春色美腿丝袜| 自拍偷拍亚洲熟女妇人精品| 欧美黄色图片| 久思思热视频在线观看| 美女毛片999| 日本精品第一视频在'| 欧美激情久久久久| 日本黄 R色 成 人网站| 女性91网站| 欧美日不卡| 欧综合网| 午夜情侣自拍网站| 青青青国产手线观看视频2| 一区二区三区激情在线观看| 欧美中日韩XXXX| 国产精品久久久三级无码| 玖玖资源视频一区二区三区| 色综合色综合网| 亚洲天天更新| 91中文精品日韩欧美在线 | 这里都是精品在线观看| 亚洲性猛| 国产激情久久久| 深夜激情| 亚洲色香| 夜夜草网站| 快灬快灬 一下爽蜜桃在线观看| 96AV精品| 久久久久久久亚洲Av无码| 久久人妻少妇| 日韩无码嘿咻黑热久| 狠狠色噜噜狠狠狠狠2018| 18禁久极品美女久久哦哟呀!| 懂色天天爱天天日天天射天天澡| 91九色丰满高潮| 国产精品交换一区二区| 伊人久久综合影院精品久久久| 久偷拍欧美日韩三区| 欧美日韩岛国大片在线观看| 97色碰| 天天看片麻豆| 国产亚洲色婷婷久久99精品91葵花宝典 | 中文字幕无码不卡啪啪| 粉嫩国产精品久久粉嫩| 国产92麻豆天美精品色欲5| 色网亚洲人| 香一区二区三区| av日韩在线观看电影| 欧美人妻少妇| 玖玖爱综合网| 9久综合网| 精品对白久久不卡| 国产吹潮女在线观看| 久久婷婷国产一区二区色| 日韩人妻播放| 精品人妻1区| 天天大干大香蕉| 少妇二级| 69超碰综合| 久久东京伊人一本到鬼色| 九九热国产| 色娱乐色呦呦夜夜夜夜av| 最近2019中文字幕国语免费版| 上特色A在线| 在线小说视频一区| 骚逼一区二区| 欧插网站| 天天插天天操| 免费观看的黄色的网站| 激情天天视频| 欧洲性爱无码区| 蜜臀中文无码午夜| 97超碰中文字幕| 97香蕉碰碰人妻国产欧美| 91亚洲色图| 亚洲男人的天堂在线看| 97色97好| 十八禁网站在线| 国产区性爱在线视频秋霞豆| 久久久久人妻二区精品叶可怜| 9久热这里只有精品| 九九免费影片| 骚货操死你| 久久人妻无码毛片A片麻豆| 夜夜高潮夜夜爽高清视频一| 亚洲s在线观看| 91精品久久久久久综合五月天| 中文字幕精品一区二区精| 欧美影院一区二区三区| 日本成a人v网站在线观看| 九九九九热只有精品| 丝袜狂射91| 久久久久久久久久久久久久久久9 亚洲成人妻日韩在线 | 92人人操人人| 中文字幕aⅴ在线视频| 亚洲小电影免费涩涩成人在线高清| 日韩欧美亚洲自拍偷拍| 另类天堂| 午夜舔阴达高潮视频免费看| 国产91福利小视频在线观看| 人人操人人肉久久精品| 啊啊啊啊好多水| 美女黄页网站| 美女久久久| 粉嫩AV一区二区夜夜| 久肏视频字幕| 性色aV一区二区三区噜噜| 国产精品一区在线播放| 99少妇| 东北女人高潮视频| 激情文学88| 日本操逼视频免费| av爱爱爱| 淫荡少妇免费| 亚洲AV无码成人精品久久| 最新国产亚洲精品精品国产亚洲综合 | 欧美高清色| 亚洲欧美色图| 免费av在线播放二区| 日婷婷| 成人三一级一片aaa| 日韩操逼HD| 黄在线| 8050午夜少妇无码| 五月丁香色婷婷| 亚洲欲色9532548967一区| 人人色人人射人人妻| 九九热五区| 视频在线中文字幕| 传媒在线观看一区二区三区| 久久国产成人精品国产成人亚洲| 国产第12页| 天天狠操| 欧美丰满熟妇XXXX性ppX人交| 日韩av不卡在线观看| 91校园春色长篇| 精品.99999| 九九国产热| 精品在线78| 亚洲欧美色图片| 翔田千里爆乳巨臀无码| 久久久精品视频免费观看| 九九aV| 亚洲精品一区中文字幕乱码| 97在线观看免费视频l| 五月婷婷青青草娱乐伊人| 久久高潮妇女视频| 日逼视频日本| 99无码| 黄色高清久久无码依人| 欧美一二在线| 97超碰精品| 精品视频免费在线一区| 91久久国产综合久久| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 国模无码人体一区二区三| 强奸国产在线| 国产suv精品一区二区四区999 | 国产女大学生AV| 青青伊人这里只有精品| 一起草av| 天天舔天天日天天射| 欧美综合色| 超清福利精品视频在线| 五月天婷婷综合网| 男人的天堂网免费| 人妻少妇久久中文| 涩涩涩综合| 韩日精品四区| 天天影视91看看| 波多野结衣AV无码一区| 超碰人人妻| av线电影| 777琪琪午夜免费A片| 啪啪一区| 91人妻久久久久久久久久久久久| A级在线视频| 日本色色色| 久久久久久9999| 亚洲阿v天堂在线| 无码国产精品午夜不卡(| 欧美日日夜夜| 天天噜| 婷婷精品国产欧美精品亚洲人人爽| 欧美亚洲特P| 欧美操逼熟女| 久久一本大香蕉| 久久精品国产欧美日韩亚洲欧美日韩中文久久国产一区 | 亚洲天堂日本| 自拍偷拍第26| 热天堂一区二区| 久久久久精| 怡红院久久老司机| 亚洲少妇中文字幕网址| 亚洲999综合| а√天堂资源官网在线资源| 国产999精品久久久久久| 日韩精品人妻中文字幕不卡乱码| 女人被男人桶爽视频网站| 嗯~啊~快点 死我视频| 九九九不卡| 久久久精品无码亚免费| 97玖玖超碰| 三级片网站在线播放| 色综合91好| 狠狠综合网| 激情露脸爱| 亚洲日韩一区电影| 国产91 丝袜在线播放 | 久久、1234| 天天影视综合色| 国产精品无码在线| 99国产天美| 东北女人性交| 7777奇米影视久久| 国产免费久久精品99re韩国| 人妻一二三区| yazhouzaixian| 亚洲日韩青青草色月| 丰满人妻一区二区三区蜜桃视频| 和协影院中文字幕三区| 伊色综合天堂色97| 久久9精品网站| 99综合免费视频| 欧美强奸乱能| 亚洲 中文字幕 精品| 欧美骚少妇| 四虎AV无码| 二色av| h无码动漫在线观看| 手机在线免费看的av| 青青草在线视频美女| 香蕉欧美| 金莲网址| 超硑97精品| 久久亚洲AV无码专区国产精品| 熟女露脸激情自拍视频| 久久精品国产亚洲AV高级北京| 亚洲资源网| 中文字幕,人妻,日韩| 97超碰超碰| 亚洲熟妇乱女区二区三区| 欧州一区二区三区四区| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师 | 亚洲激情天堂网| 少妇滛荡视频| 小日子操bb在线看| 国产成人精品日本亚洲语言| 10000部十八禁看电影| 国产区91柔拿会所技师| 国产91美女高潮| 欧美亚洲国产日本在线,久久精品国产| 日韩欧亚中文在线| 欧美 传媒 麻豆 日韩 偷拍| 国产美女高潮叫床视频| 欧美极品美女aaaaaa级黄片| 亚州黄站| 精品999日本| 色av中文字| se吧提供91精品国产91久久久久久 | 狠狠入| 女同性恋中文字幕| 久久‘黄片视频| 亚洲一区二区av| 中文字幕 一区二区 亚洲无码| 国产AV超爽| 玖玖玖玖精品国产剧情| 亚欧性爱ab| 大香蕉乱伦视频网| 日本精品五区| 男人天堂资源| 啊啊啊男女| 久久久久国产精品喷潮免费观看臀| 天天操人人操骚逼网站| 四虎AV在线观看| 一起草三级AV电影在线观看 | 久久97视频| 97超级欧美| 亚洲人精| 精品四五区| 天天躁日日躁AAAXX| 欧美亚洲素人制服精品| 一区| 亚洲免费97免费| 91N五十路| 大香蕉伊人色偷偷在线| 精品视频在线观看精品| 高清孕妇孕交 交| 99热99re6国产在线播放| 一及黄久一点| 黑操B| 91青青草| 99啪啪视频| 人人看欧美性爱| 91国产操逼视频| 狠狠91| 日本视频在线中文字幕| 国产无码久久高清| 女欧美一区二三区| 青青操青娱乐| 欧美在线观看综合国产| 五月丁香影院| 国产91美女高潮| 91狠狠综合久久久| 99爱在线视频| 日日日啊啊啊| 久久久18禁| 国产精品久久久久久久久久久久久久久久久久| 精品国产污一区二区三区| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 性爱1区| 色久综合| 能看的AV| 亚洲日韩少妇一道本视频| 亚洲青青草| 一本色道久久综合精品婷婷| 熟女91网站| 日本操逼视频免费| 91人妻中文| 国产午夜无码片在线观看影视 | 九九av| 久久高潮妇女视频| 无码精品人妻一区二区三区妖精| 秋霞一级视频在线观看免费| 五月色网| 成人无码在线超碰网| 综合免费无码中文| 亚洲国产精品久久久久婷婷青年| www.男人天堂| 五月天婷婷社区| 91影库| 久久久九97| 久久精品高清无码一区| 国产精品不卡av免费在线观看| 亚洲成熟国产精品美女| 亚洲男人的天堂一区二区| 色噜噜人妻丝袜AV资源| 99re久久| 91精品丝袜在线观看| 欧美内射少妇| 69视频入口| 免费观看的av| 欧成人在线| 懂色AV蜜臀无码精品APP| 99re这里只有精品3| 女同性恋中文字幕| 91精品国产91久久久久久久久久久久| 97亚洲在线| 超碰精品在线| 欧美少妇高潮视频| 国产又色又爽又舒服的三级视频| AV99热18这里只有精品| 亚洲熟女精品| 日本天堂在线播放| 亚洲男人的天堂va亚洲男人社| 亚洲精品黄码久久久久| 日韩电影在线观看网址| 97欧美色综合| 一起草三级AV电影在线观看| 亚洲日本韩国极品一区二区| 99精品九九九九九九| 亚洲精品三| 亚洲精品一区二区三区在线播放| 伊人久久亚洲中文字幕| 97欧美视频| 久久超碰久| 亚洲 欧美 第一页| 日韩乱码Av| 熟女激情综合网| 国产一级久久久| 亚洲乱伦图片视频| 999热日韩精品| 亚洲无套久久嗯嗯| 亚洲人成在线放东京热| 操穴国产| 丰满岳乱妇一区二区三区| 欧美影音在线| 五月激情在线| 二男一女成人A片| 亚洲。天堂。日本在线观看| 女优免费一区二区永久| 国产精品久久久久久亚洲色欲| 欧美 熟女 日韩| 亚洲精品xxx| 78m成人视线| 免费农村成人少妇人妻Aa一区二区视频| 久久久久久久久久va| 色屁屁影院www国产| 屌逼传媒| 国产专区第一页| 97久久国产精品女不卡| 青青草亚洲一区| www久久99| 亚洲综合91| 91热热色| 制服丝袜第二页| 久久99手机免费视频| 99九九精品| 看全色黄大色大片免费视频| 国产精品97超碰| 亚洲免费97免费| 综合网欧美在线| 99在线精品观看99| 免费日韩黄片| 久久免费9| 啊啊啊不要好爽日韩无码一区| 91人妻爽爽人人做人人澡| 91动漫操逼视频| 天天躁狠狠躁av| 你懂的在线观看区国产| 夜夜操av亚洲一区二区| 久久精品老司| 亚洲欧美激情另类色图| 欧美顶级黄片AAAAA在线免费看| 日韩天天综合| 伊人AAA| 极品肉射| 日本天天干天天操一区| 91碰碰| 人人污日韩一区二区| 天天天肏屄欧美| 五月婷婷六月色| 日本天天操| 9久超碰| 超碰性爱97| 女人妻一区| 国产精品午夜成人福利| 小草三级久久观看| 久久女婷| 丁香五月天婷婷姐| 欧美国产有色电影| 69一区二区| 婷婷激情四射| 人人玩人人添人人澡免费| 久久AV无码AV| 亚欧免费| 国产视频一区二区免费| 天天日天天干天天色| 在线一道啪| 无遮挡猛进视频免费无限观看| 中文字幕在线日亚州9| 丰满人妻-区二区三区免费| 爱做久久久久久| 97 亚洲 日韩 欧美 在线| 9久久9综合| 欧美色日| 激情小说亚洲| 强奸乱伦Av网| 国产少妇与亚洲av| 亚洲熟女一区| 加勒比海色香蕉婷婷| 国产在线视频午夜精华在| 探花熟女,姿勢到位,體驗感也到位| 亚洲色图殴美色图激情乱伦| 亚殴在线| 91精品在线播放| 欧美亚洲首页| 少妇被玩视频二三区| 国产精品乱人伊人网| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师 | 亚欧高清在线| 少妇一区二区三区在线观看| 亚洲宗合网| 五月天我淫我色av| 无码抄逼网| 麻豆天美国美国产AV| 久操99| 好涩综合| 熟女精品va中文字幕| 99热免费| 蜜臀久久99精品久久久久久成人小说| 亚洲中文字幕久久人妻| 日本不卡卡一区| 亚洲综合色在线| 北约熟女超碰| av麻豆啪啪| 欧美成人性爱视频在线播放| 99久久综合| 精品高清牛人盗摄一区二区三区中文字幕A片免费在线观看 | 欧美一级欧美三级在线观看| 久久东京国产精品视频| 91女人的网站| 国产精品天堂| 日本超碰在线国产一区| 欧洲视频在线| 婷婷99狠狠躁天天躁| 国产人妻精品一区二区三区秋霞| 亚洲性网| 六月丁操逼| 亚州欧美一区| 91人妻做a观看视频| 超碰这里只有精品| 333kkkk·亚洲com久久| 91青青| 另类欧美| 日本三级日本三级99| 人人操人人干网页| 成人乱码一区二区三少妇| 日韩欧美经典在线观看| 婷婷五月成人| 亚州欧美总和| 亚洲欧美国产va在线播放频| 亚洲无码99| 欧美日韩97在线| αⅴ天堂| 国产精品国产自产拍高清AV| 五月丁香黄色网| 91精品国产麻豆国产自产在| 国产乱不卡| 亚洲乱伦图片视频| 人妻五十路在线| 高清国产无码av| julia国产在线 | 亚欧美色图| 无套内射性感少妇视频| 国产97av| 日韩一级免费性爱| 色臀AV| 色妹子A V| 国语精品av| 麻豆久久视频在线地址| 丰满人妻一区二区中文| 你想操日本小逼吗| 五十路熟女在线不卡观看一区二区| 中文字幕黄片在线| 久久精品女同亚洲女同13| 99热亚洲| 日欧亚洲二三区大片不卡| 麻豆区久久久久亚| 青青草九九九九九| 五十路一区无码| 久久久久久中文版| 国产热RE99久久6国产精品首| 97干色天堂| 97亚洲中文| 亚洲1区2区三区高清中文字幕| 97在线观视频免费观看| 欧美成人一区二区三区在线播放| 97超碰超| 国产久久久久影院老熟女| 伊人AAA| 偷拍 亚洲| 精品一区二区三区国产| 欧美在线中M| 伊人大香蕉在线| 一区三区啪啪| 日韩精品国产一区二区| 超碰 欧美| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 9国产超碰| 成人热久久精品| 伊人成人中文字幕久久网| 日本精品无码三级网站| 中国熟女老妇仑乱一区二区三区| 欧美狠狠狠| 日韩不卡网操逼中文字幕日韩| 天天天天操| 激情久久av一区av二区av| 亚洲97超碰| 亚州欧美在线| 情色图区| 99999这里都精品| 国产乱人妻精品入口| 亚洲人久久久久日| 久久久999日本大片| 五月天色色色| 国产67194| 中国一级操逼视频| 一类av片在线看| 中文字幕奈奈美被公侵犯| 超碰在线免费一区二区三区| 国产精品夜夜夜| 秋霞午夜视频一区二区| 老熟女区| 久久亚洲不卡一区二区三区| 久久久一热在线播放| 免费A V在线| 激情啪啪拍91| 99热免费| 亚洲黑丝在线| av天天在线观看| 精品国产乱码久久久久久影片| 久久香蕉国产传媒一区剧情天美| 97在线国产精品| 欧美熟妇视频| 自拍亚洲综合| 99热这里只有精品18| 91香蕉国产尤物视频| 午夜福利1区2区3区| 操逼免费视频无码国产| 精品国产一级久久| 亚洲中文制服诱惑| 日韩久草| 国产精品免费1区2区视频| ..日韩av毛片精品久久久| 免费看日产一区二区三区| 超碰超碰欧美| 激情久久日韩精品中文字幕麻豆| 草久在线| 亚洲一曲日韩精品| 99热这里都是精品| 精品一区二区三区四区女 | 日韩av情韩国爱禁区av一区二区| 另类图片五月天| 日韩欧美aⅴ综合网站发布| www.av在线观看| 欧美性爱另类综合| 综合熟女| 色综合99999| 九九九久久久| 久久婷婷精品| 亚洲欧美日韩中文久久自慰| 一二三区精品视频| 插欧洲美女欧美精品| 欧美亚洲日韩16色| 国产日本一区二区三区蜜臀在线观看| 国产18精品亚洲精品| 欧美白嫩在线放| 黄色成年| 丁香六月婷婷综合| 欧美黑人168页欧美黑人167| 久久性爱视频免费看| 中文字幕在线日亚洲9| 区二区亚洲婷| 久久久久久9| 91狠狠色丁香婷婷综合久久精品| 人人妻人人色一区二区三区| 黑人无码一区二区| 欧美精品亚洲精品日韩传电影| 国产精品一区二区久久精品| 不卡超碰护士AV在线免费播放| 久久久久久久久久久久九| 精品无码欧美三级| 日韩精品99久久久久久中文字幕| 亚洲中文字幕一区二区| 制服乱伦| 久久久久亚洲Av无码专区老牛影视 | 亚洲午夜未满十八勿入网站日本又色又爽又黄 | 人妻激情在线视频| 国产精品人妻无码久久久互動交流 | 国产高清吃奶免费视频网站| 久久精品一区| 人妻酒店出差被中出免费在线播放| 一级AV性爱| 97在线资源| 国产在线视视频有精品| 激情四射婷婷六月天| 五月天久久久| 84YTCOM性无码| 天天摸夜夜操视频| 丁香五月社区| 国产精品嫩草影院午夜两性| 精品少妇人妻一区二区三区| 蜜臀久久一区二区| 综合久久久久久久综合网| 性欧美999| 欧美爆操91| 国产专区第一页| 亚洲色婷婷综合久久久久中文| 国产情侣自拍在线播放| 欧成人精品H无码| 久9久9精品| 麻豆国产尤物AV| 国产日韩无码一区二区三区久久区| 97超碰色中文字幕| 一区=区三区视频| 五月丁香社区婷婷日韩欧美精品影院| 女生久久网| 欧美 亚洲 大香| 亚洲av影音先锋| 黑白配性爱AV成| 亚洲素人网| 91啪9色| 久久婷色| 国产 日韩,欧美 自拍| 精品国产乱码久久久久久日本公司| 久久人人妻| 国产精品无套内谢| 丁香色狠狠色综合久久小说| 另类专区加勒比| 色爱欲亚洲| 日韩欧美女优电影| 亚洲欧美成人在线| 肏逼视频日本| 日韩中文字幕2020| 色91综合网| 手机av天堂久久久久| 国产精品一二三区福利| 国产操逼逼网| 久久久久亚洲Aⅴ无码| 国产日韩精品人妻久久久久色欲网站| 无码137片内射在线影院| 91在线视频国产网站| 78精品在线| 色九九久九九| 国产久久久久久| 99热 按摩 日韩| 婷婷四五区| 超碰97欧美在线| 大香蕉十区| 久久九七| 91国精产品| 密臀成人视频久久久| 天堂成人网| 亚洲天堂一区| 久操com| 操美女高潮抽搐白浆| 91美女中出| 天天干天天日天天射黄色片| 青青青艹在线视频| 干美女人妻| 99少妇内射| 视频一区二区三区精品| 久久夜黄色无码A级大片| 一个国产在线综合网站| 精品一区二区成人| 吻戏激情性巴克| 999综合色| 亚洲综合草草| 日韩免费簧片| 91黑人无码激情在线| 日韩精彩免费| 日韩午夜国产| 日韩射精| 久草五月| 久久夜夜夜| 九九久久久| 欧美日韩黄片精品在线| 久热九九| 99蜜桃臀亚洲成人在线观看| 久久久久久久9| 97人人操人人摸| 国产精品经典一卡久久久 | AAA久久| 久久国产对白激情浪潮| 熟女人妻一区二区三区| 日本性爱少妇| 久久久久密臀视频| 超碰97久久| 操91| 色欧美综合| 中文字幕人乱码中文字的预防方法| 熟妇一区,二区,三区。| 精品国产一区二区三区四区在线看| 91麻豆天美国产欧美| 色原狠狠天天天| 黄色视频特级毛片| 丁香婷婷激情五月天无毒不卡| 好涩综合| 999狠狠综合| AV色五月天| 国产精品无码久久久久2028| 操操碰| 久久国产精品一区二区| 成人av动漫在线观看| 亚洲精品黑丝| 久久国内| 91精品丝袜久久久久久| 激情五月综合| 欧美精品宗合| 九九九九免费高| xxxx网站亚洲精品| 久久日本熟妇熟色高清| 一线黄色免费性爱片| 国产性爱欧美性爱在线| 午夜男人一级A片7777| 人人妻人人色一区二区三区| WWW黄片COM| 神马麻豆福利院| 91逼逼女人91| 九色精品视频导航1| 大香蕉日韩欧美| 亚洲综合激情五月久久| 中国人高清www色视频免费| 91人妻视频在线| 亚洲va有码在线天堂| 手机av亚洲丝袜美腿日韩第一页二页| 国产精品久久久鸭无码的功能| 97中文综合| 日韩专区数据列表-第3230页-精品国产一区二区三区香蕉 久久99熟女人妻中文字 | 人人操人人操人妻人| 天天综合AV| 亚洲欧洲av影音| 黄久在线| 五月天婷婷激情| 精品中文字幕一区二区| 校园激情狠狠四射| 久久日本熟女精品一区| 长长久久88视频| 国产9 9在线 | 亚洲| 蜜桃网熟妇| 亚洲熟妇丝袜在线观看| 亚洲精品日韩国产欧美| 视频一区二区免费在线| 精品在线78| www.高清无码诱惑一区.com | 欧州一区二区三区四区| 狠狠躁久久躁| 久干网| av操操不卡| 少妇超碰在线| 精品国产人成在线| 国产传媒午夜理伦精品| 亚洲a色| 97久久超碰国产精品| 欧美亚洲国产日本在线,久久精品国产| 久久精品国产亚洲AV成人直播| 100啪啪视频大全| 日韩三级av片| 日夜尻逼网| 91 综合 色| 在线情色电影 91大| 久久综合超碰| 超碰人妻中文在线| 91欧美长吊| 好吊色在线观看| 国产女人高潮视频| 爽爽淫人网| 夜夜嗨AV蜜臀av| 无码欧美有限公司| 精品国产72| 亚洲熟久久| 在线观看午夜婷婷久久久久清性观看| 欧美久久久15P| 无码视频一区二区| 久久久男人的天堂| 国产免费一区| 欧美 亚洲精品首页| 久久精品电影在线| 亚洲欧美国产中文视频| 日韩乱伦AⅤ| 日本性爱不卡视频| 天天干夜夜操网| 日本3级一区二区免费| 五月婷婷五月天| 欧美老妇综合网| 欧美青青视频| 在线啊啊啊| 午夜在线播放| 国产一在线观看| 丁香五月天激情综合| 婷婷伊人一区| 九九九热精品| 99re这里只有精品9| 国内毛片国产欧美拍| 玖玖玖玖精品国产剧情| 久久久com| 人妻少妇色综合| 日夜精品| 日韩欧美经典在线观看| 人妻在线臀日韩| 久久伊人东京热| 日韩精品一区二区人人人| 亚洲国产成人精品女人久久久| 亚洲欧美日韩免费电影| 久久久爆乳翘臀一线天伦理视频| 国产AV天美| 久久久九精品| 97超碰磁| 人妻中文在线| 日日干夜夜欢| 少妇厨房愉情理伦片bd在线观看 | 天天操天天射青青草| 伊人欧美大香蕉视频| 久久毛卡| 日韩天天本| 人人操人人插 - 百度 - 百度| 色噜噜人妻丝袜a∨先锋影| 日日夜夜国产综合| 日韩操啪| 美腿色图| 亚洲色人| 伊人影院中文字幕| 精品人妻一区二区三区不卡断| 天堂69亚洲精品中文字| 99碰碰| 国产91美女视频| 91精品伊人久久久大香线蕉91| 久久久久久久六六 | 天天操狠狠日夜夜干超大胆开放com大香蕉视频在线观看 | 国产成人在线观看网址| 韩日精品四区| 欧美综合第一页| 国产av高清版| 免费a级毛片av无码久久精品中文字幕| 69AV女优男人的天堂| 欧美性爱综合,免费| 中文字日本乱码| 一起草三级AV电影在线观看| 蜜桃中文字日产乱幕4区| 翔田千里爆乳巨臀无码| 少妇69中文| 欧美日韩日产免费网站看| 日本97久久久精品| 99国产在线 精品 视频| 亚州欧美一区| 毛片电影一区二区三区| 97超碰欧美中文字幕| 男人的天堂亚洲| Av手机版天堂网| 干美女人妻| 日本三级久| 中文人妻av高清一区| 91精品国产91久久久久久久久久久久| 亚洲色婷婷| 国产无码精品高清| av操操不卡| 熟女人妻一区二区三区| 国产又粗又长的视频| 91在线限制级| 精品九九国产无码| 澳门色噜噜色噜噜色噜噜色噜噜色噜噜| 亚洲国产精品久久久久久久久久| 无码一区免费在线不卡| 亚洲怡春院| 色婷婷aV一区二区三区麻豆综合| 中文字幕一区二区三区字幕| 久久有码视频| 青青草日韩无码| 亚洲欧美中文一区二区三| 国语精品对白| 国产麻豆一区二三区| 欧美综合自拍成人自拍第二十页| 13小男生GAY自慰脱裤子| 男人把坤坤插入女人的下体| 强奸a片网| 亚洲午夜福利在线影院| 国产无码精品成人| 干B网| 九九九久| 久久精品中文字幕女同| 中文字幕日韩人妻视频一区二区三区交换夫妻| 国产在线观看一区二区三区| 中文字幕一区二区三区人妻不卡| 视频黄站| 物业黑人 AV一区| 狠狠躁天天躁日日躁| 精品国产一区二区三区久久久蜜臀| 婷婷亚洲综合| 99热这里都是精品| 青青草操逼逼视频| 中文字幕 码 自拍 视频 区| 天天综合色电影| 亚洲一区二区三区麻豆传媒| 亚洲精品啪视频| 精品人妻一区二区视频| 免费av在线播放二区| 色欲三区| 女人 A一级| 四虎影院成年人片| 五月综合激情| 精品久久久av| 一区二区三区四区姦女| 伊人丝袜美腿高跟在线观看高清| 91丝袜在线观看视频在线观看| 欧美日韩中文亚洲v在线综合| 亚洲色图亚洲无码强奸乱伦| 国产 v乱码一区二| 日韩成人电影AV| 九九热精品在线| 黄页大片在线观看| 大香蕉一人在线| 精品白丝一区| 偷拍 亚洲 欧美| 巨爆乳一区二区爆乳区| AA特级绝黄| 亚洲熟妇极品| 激情人妻另类| 无码人妻精品酒店| 天天视频网站黄| 亚洲经典啪啪| 亚洲另类久操网| 97久久精品不卡| 乱欲视频| 国产欧美精选自拍一区| 先锋精品av色鲁| 麻豆一区二区三区精品| 亚洲视频精选| 国产精品色片一区二区| 99中出在线| 久热99999| 中文字幕AV中出| 再深点灬舒服灬太大了添视频| 日韩精品国产精品五码一区二区| 亚洲91少妇| 精品久久大胆人体| 中国一级αV| 国产网站在线播放| 91国产大片| 91性色| 日韩性爱再线视频| 日韩情色AV| 日本孕妇一区二区视频操逼免费看 | 91精品91久久久久77777| 黄色视频高清无码网站| 99色视频| 九色视频91| 日本一区三级韩国| 国内毛片四区| 新版天堂中文资源8在线| 色综合20p| 久久亚州精品成人Av无| 亚洲色欲一区二区三区| 欧美天天综合网| 久久香蕉国产传媒一区剧情天美| 欧美综色欧| 91 刺激在线| 色香AV| 91人人爽人人爽| 久操91视频| 大香蕉手机在线视频| 五月婷婷基地| 美女爽爽爽刺痛洞洞| 亚洲少妇诱惑| 在线只有精品| 中国国产精品一区视频| 伊人网青青| 人人搞人人插人人操| 久久人| 女生看匆91网站| 亚洲女优有码无码高清| 久久东京热成人| 亚洲天堂电影网99999| 日本熟妇自慰性高潮一区二区三区| 中亚黄色三级大片| 好爽免费视频,| 大香蕉92| 久欲AV| 日本高清一本二本免费不卡| 国产丝袜高跟美女av免费观看| 男人的天堂成人的社区| 91老熟女逼| 嗯啊不要啊在线| 99热亚洲天堂| ss久久| 国产精品久久久亚洲一区| 亚洲高潮少妇| 欧美黑人猛交春色影视大全| 伊人青青一区成人视频在线观看区| 国产精品久久久视频| 麻豆精品A片免费观看| 成人A片男人的天堂| 午夜福利久久久噜久噜久久综合| 五月婷婷hd| 亚洲精品一卡二卡三卡福利视频网站 | 久久久久久久久久黄色网 | 欧美色图亚州激情| 国产美女口爆吞精| 免费看国产大AB| 欧美亚洲在线| 淫荡网址| 2017av无码免费无线播| 思思视频免费看网站| 欧美经典一区二区三区| 天天干人妇| 性爱动态120秒| 青青操少妇| 日本高清加勒比| 国产视频第二页| 精品日韩人妻视频| 日韩欧美中文| 99无码视频| 青青草亚洲一区| 99国内熟女露脸视频| 欧美自拍网| 国产精品久久天天干| 97国产高清视频在线观看| 伊人AAA| 磁力99AV| 超碰97欧美日韩| 超碰99在线| 亚洲密乳AV| 丁香六月婷婷综合| 亚洲棕合电彰| 日本国产二线女色| 亚洲激情视频| 国产精品视频自拍在线| 97碰| 亚洲国产日韩精品久久久| 欧美性爱第1 页| 国产又色又粗又黄又爽| 久久久久婷婷| 极品粉嫩一区二区| 中文字幕国产| 思思热在线视频在线| 国产99 中文字幕日韩小视频| 毛片中心9视频99| 亚洲系列欧美| 免费精品无码一级毛片牛牛影视| 日韩美女操b| 美女超碰978| 国产自啪精品视频网站黑丝| 五月丁香激情四射| 超碰在线观看av不卡| av优播| 熟女露脸激情自拍视频| 无码一区免费在线不卡| 99久久99九九99九九九| 精品人妻视频一区二区三区蜜桃视频| 亚洲深夜福利| 亚洲一曲日韩精品| 久久超碰爱| 天天草AV| 亚洲无码国产探花在线观看| av在线一区二区三区| 久久综合日韩亚洲欧美| 午夜120视频在线观看| 亚洲成人碰碰| 国产中文日韩欧美一区二区三区人妻丝袜美腿| 人人操欧美风骚| 极品极品色影院| 天堂av2019| 日韩精品三级| 日韩啊V| 日韩一级免费性爱| 久草久热| 深喉吞精| 秋霞影音一区二区三区 | 国产亚州高清国产拍精| 韩日男人的天堂| 亚洲性高潮| 亚洲一区二区三区中文字幕| 日韩美一区| 97中文字幕一区| 强奸乱伦大香蕉| 狠狠狠狠狠| 九九九九热只有精品| 欧美一级久久久久久久大片动画| 亚洲色图 欧美热图 清纯唯美 另类自拍 | 欧美成人一级免费电影|