色五月色开心色婷婷色丁香,五月婷婷丁香花综合网,婷婷丁香五月激情综合在线,五月婷婷六月丁香动漫,婷婷丁香五月激情综合在线,丁香花中文字幕在线观看,播五月色五月开心五月网,开心激情综合网,狠狠色丁香婷婷综合最新地址,丁香视频在线观看,狠狠做六月爱婷婷综合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
返回資訊列表
热久久国产| 九九99精品| 国产精品麻豆成人AV艾秋| 色欲色香天天天综合网www-亚洲综合国| 婷婷激情四射| 深爱激情五月天| 久久久久幕乱码| 国产小u女在线观看| 精品视频久久区| 大香蕉www.超碰| 操我啊啊啊啊啊| 91久久久久久久久18| 99热成人| 丁香五月成人| 综合色久欲| 国产精品原创巨作?v网站| 麻豆天美国美国产| 黄片www视频免费| 中国探花熟女| 国产日韩中文字幕欧美| 日本午夜福利影院| 久久精品操| 亚洲人妻中文高清| 碰人碰碰人人开房人肉| 无码自拍SM| 欧洲精品人妻| 日本一级婬片试看三分钟| 丝袜性亚洲| 亚洲一级黄色毛片| 偷拍网站久久男女男| 一本大道久| 天天插天天干| 午夜美女福利视频| 亚洲男人的天堂网| 中文字幕亚洲永久精品| 国产精品丝袜久久亚洲不卡| 一区不卡在线观看av| 丁香九月婷婷| 国产成人精品日本视频| 婷婷15月天青娱乐| 国产一区二区三区久久久精品| 五月丁香啪啪啪| 大香蕉手机在线| 啊v视频在线观看| 久久亚州大香蕉| 天天综合网日韩7799| 午夜福利在线合集| 日韩无码专区| 麻豆成人影音在线| 日少妇亚洲版| 亚洲蜜桃V妇女| 欧美的精品的视频| 国产精品一区人妻精品阁在线| 国产97色在线| 日少妇亚洲版| 亚洲国产精品无码AV在线| 欧美色图在线视频少妇| 欧美激情综合| 日产操逼| 99精品网| 蜜桃狠狠色伊人亚洲综合 | 这里只有精品视频在线观看麻豆| 久久九精品| 六月丁香久久| 口爆吞精在线观看| 国产内射爽爽大片| 啊啊啊骚| 操穴国产| 高清国产无码av| 人妻夜夜爽天天爽麻豆三区网站 | 国产精品不卡av免费在线观看| 老色69| 啊啊啊久久| 99re视频在线观看这里只有精品| 中国一级αV| 丰满搜索结果 -第18页- 久久高清无码 | 欧美1区二区三区公司| 色五月激情AV在线| 综合影院亚洲| av在线不卡一区二区三区| 亚洲第一男人天堂| nuu12国产麻豆精品| av一区二区三区 中文| 碰碰97| 97超久碰| 岛国黄色大片网站| 国产多人在线观看视频| 亚洲精品电影| 91色综合色| 后入 亚洲 美女 射| 国产 日韩 欧美 中文 另类,国产 欧美 另类 制服 变态,高清 日韩 欧美 中文,高 | 色色激情五月天| 一级日本牲交大片好爽在线看| 超碰综合97在线| 日日黄色三级网站| 婷婷九月国产| 色www精品视频在线观看| 97九色人妻| 国产色精品午夜大片| 肏逼视频日本| 好爽视频在线观看视频| 国产综合久久久麻桃个| 91岛国动作片| 久9九综合在线| 日韩 欧美 国产 麻豆| 理论久久婷婷网 8| 五月天丁香网| a v网站在线播放| 岛国黄片网站| 收看日本人日bb| 色网色网色网色网色网色| 超碰人人干天天射| 天美传媒精品久久视频| 久久9999 | 日影院久久婷婷夜夜网| 九九热男人天堂| 国产伦精品一区二区三区在线观| av天堂影视中文在字幕在线中文| 91N欧美| 伊人网综合在线视频| 亚洲巨爆乳一区二区三区四季网| 亚洲图片另类| 啊啊啊免费视频| 2019男人的天堂| 久久超碰98| 熟妇艹鸡八| 黑人中出21连凳花野真衣| 91爱综合| 色五月婷婷五月天| 手机看片1025| 久久久人体| 95精品在线| 久久精品人体| 97超碰天天| 三上制服丝AV| 91青青在线视频| 亚洲色综网| 日韩欧美三级| 乱伦一二三区| 8050午夜少妇无码| 激情五月婷| 日本有码影片下载 | 欧美97在线观看| 欧洲综合视频| 五月天伊人| 中文字幕视频一区视频二区| 国产亚洲精品美女| 日日爽熟女| 久操| 国产av色网| 人妻人久久精品中文字幕| 国内一级精品| 啪啪视频免费在线观看| 2019天天干天天操| 婷婷中文字幕| 国产精品视频| 97久久超碰日韩精品| 欧美翘臀视频网站一区二区三区| 日韩肏逼视频| 人人操人人uiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii | 亚洲污污网站| 嗯嗯啊啊的视频| 91美女精品| 蜜臀在线视频| 国产成年免费大片黄在线观看| 久久黄色性爱视频| 一区二区激情国产熟女| 亚洲黄日韩无码专区| 亚洲精品白丝| 免费试看60秒| 丁香九月激情啪| 97国产精品国| 色色九区| 国产91会所女技师在线观看| 特级毛片特黄久久免费看| 久久精品性| 极品粉嫩一区二区| 96国产精品| 久久中文字幕一区不卡| 久久人人妻| 人人妻人人色一区二区三区| 免费的很黄很污的全部视频| 日韩免费人妻色情网站| 91N综合网在线| 国产欧美日本亚洲精品| 天美传媒av 在线| 女人的天堂大香蕉网| 亚洲在线91| 国产剧情AV不卡在线观看| 欧美成人9797| 天天夜夜rb| 日韩性爱1级片视频| 一区久久久二区| 中文字幕视频在线观看| 亚洲综合精品国产一区| 亚洲综合图片在线| 午夜视频好爽啊| 久操B网| 98福利在线视频| 永久免费观看的毛片的网站| 91久久婷婷| 亚洲色图 图片| 男人天堂网址| 这里只有精品久久| 96久久久久久久| 人人天天干干| 2020中文字幕在线| 中国zzijzzijzzwww精品| 青青草视频久久久久| 麻豆精品三区视频| 美日韩男女操屄视频| 激情婷婷五月天| 91在线色| 欧美九九九| 欧美性爱第一区| 9热9热综合网| 乱抡国产91| 啊啊啊啊啊在线视频| 午夜性生活av免费在线看| 欧洲天天在线| 国产精品久久天天干| 久久不卡一区二区| 日本韩国国产精品一区| 久久久久久免费电影| 91爆操视频| 91国产伊人大香蕉| 色小视频蜜乳| 久久久夜夜夜| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 欧美精品偷拍| 欧美1区二区三区公司| 欧美天天综| 加勒比伊人| 婷婷香蕉欧美在线一区二区三区| 一区二区高清视频| 精品无码久久久| 美女91AV| 日产狠狠干| 四虎884| 曰韩av中文字幕专区| 懂色影视久久| 92福利社视频| 2017av无码免费无线播| 欧美偷偷网| 欧美一区二区观看在线| 日本操逼无码| 狠综合网| 亚洲成熟国产精品美女| 欧美性性性| 欧美专利1区2区3区4区5区免费| 中文操逼字幕| 韩国嫰模上门援交视频| 嗯嗯嗯嗯啊啊啊好紧好大| 国产色综合亚洲色综合吹潮| 亚洲熟女少妇免费视频| 97视频网站在线观看| 1769国内精品视频| 精品高清牛人盗摄一区二区三区中文字幕A片免费在线观看 | 人人妻人人玩人人澡人人爽| 美女淫穴| 国产精品盗摄 偷窥盗摄| 久久夜夜夜夜| 婷婷亚洲天堂| 中文字幕交换人妻| 亚洲国产97| 东京热精品97综合网| 丁香六月啪| 久久精品国产欧美日韩亚洲欧美日韩中文久久国产一区 | 国产精品乱码久久久久久久久| 婷婷五月天基地| 亚洲色图欧美色图另类图片| 天天色踪合| 99精品在线播放| 秋霞一集毛片观看| 亚洲中文字幕av| 日本少妇va7777| 黄片aaaaa一区| 久久久精精精| 国产视频大全| 一二三啪啪专区| 1024人妻熟女一区二区三区| 蜜臀无码视频在线观看| 国内一级精品| 性交一区二区在线播放| 熟女中出视频| 成人婷婷丁香| 大胆91| 91久久九九精品国产综合| 91N综合网在线| 97亚洲资源| 久久丁香| 黄色AAAAA欧美| 夜夜嗨视频| 日韩不卡一二三四| 久久久久网站-538在线视频-欧美永久乱码 | 九九久久玖玖| 大香蕉视频啪啪啪啪| 福利一级版子| 美欧老女人97| 欧美激情区| 综合一区二区影视| 97超碰色中文字幕| 天美传媒精品久久视频| 97视频新免费| 91精品国| 99只有精品| 好爽,再快点啊哈嗯嗯嗯嗯| 任你爽视频| 人妻日日干| 亚洲熟女性高潮久久久| 免费操逼视频下载| 婬女免费一二三区A片| 丰满人妻一区二区三区四区| 国产精品福利视频播放| 99婷婷一区二区| 999999精品| 麻豆天天躁天天揉揉AV| 久草色在线观看| 操老熟女AV| 91熟女.com| 亚洲男人天堂2013| 91处女在线视频| 日韩av色图| 色天堂综合| 中国黑人三级片网站上区| 欧美熟妇人体| 日本不卡二三区| 色五月第四色| 天天舔天天日天天射| 另类图片亚洲加勒比另类图片亚洲加勒比另类图片亚洲加勒比 | 国产精品一区二区亚洲人成毛片| 久久精品久久九九精品| 天堂中文资源在线bt| 波多野结衣先锋影音| 日本激情免费大片| 婷婷丁香熟妇综合网| 色综合色色| 免费观看有码高清视频| 台湾肥佬网一区二区三区| 国精综合一二三区影视| 欧美 综合 亚洲| 蜜臀在线免费观看在线免费观看| 国产精品片| 综合天天网| 欧美极品女人的天堂| 五月激情综合网| 嗯嗯啊操我| 在线欧美69V免费观看视频| 国产成人网| 校园春色宗合网| 91处女在线视频| 欧美少妇高潮视频| 亚洲97在线| 免费人成毛片乱码| 亚洲成人久久一区二区| 中文字幕 码 自拍 视频 区| 老熟女熟妇| 啊啊啊啊啊啊啊在线| 色路综合| 伊人久日| 天天性射网| 久久久久97| 国产久久成人| 国产剧情AV不卡在线观看| 日本综合久久| 久久一二三四不卡| 青青草一区二区高清无码视频| 久久产精品一区二区三区电影| 最新亚洲人成网站在线影院| www.99在线| 中文字幕88av在线| 久久一区二区蜜桃| 乱伦图一区| 色97| 久草资源在线视频官方总站日韩丝袜美腿 | 人妻无码一区二区三区久久99| 91色夜| 人人操人人摸人人骑| 日本高清视频xxxx| 天天摸夜夜摸| 99re免费| 艳美熟妇先锋一二三区| 在线亚洲丝袜视频网站| 中国操逼无码| 怡红院怡春院| 尤物AV免费网站| 亚洲黄色视频在线观看视频| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 无码欧美有限公司| 人妻久久| 亚洲乱码国产乱码精网站| 99熟女| 六月婷婷一区二区三区| 69XX一中文字幕人妻91| 人人天天欧洲| 午夜九九九九九九| 日韩免费看黄片| 久久精9| 深爱伊人影院| 熟女色综合久久| 国产小炒后入式| 视频一区二区三区精品| 日韩AV中文字幕电影| 超碰人妻久久| 最新加勒比丝袜在线| 91bbbbbb| 大香蕉520| 91劲爆| 98人妻精品一区二区色欲| 五月婷久久| 精品丰满熟妇人妻一区| 99操逼| 99热大香蕉伊在线| 精品一区二区综合熟妇| 九九热免费国产视频婷婷伊人| 自拍偷拍2025在线观看| 2021久久国产综合精品青草 | 中文字幕av一区二区三区人妻少妇 | 亚洲国产一级中文综合久久天堂在线免费观看 | 老色69| 久久99手机免费视频| 欧美在线啊啊啊 | 色狠狠综合噜一二三区| 亚洲综人网| 97无码视频在线播放| 九九色婷婷| 欧美夜色| 日韩在线观看三级电影| 噜噜噜狠狠色综合| 欧美大片一区二区三区| 国内精品嫩模A∨私拍小视频| 亚洲国产欧美中日韩成人综合视频| 97超碰天天爱天天爱| 国产精品伦理| 中国一区二区亚洲人妻| 人妻少妇精品久久久| 久久精品一区二区一8| 色五月综合| 亚洲网污污污污| 视频一区二区三区精品| 啊啊啊啊啊在线观看网址| 天天夜夜rb| 91人人臊| 啊啊啊操死我了| 亚洲熟女性高潮久久久| 亚洲精品 欧美精品| 欧美性爱第一页久久| 97色五月天完| 97天堂| 五月天婷婷基地| 久久精品噜噜噜成人看免欧美大片| 成年女人黄网站| 午夜福利在线视频1000| 极品综合| 欧美999999| 日韩激情毛片一级久久久| 91天美传媒精品| 91天天看| 91+欧美| 91在线观看,天天综合| 日韩av一级黄片| 日韩三A大片在线观看| 大香蕉99热| 免费人成在线观看网站品爱网| 日本精品88888888| 欧差乱伦二三| 精品人妻一区二区三区-国产精品| 中文字幕一区二区三区50路| 久久久人体| 精品一级毛片在线观看| 熟妇艹鸡八| 亚洲 小说 欧美 激情 另类| 日韩欧亚太美不卡| 女同女同恋久久级三级| 成人精品欧洲亚洲| 国产黄色av大片网站| 亚洲清纯唯美| 久久精品久久久久久久久| 日韩噜噜69| 青娱乐国产盛宴视频| 伊人久久亚洲色欲综合网站 | 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 亚洲棕合电彰| 午夜精品五区| 校园激情狠狠四射| AV丝袜少妇| 黄片com.| 亚洲情色 自拍| 四虎AV在线观看| 丰满人妻区一区二区三| 亚洲中文电影| 丁香九月激情啪| 躁躁躁日日躁2020| 亚洲天堂综合AV| 久久9久| 欧美老熟另类| 欧美视频边做饭边橾| 99热欧美| 麻豆伊人网| 久久久久亚洲?V片无码V| 青青草一本道福利视频| 素人美腿视频网站| 操逼天美3区| 日本 情色 1区2区3区| 97蜜桃综合| 一级毛片久久久久久久女人18| 久久精品国产99久久,亚洲日韩久久日本一区一区三区 | 亚洲中文字幕乱码无码一区二区| 国产精品久久久久中文字幕| 9久久精品| 天堂射| 99无码精品| 中文字幕人成乱码熟女香港| 婷婷人妻激情| 久久九七| 开心激情婷婷| 日本在线视频导航| 我要去看2个日本美女.com曹逼| 欧美最大综合网| 久久男人的天堂国产| 无遮挡男女激烈动态图| 亚洲中文丝袜美腿诱惑字幕| 操操操操网黑人| 精品久久視頻在线| 成人三一级一片aaa| 91天天综合日韩欧美| 亚洲人91| 在线不卡视频| 国产成人手机视频激情| 久久久久久久免费A片国产成a人亚洲精∨品无码 | 人妻久久久久久久久久久久久久久| 免费αV在线视频| 啊啊在线| 超碰1997| 伦理弟一页| 欧美日日网| 中文字幕日本久久| 中文字幕乱在线伦视频中文字幕乱码在线 | 试看60秒| 欧美午夜色妇色鬼| 高清不卡视频| 俺去也婷婷| 操我无码| 强奸乱伦亚洲第一页| 91久久九九精品国产综合| 91第一页| 性91| 91中文字幕在线观看| 嗯~啊~快点 死我视频免费看网站| 久久久工口| 99热网站| 久久HD| 国产吞精a级片激情电影| 欧美一区二区三区入口| 日本天天干天天操一区| 理论久久婷婷网8| 很很很很操| 中文字幕97色| 国产精品对白内射| 欧美熟女激情| 人妻精品4K4K4K4K4| 无码色| 中文字幕一区二区三区视频播放| 大香蕉黄色一区| 99久久久er直播网址| 午夜精品久久久久久久99蜜桃一| 日日日日做夜夜夜夜无码| 十八禁av无码免费网站APP| 久久久久亚洲熟妇熟女| 中文AV制服乱伦| 东京热男人的天堂| 你懂的在线观看区国产| 在线中文字幕| 亚欧成人综合影院| 懂色天天爱天天日天天射天天澡| 岛国片在线播放| 亚洲春色欧美激情自拍| 亚洲欧洲成人在线电影| 日韩熟女无码| 先锋色眉乱伦资源| 强奸乱伦动态污图免费 | 蜜乳AV色欲AVAV无码| 18禁精品网站在线看| 婷婷爽人人婷婷爽视频| 乱性AV| 日韩 国产 欧美自拍| 台湾成人无码AV| 亚洲精品啪视频| 无码聚合| 色综合色综合网| 夜夜夜久久| 天天综和| 天操天操夜操夜月操月年年操操| 久久久久深夜无码| 日韩91网站| av网站免费看| 无码av永久免费专区网站| 人人摸人人干人人拍97| 免费夜夜爱黄色视频毛片| 99色在线| 天天看人人操屄犊摸阴| 97热视频在线观看| 欧美综合综合| 日本精品五区| 男人高清无码一区二区| 久久久久9999| 啊灬快c我灬啊灬用力灬啊灬-国产精品性做久久久久久-成人AV | 女同性恋久久| 超碰免费在线| 青青草亚洲一区| 老鸭窝日丰县女人| 欧美97色| 国产操逼逼网| 九九九九九九九精品视频| 日韩AV一区二区三区三州三州| 91l欧美在线| 欧美激情内射| 久久性生大片免费观看性| 看黄片视频免费| 亚洲综合五月天婷婷丁香| 成人网欧美风情| 日日碰视频网| 男同专区一区二区三区在线| 蜜乳成人AV| 亚洲精品视频在线| 粉嫩AV一区夜夜嗨| 亚州综合色| 天天躁日日躁xxxxx| www.超碰| 亚洲综合九| 午夜舔阴达高潮视频免费看| 婷婷中文网| 在线视频一区二区传媒| 午夜美女诱惑电源网| 日韩av性爱在线播放| 欧美一级黄色18片免费看| 色哟哟-国产专区| 久久久性少妇| 在线一道啪| 美女黄页| 男人的天堂kva| 日本色色视频网站| 在线啊啊啊啊| 4tube欧美女厕所| 久久欲| 色婷婷丁香五月| 中文字幕人乱码中文字的预防方法 | 中文字幕视频2区| 夜夜久久久| 日韩一级特黄av毛片| 97久久超碰国产网站| 色吊丝 日日骚 清纯唯美| 日本三级一区二区 在线| 国产欧美日韩女同性恋ww喷水精品| 人妻丰满熟妇av无码区蜜桃| 无码人妻精品一区二区中文| 口爆欧美91| 欧美一级二级三级| 久久香蕉综合一本到3atv| 大香蕉天天看妹子| 国产毛片片精品天天看视频| 偷窥自拍A片| 九九九精品一区二区无码| 74成人在线| 欧美天天拍| 亚洲国产精品无石码久久| 国产色呦呦| 久久久久ab| 男女啪啪网站免费视频| 97青青操视频| 超碰97亚洲| 理论久久婷婷网 8| 欧美 亚洲精品首页| 日本日皮视频逼| 亚洲色图 综合| 国语国产操逼伊人AV网| 在线一区| 亚洲午夜福利在线影院| 亚洲色图 图片| 国产内射爽爽大片| 亚洲AV成人无码一区二区三区在线观看 | 极品极品色影院| 亚洲欧洲激情| 国内毛片国产专区二| 亚洲污污网站| 精品亚洲黄色片 国产精品导航一区二区 | 无码乱人伦中文视频| jiujiujiujingpin| 黄色网址在线免费观看| 在线观看午夜婷婷久久久久清性观看| 久久精品中文字幕无码l| 欧美国产有色电影| 国产三区免费在线观看| 激情文学 亚洲图片| 97久久久| 久久精品国产亚洲5555| 亚洲熟妇乱女区二区三区| 中文乱码字幕观看视频| 九色 人妻 大香蕉| 伊人网青青| 老色69| 亚欧高清| 欧洲精品人妻| 中文字幕 国产区| 99热欧美| 日日干夜夜操视频h| 丁香五六月啪啪| 98精品国产乱码久久久久久| 18禁超污无遮挡无码免费网| 国产精品农村妇女精品| 天天干一干| 国产熟女精品一区二区| 日本男人插女人的逼黄色| 2021久久国产综合精品青草| 99热婷婷一区二区三| 色婷婷综合久久久久中文国产精品一区中文字幕,国产福利电影一区二区三区 | 一本一道vs波多野结衣| 亚洲图片视频小说| 精品久久視頻在线| 日韩AV无码网站| 小骚逼被操的爽不爽| 天天躁日日躁AAA片李宗瑞| 欧美色图亚洲激情| 国产污视频麻豆传媒一区二区| 手机在线人成免费视频| 亚洲高清欧美总合| 91亚洲影院综合| 国产精品久久久久中文字幕| 校园春色五月天| 国产乱弄免费在线视频。| 激情综合网五月婷婷五月天| 国产又黄又爽| 日韩一级二级三级免费看完整版国语版| 婷婷AV一区二区三区| 射久久| 91欧美综合在线| 91一区二区| 亚洲精品无码成人久久久99| 600国产精品视频| 国产传媒美日韩av| 激情五月天社区| 无码不卡亚洲成?人片| 精品国产久久乱码| 素人播放一区| 偷窥自拍A片| av天堂加勒比| 四虎视频在线观看| 开心五月婷婷激情| 少妇高潮特黄A片| 精品免费一区| 天天日天天干天天摸天天操| 精品无码久久久久久国产浪潮| 超碰 国产熟女精品一区| 久久国产精品,久久国产| 在线v中文字幕一区二区三区 | 精品对白久久不卡| 日韩不卡码| 不卡超碰护士AV在线免费播放| 玖玖资源综合在线视频| 欧美日韩另类在线播放| 亚洲开心网| 日本道日本道中文字幕日本道最新日本道在线观看 | 岛国视频一二三区| 在线视频97| 久久99干一本高清| 神马久久网| 天天摸,夜夜摸| 十八禁啪啦拍视频无遮挡| yazhououmeizongya| 天操老女人| 麻豆黄色五月天| 成人电影一区| 日本国产欧美一区三区二区| 美女91网| 伊人午夜福利视频| 上床不卡网站| 97久久久久久久精| 亚洲另类综合欧美| 久99久视频| 日本一区二区成人在线| 综合久久久久久久综合网| 色色毛片| 久久精品一区二区三区四区五区| 日本ZZ高免费A级视频| 色香欲天天天天综合色| 久久神马影院| 四虎免费看黄| 欧美性猛交美女自慰91| 国产一区二区三区影片| 操逼网站地址| 亚洲九月丁香| 无码日韩网站| 日人妻视频91| 国产小u女在线观看| 久草视频在线视频在线视频在线观看 | 超碰97极品9| 人妻人人澡人人爽人人| 97色婷婷| 天堂蜜桃无码视频一区二区| 少妇500双飞99| 中文字幕 国产区| 国产91美女视频| 亚洲无码久久久久久久| 九九热免费国产视频婷婷伊人五月| 女人久久久| 二对二中文字幕。| 插日本熟女视频| 色成人Www精品永久观看| 蜜臀久久99精品久久久久久无删减 | 91伊人久| 五月丁香啪啪网| 成人性爱视频在线看| 农村女一级毛卡片| 日韩色图 一区二区| 婷婷五月天久久精品视频一区二区三区| 吉川爱美亚洲二区在线| 91中文字幕制服丝袜免费视频| 97碰碰色| 亚洲天天更新| 久久久成人精品| www.天天干| αⅴ天堂| 激情五月综合开心五月| 日韩专区久久久| 欧美成va视频网站| 性一级黄色录像片网站导航| 91 丝袜在线播放| 校园春色 欧美| 久久综合九色综合欧洲98| 日本黄大片在线观看视频| 天天看精品动漫视频一区| 夜夜欧美| 日韩欧美性吧婷婷乱伦大香蕉| 一二三四区电影| 青青草毛片| 黑人精品XXX一区一二区| 国产久久成人| blacked精品一区国产| 亚洲无码色| 精品一二三区久久AAA片| 五月天激情小说| 无码99| 宗合情欲网| 久草在| 亚洲清纯综合| 久久男人的天堂| 国产精品国产自产高清AV| 日本 欧美 国产一区| 啊啊啊啊嗯嗯嗯用力好爽| 第二页中文字幕| 超碰97首页| 春色91| 乱伦日本中文自拍| 成人日韩3| 欧美成人性爱视频大全| 久久久9视频| 久久久禁| 国产97色在线| 韩三级a视频在线观看| 色婷婷亚洲婷婷| 久久久不能久久久久| 国产十八禁视频| 亚洲黄色电影| 乱伦1色页| 狂操嫩妻视频一区二区三区| 日han少妇无码| 999久久久久久久久| 成人av影院在线观看| 激情五月天视频| 久久久穴999| 一卡二卡三卡| 日韩欧美tv一区二区在线观看| 久99| 久噜噜| 熟女人妻精品一区二区视频| 91小视频| 亚洲五区熟女| 99热精品在线观看| 国内伊人久久久久久网站视频| av日韩国产一区二区| 天美传媒国产原创中文字幕亚洲欧美另类 | 麻豆区久久久久亚| 亚洲精品国产拍免费91在线| 18禁精品网站在线看| 国产乱码久久| 亚洲极品| 欧美亚洲激情| 9色在线| 超碰97欧美日韩| 狠狠婷婷亚洲中文综合久久| 国产成人精品必看| 亚洲影视综合网| 亚洲国产青青| 一区AV| 久妇网| 久久精品区| 404操逼福利视频| 亚洲精品骚逼| 久久性爱视频99| caorenqi shipin| 亚洲日本大香蕉1| 亚洲第一免费视频| 色噜噜人妻丝袜AV资源| 酒色综合网| JULIA一区二区三区在线播放| 99综合免费视频| 97在线播放 | 青青草日逼视频| 色图综合| 国产免费一区二区在线A片视频| 老熟妇一区二区三区啪啪| 欧美片第一页| 夜夜中出国产| 亚洲高清欧美总合| 日韩免费性爱视频在线观看| 好吊爽好吊爽在线视频,中文字幕精品一区二区日本,国产良妇出轨视频在线观看, | 97热视频在线观看| 在线观看免费视频国产| 欧美精品91| 成人一二| 久操99| 国产97在线视频| 国产男女无套视频免费观看| 日韩欧美中文字| 熟妇的味道HD中文字幕| 三上制服丝AV| 人人爱人人乐人人操| 欧美日韩99精品麻豆传媒| 风韵犹存大大大大香蕉| 日本久久天堂| 久久9久久| 六月婷婷色综合| 国产日本顶级一区二区三区| 人妻av在线| 亚洲日精品| 五月天激情四射| 啊啊啊好大好深| 国产欧美一区二区| a'v在线资源| 大香蕉97久久| 97视频免费播放| 日韩国语字幕| 少妇被c 黄 免费观看| 嗯啊不要啊啊在线观看视频| 欧美综合国产精品久久丁香| 青青草视频在线观看一区二区| 无码 黑人一区二区三区| 91高跟美女在线播放| 91在线超高颜值国产| 中文字幕人乱码中文字的预防方法 | 欧美人妻少妇| 99热99在线| 久射吧| 三级三级三级日本99| 2017天天操| 淫色网综合| 超碰97日韩| 91九色丨国产丨爆乳| 国产日韩区| 五十路人妻在线| 日本超碰在线国产一区| 精品无码久久久久久久久果冻糖心| 亚洲综合113页| 日日操丁香五月天| 玖玖无码超碰| 操逼日韩无码 | 在线观看一级α片刺激高潮视频| 亚州春色| 日韩乱插| 五月天日日操夜夜操| 麻豆 欧美 日韩| 三久久久四久久久久| 欧美A√综合网 | 中文字幕天堂在线| 国产欧美黑人丰满在线| 日本99热| 欧美综合自拍| 男人的天堂日本东京热| 看一级黄色视频| 日本操逼视频免费| 国产丝袜高跟美女av免费观看| 尹人大香蕉视频在线| 中文字幕精品免费一区二区| 日韩人妻精品| 男人的天堂在线有码| 天天激情综合站| 深夜视频| 黄色不卡视频| 婷婷亚洲天堂| 懂色av色欲av蜜臀av| 秋霞视频一区二区| 欧美18老人禁| 欧美在线视频观看一二三四区高清 | 综合免费无码中文| 亚洲se91| 美女网站黄页| 亚洲精品97在线| 国产成人bd在线观看| 国产内射爽爽大片| 日本最新1区2区3区| 国产无套粉嫩白浆在| 香蕉国产精品麻豆亚洲欧美日韩| 麻豆激情综合| 日本在线一二| 欧美人妻精品一区二区| 久久久久久久久久久久色网| 中文字幕第23区| 久久国色天香香蕉| 免费综合亚洲中文| 91精品女厕偷拍视频| 伊人久久AV诱惑悠悠| 日本中文字幕一区| 亚洲丝袜色图| www.五月天| 一级特级aaaa毛片免费观看 | 中文字幕一区二区日韩网| 天天狂操夜夜狂日| 99re在线视频国产| 97资源欧美| 夜夜操天| 熟女六十路| 欧美中文字幕日韩在线| 热99这里有精品综合久久 | 欧美色图综合| 日韩无码服务区| 蘋果手機免費看成人Av| 蜜臀99999| 久久久久中出| 中文字幕高清20页视频 | 日本视频一区二区三区| 久久系列| 天天综合青苹果| 日韩av电影网站| 国产人伦精品一区二区三区| 九九色色| 激情久久久| 日韩欧美tv一区二区在线观看| 亚洲av无码国产精品字幕| 欧美黄业| a啊啊啊啊啊啊啊啊一区二区| 97chaopenrihan| 东京热99999| 不卡九肏| 色欲人妻一区二区在线| 国产suv精品一区二区四区999| 亚洲中文字幕av| 性爱乱伦一区| 国语国产操逼伊人AV网| 久久亚洲AV成人精品无码| 操逼视频色| 天天躁日日躁成人字幕aⅴ| 国产亚洲精品激情| 免费av在线播放二区| 欧美日韩插逼视频| 亚洲国产97在线精品一区| 欧美第五页| 熟女熟妇一区二区三区视频| 日韩色图 一区二区| 91精品国产乱码| 亚洲999综合| 五月天色电影| 久久久久国产| 色麻豆AV| 九九九国产精品| 欧美激情 一区| 黄色成年| 97久久久| 日韩无限资源| 尤物网站91| 亚洲图片色图欧美另类| 91深夜夜| 中国少妇XXXX做受| 18禁网站在线播放| 欧美亚洲日本视频久久久| 日韩另类| 长长久久88视频| 91九色在线| 大香蕉AV丝袜| 爱爱动态试试看6 0秒| 丰满人妻一区| 亚洲日精品| 亚洲欧美日韩不卡人妻| 日韩免费av片高清无码| 日本十八禁免费看污网站| www.色吧5.com| blacked精品一区国产| 国产麻豆福利av在线播放| 国产女性无套 免费观看| 国产99热| 密臀在线免费观看| 99re6国产精品99re| 干b网| 高清无码学生妹高潮| 日韩一级欧美一级国产一级台湾| 无码高清少妇久久| 凹凸视频在线观看伊人| 激情综合婷婷| 天天肏美女| 一区| 97中文字幕一区| 亚洲中文sv| 久久粉色| 澳门黄片一香蕉视频| 中文字幕在线观看网址| 岛国福利在线精品播放| 亚洲乱熟女一区二区三区大香蕉| 性站 | 五十路六十路素人熟女| 亚洲中文日韩欧美大香蕉视频| 亚洲色婷婷| 青青操青娱乐| 激情欧美日韩女同久久| 天天操天天舔| 黄色片A级一区二区三区| 日韩性爱播放| 青青11操操操操操操操操| 中文字幕超碰CAO| 亚洲男人天堂视频| 放黄片放3级黄片没穿衣服| 九月丁香婷婷色| 天天影视综合网欧美精品| 欧美91色| 成功精品影院| 欧美A√综合网| 久久粉色| 欧美午夜视频免费观看| 一区二区日韩欧美久久| 草久久久| 精品黄色电影| 综合影视国产无码| 亚洲中文制服诱惑| 亚洲人精品午夜不卡| 探花精品 一区二区| 久久国内| 日韩少妇丰满亚洲| 久草新在线| 国产福利av精彩对白| 欧美成不卡网| 青青操日韩| 午夜AV人气不卡| 亚洲丝袜色图| 欧美色图欧美| 久久婷婷五月天| 久久蜜桃综合网| 干我久操| 日本三级大片| 日韩欧美蜜桃精品久久中文字幕久久 | 啊啊啊 在线| 爽极品影院| 国产精品久久伊人| 好屌色综合| 国产二区三区免费视频| 艹我哪美一区无码| 97久久国产精品| 人人艹亚洲| 亚洲综合影视| 亚洲综合欧美| 蜜桃色色网站视频三区| 国产AV中文| 手机看av网站在线看|