国产成人欧美一区二区三区vr_久久国产精品人人爽人人爽_国产精品永久免费播放_肉欲啪啪a∨无码精品一区二区_国产超短裙jk丝袜在线_亚洲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
返回資訊列表
亚洲色婷婷久久久综合日本| 国产乱伦视频污| 国产一区二区三区精品观看啪| 青青草一区二区高清无码视频| 国产精品久久发布| 五月婷婷六月丁香| 婷婷影院入口| 岛国视频免费在线观看| 国产隔壁老王影院在线| 国产丝袜欧美在线视频| 国产成人bd在线观看| 可乐操亚洲蜜911| 亚洲日韩东京热一区| 蜜桃久久综合视频| 久久,精品一二三| 蜜臀操逼黄色视频操的好爽| 欧美顶级黄色大片免费| 夜夜影视四色| 亚洲高清无码AAA久久久精品| 探花视频免费观看国产专区| 亚洲精品久久久久久久蜜桃臀| 秋霞鲁丝午夜无码一区二区三| 嗯啊啊啊轻点视频 | 夜夜草天天| 欧美综合第一页| 我想要啊 啊 啊| 大香蕉综合| 欧美天天拍| 亚洲中文字幕网| 午夜一区| 天天射,天天操,天天爽-国内精品一区二区三区-成人AV | 久久最新视频免费观看| 色穴精品| 欧美在线 亚洲| 欧美成人亚洲精品| 亚洲色图 图片| 欧美亚洲综合999| 蜜臀色乳| 中文字幕无码不卡啪啪| 公司1区2区3区精产精| 九九热这里只有在线精品视 伊人草 成人菠萝蜜视频在线观看 | 欧美劲爆视频一区二区| 天天日天天舔天天喷天天射| 理论久久婷婷网 8| 久久久98网站免费视频| 69综合网| 亚洲影视第一页| 亚洲欧美激情小说| 天天插网| 91东京热男人的天堂| 污色区网站| 性色AV蜜色av色欲av| 人人妻人人爽一区二区三区| 综合网亚洲| 国产毛片片精品天天看视频| 欧美丝袜制服久久| 亚洲精品日日夜夜52| 亚洲一区二区精品福利| 999狠狠综合| 日本人体九九九九九九| 97内射偷拍| 99在线观看无大码| 精品少妇一区二区| 国产精品99精品视频网站| 欧美亚洲一级在线观看| 黄片无码在线制服| 欧美激情 亚洲色图| 91模特在线观看| 9丨久久九九九| 久操视频在线观看| 国产视频小说| 搞中出久久| 女人被添高潮免费视频| 天天干天天干天天干| 精品一区二区三区最新| 视频黄站| 在线观看一级α片刺激高潮视频| 五月天婷精品激情| 好爽,再快点啊哈嗯嗯嗯嗯| 天天天天天超碰| 黄色片G G G| 久久精品91| a片久久久久久久久久久久 | 九九亚洲视频| 抽插爽| 好爽免费视频,| 国产精品久久久久久久久久久久| 偷窥自拍A片| 美欧老女人97| 国语少妇精| 中国一区二区亚洲人妻| 好舒服视频| 欧美综合亚洲综合| 怡红院一区二区熟女人妻| 精品国产72| 欧美自拍网| 最新国内自拍av免费| 中文字幕在线日亚洲9| 人妻在线臀日韩| 亚洲精品97久久中文字幕| 人人贴人人摸| 欧美中字二区| 高清国产成人无码| 亚洲天堂人人妻| 超碰色老头| 亚洲福利中文字幕在线| 亚洲亚洲亚洲天堂天堂| 无码精品蜜桃一区二区三区ww| 国产伦精品免编号公布| 99av| 亚洲免费精品一区| 国产强奸乱伦第1页| 插欧洲美女欧美精品| 91欧美性| 亚洲欧洲日韩国产自在线| 天天看特黄的免费网站| 欧 美 自 拍 偷 拍| 亚洲av热热色| 曰韩操B| 亚洲自拍一区夜夜操| 肏逼视频日本| 天天看高清麻豆| 国产又黄又粗的视频| 爱射综合| 成年人网站在线免费观看| 91在线视频免费中出| 四虎在线观看视频| 久久熟女人| 日韩精品人妻一区二区| 欧美伦乱爱| 日本1区2区不卡视频| 粉嫩AV一区夜夜嗨| 五月婷婷AV| 99re这里只有| 精久久久91| 天天躁日日躁xxxxx| 很狠操| 粉嫩在线一区二区懂色| 酒色综合网| 偷拍网站久久男女男| 亚洲 欧美 精品专区 极品| 国产SV一线| 日韩免费三级黄片电影| 1024午夜激情男人的天堂| 欧美成人黄网色网站| 老鸭窝成人| 天天综合色电影| 欧州一区二区三区四区| 国产地址二三| 久久XX| 嗯嗯啊啊操我| 试看福利| 伊人操操| 狠狠色综合网| 国产又黄又爽又刺激久久久久久| 屁股久久久久久久久| 色蜜AV| 日本高清免费一本视频在线观看| 国产自产22区| ss久久| 中文字幕日韩人妻视频一区二区三区| 亚洲天堂电影网99999| 中文字幕在线播放2中文字幕在线观看2| 97国产超碰| 久久久久ab| 亚洲福利中文字幕在线| 国产精品视频白浆免费| 亚洲乱伦图片视频| 亚洲中文字幕熟女| 啪啪啪男女亚洲中文字幕99| 国产AV线| 最新av在线| 久久大香蕉| 精品无码久久久久久国产浪潮| 熟女高潮精品一区二区| 大香蕉欧美国产日韩高潮| 国产精品老熟女一区二区| 天天看天天在线精品| 久久久久久久性爱| 无码二级三级| 夜夜爽爽夜夜精品视频| 欧美亚洲AN| 超碰爽人妻熟女Av| 激情五月天校园春色网| 嗯嗯啊啊用力视频免费| 久青草影院| 国产中文字幕曰本毛片| 无码WWW免费视频网站| 青青草好吊色| 78m成人视线| 亚州综合色图| 91高跟美女在线播放| 亚洲综合另类| 岛国片在线观看视频亚洲| 狠狠操官网| 亚州综合| 国内毛片欧美香蕉精品| 国产亚洲色婷婷久久99精品91 - 百度| 亚洲色图 91| 久污| 欧美色图人妻| 九热超碰| 性高潮久久久| 久久精品无码熟妇一区二区三区视频导航 | 熟女这里只有精品6| 国产AV中文| 人妻91少妇| 人妻另类| sewuyueav| 女同性恋中文字幕| 日韩三级性| 久久久久无码一妻区| 蜜桃不卡一区二区| 亚洲男人的天堂AV| 亚洲熟久久| 97视频900| 天天舔九色婷婷| 91熟女综合| 99热 按摩 日韩| 97视频620| 美女黄码视频午夜| 久久久久96| 伊人久久亚洲色欲综合网站 | 国产97在线视频| 性天堂| 麻豆国产97在线| 成全动漫视频观看免费下载| 天天插夜夜操| 妺妺跟我一起洗澡没忍住| 亚卅熟女乱色| 精品久久久九九九孕妇| av操操不卡| 欧洲亚洲天堂精品| 欧美91变态| 无码直播久久久| 人人看人人插| 手机看片1025| 人人澡人人爽人人精品| 亚州男人天堂| 午夜国产成人精品视频 | 无码一区二区三区四区五区六区七区八区九区十区视频 | 欧洲天天在线| 午夜综合在线| 久久久久9999| 亚洲一区二区性爱电影| 天天干天天日天天射黄色| 久草婷婷| 亚洲男人在线观看天堂| 欧美一级美片在线观看免费| 青娱乐日韩无码| 97干日韩| 91n处女在线观看| 夜草网站| 日韩不卡av一二三| 中文字幕在线观看网页| 亚洲亚洲亚洲天堂天堂| 国产品精品自在在线午夜免费| 国产中文字幕在线点播| 亚洲色图大香| 91插B网站| 国产一区免费午夜视频| 亚洲色图大香| 91制服丝袜| 老熟女搡BBBB搡BBBB视频| av一区二区三区 中文| 97香焦色区| 狠狠操狠狠燥| WWW啪啪的com| 红杏大香蕉| 香蕉av一区二区三区| 久久春色| 麻豆精品久久久久久久| 91美女视频直播| 搞中出久久| 蜜桃传媒一区二区亚洲| 国产超碰97| 91c色| 亚洲精品欧美专业| 黄色成人网久久久久久| 国产精品乱人伊人网| 十八禁电影伊人网| 日韩一性一交一A片俄罗斯| 国产有码一区| 91亚洲综合| 久久综合九九| 超碰精品97| 欧美,日韩综合久久| 佐山爱中文字幕| 久久AV无码AV| 天综合网| 色色毛片| 禁十八久久| 国产一区二区三区免费视频在性观看 | 少妇色综合| 麻豆三极片| 欧美制服网站美腿丝袜| 久久久新亚洲AV| 2010男人的天堂| 91精品在线播放| 亚洲精品日韩国产欧美| 色色九区| 日韩精品区二区三区不卡| 骚货操死你| 自拍鲍鱼一区在线高清观看免费| 大但人体久久久久| 超碰久热| 欧美日韩在线小说 | 午夜操一操| 99丝袜福利在线播放| 亚洲久9| 熟女人妻av在线资源,黄色的资源| 亚洲天天自拍| 蜜臀精品1区2区| 精品一区二区三区国产| 区二区亚洲婷| 337p大胆噜噜噜噜噜91Av| 91美女小视频| 日本啊啊啊啊啊视频| 7777奇米影视久久| 人妻 欧美亚洲| 自偷自拍的亚洲视频| 天天日天天看| 亚洲欧美性生活| 手机在线人成免费视频| 一级二级在线观看| 亚州综合图片| www.狠狠干.coom | 亚洲第一页色| 人妻丰满熟妇一区二区三| 亚洲综合大片| 久操B网| 国产女人高潮嗷嗷嗷叫小说| 欧美日韩亚洲天堂| 区一二区日韩亚洲乱码av电影| 亚洲国产一区二区入口| 欧美色图第一页| www.高清无码诱惑一区.com | 91丝袜激情在线| 一区在线观看中文字幕| 欧美亚洲中文| 自拍第一页| 中文字幕乱碼在线| 色欲久久综合| 无码最新| 明星性猛交ⅹxxx乱大交| 乱久久久| 高潮内射在线| 欧美一区二区三区日韩| 亚洲欧洲中文日韩女优乱码| 日本道人妻久久久在线不卡色视频| 很黄很污的免费网站| 91精品人妻电影| 国产精品久久久啊| 国产成人五月天丁香花| 亚洲综合69| 欧美少妇大量自拍视频在线观看| 爱av免费| 亚洲精品国产熟女久久久久久| 青娱乐妇女性生活| 九99久久| av线电影| 99热精品国产| 啊啊啊啊啊啊在线看| 日韩中文字幕二区| 国产三级中文有码在线视频| 无码免费在线观看黄色片| www.伪伪| 免费精品中文字幕| 国产专区第一页| 午夜小电影在线插入淫高潮| 偷拍视频青青草在线视频| 天天热精品| 蜜臀久久久国产| AV天堂男人的天堂| 中文字幕av久久爽Av| 天天干少妇| 狠狠色综合网| 五月综合色| 九九性爱网| 在线观看精品国产免费| 在线观看色视频| 樱花蜜乳av| 又粗又长又爽在线观看| 亚洲精品一二牛牛| 国产精品久久久久久久久久梁医生| 精品视频一二三中文| 国产精品久久泡妞网站| 中出欧美| 操逼A∨| 香港澳门日本三级网站| 黄色免费网| 立川理惠被中出无码| 亚洲情色综合| 日本国产亚洲一区在线观看| 午夜a成v人电影| 国产探花日韩援交| 午夜120视频在线观看| 一级@啪啪视频| 久久精品国产99精品亚洲蜜...| 国产AV色黄看到爽| 极品极品色影院| 色情成人五月天| 人妻啊啊人妻啊| 嗯嗯嗯嗯啊啊啊好紧好大| 亚洲男人的天堂一区二区| 五月天伊人| 亚洲一区二区 麻豆传媒| 中文字幕人乱码中文字的预防方法 | 天天操天天插| 中文字幕55555| 狠操91,com| 玖玖资源视频一区二区三区| 夜夜爽夜夜操| 人人摸.人人色| 国产色呦呦| 综合熟女| 一牛一区二区三区久久| 欧美综合综合| 波多野42部激情无码喷潮| 国产精品亚洲一级av第二区| 综合色啪| 久久999久| 夜夜免费视频| 一区二区乱码福利| 免费伦费视频在线观看| 久久亚洲不卡| 啊啊啊操死我了| 开心五月婷婷激情| 亚洲精品一二三四区| 日韩精品人妻中文字有码在线| 又黄又硬又粗又长国产视频| 51国产午夜精品视频| 国模无码一区二区三区在线| 岛国小电影| 久久久久久少妇| 成人线上超碰| 亚欧性爱ab| 91丝袜美女| 东京热,男人的天堂| 亚洲97成人在线观看| 国产一级黄色片在线观看| 久久男人的天堂国产| 最新9久久久9免费视频| 看免费的黄片| 涩五月婷婷| 99久久无色码| 天天流夜夜操| 男人的天堂2018.| 久久久久成人蜜桃精品| 极品色社| 区二区亚洲婷| 欧美91色| 日韩人妻制服丝袜av| 亚洲人成网www| 少妇精品久久久八区九区| 五月天婷婷在线看| 欧美图片偷拍| 精品国产乱子伦一区二区三区,精品一| 久久五月天婷婷丁香中文字幕| 超碰超碰欧美| 欧美 色 亚洲| 久久精彩视频| 好涩综合| 天美国产三级传媒| 亚洲色图欧美| 欧美性天天影视| 亚洲毛片久久| 麻豆天美国美国产| 久久久久久久9999| 午夜婷婷| 91制服丝袜中文字幕| 日韩一级片在线看| 久热网| 网页导航五月天免费一二三区| 黄呦呦在线| 巨爆乳一区二区爆乳区| 国产精品亚洲日韩骚欢乐谷最新地址发布页huanieguty性屋娱乐妖精视频 | 先锋女优在线观看视频| 久久久98网站免费视频| 欧亚日韩一区在线| 精品人妻二区三区| 国产 亚洲 一二三四| 激情亚洲天堂| 国精精品无码一二三区水多多| 亚洲污污网站| 美女黄频a美女大全免费皮| 欧美亚洲韩国视频十五区| 爱媛媛久久国产福利| 亚洲色综网| 91碰碰碰| 欧美在线永久天堂| 国产免费久久精品99re韩国| 国产欧美岛国精品一区| 天堂网亚洲区手机版| 五月天激情综合网| 激情综合网激情综合| 欧美爆操91| 无码逼| 好一吊区二区| 97内射偷拍| 日本一二区免费| 色激情综合网站| 欧美熟妇亚洲版| 91free福利| 蜜臀无码视频在线观看| 91欧美丝袜| 七久久久| 屁屁影院一区二区三区国产| 成年人黄色| 美日韩一二三区| 狼人久草| 天天射天天| 日日AAvv| 亚洲少妇色图自慰直播| 我爱大香蕉| 中文AV制服乱伦| 99久在线精品99re8| 欧美性天天影视| AV不卡在线| 国产女同在线观看视频| 国产后入式在线观看| 不卡人妻少妇精品毛片一区23区视频| 中文字幕精品一区二区精| 亚洲欧美91| 2017天天透天天通天天擦| 中亚精品极乱| 日韩婷婷| 久久肏大逼| 国产一区二区成人av在线播放| 色69大色97香蕉| 欧美狠狠鲁| 色婷婷在线视频| 国产亚洲日韩在线三区黑人| 国产成人久久精品蜜臀| 欧美中日韩XXXX| 欧美亚洲日韩16色| 人妻精品4K4K4K4K4| 91一起操| 在线视频日韩欧美国产| 啪啪免费| 日韩无码精品综合久久| 日本一级特级毛片视频| 国产精品伦理| 青娱乐 青青青操 日逼| 九9热伊人| 国产盗摄美女如厕大神作品在线观看| 99国产人成精品| 日韩人妻一区二区精品| 在线观看精品国产免费| 国产大学生口爆吞精合集| 乱伦一二三| 欧洲特黄毛片免费看欧洲毛片| 国产嫩草精品A88AV| 91熟女视频网| 国产AV天美传媒一区二区三区 | 久欲AV| 国产免费久久精品99re韩国| 性生活无遮挡纯毛片在线看| 欧美无圣光在线| 色婷婷综合久久中文字幕雪峰| 亚洲,欧美,春色,另类| 狠狠干综合| 狠狠穞A片一區二區三區| 99热最新| 亚洲图片 91| 一本一道人妻久久一区二区三区 | 女人的天堂大香蕉网| 久久精品老司| 亚洲欧洲第二视频在线观看色图| 一二三四视频在线社区中文字幕| 色麻豆AV| 日本高清一本二本免费不卡| 凹凸 69堂 在线播放| 啊啊啊骚| 超碰在线人妻| 久久思思热| 欧美美女自慰一区二区三区| 伊人青青一区成人视频在线观看区 | 91在线视频免费中出| 91jk色拍| 亚洲情色综合网| 国产嫩草精品A88AV| 91老司机在线| 国产1024在线播放| 午夜视频好爽啊| 日本在线播放不卡一区| 色婷婷综合久久久久中文国产精品一区中文字幕,国产福利电影一区二区三区 | 久久久精品91八戒| 亚洲无码久久久久久久| 99精品久久| 伦在线97| 在线观看黄色电话| 屌逼传媒| 日本精品久久久久久久| 亚洲视频精选| 午夜亚洲国产理论秋霞| 性爱乱伦一区| 日韩专区数据列表-第3230页-精品国产一区二区三区香蕉 久久99熟女人妻中文字 | 人妻在线臀日韩| 狠狠躁天天躁日日躁97| 欧美亚洲今日在线| 多毛小伙内射老太婆| 91精品黄在线观看| 中文字幕乱碼在线| 欧亚日本情色| 伊人一级免费黄片| 日本欧美国内在线| 超碰97男人| 欧美同性恋 的搜索结果 - 91n| 欧美v日韩v亚洲v最新在线| 免费簧片在线观看| 欧美亚洲第1页| 亚洲国产福利视频| www亚洲免费| 91oumei| 亚洲天堂美臀在线| 啊啊啊在线观看| 国产精品久久久三级无码| 日本精品人妻少妇一区二区| 日日骚一区二区三区| 2017人人操,人人摸| 极品五月天噜噜| 亚洲97网站| 2019精品国产无码成人| 性色一线| 国产久久天堂资源| 熟女精品va中文字幕| 91欧美偷拍| 精品人妻av区天天看片| 乱老女人一区二区视频| 欧美传媒一区| 国产中文大片资源中文字幕| 五月天伊人| 女人综合网| 香蕉婷婷| 蜜桃臀av一区二区| 黄片不用下载在线观看| 97视频新免费| 日韩精品中文字幕一| 少妇人妻无码| 国产无码高清操逼视频| 中国黑人三级片网站上区| 亚洲欧美人妻| 九九九综合精品| 日韩亚洲欧美中文字幕| 天天狠| 午夜精品久久99蜜桃的功能章节| 六月婷婷综合| 神马麻豆福利院| 亚洲.欧美.丝袜.中文.综合| 日本加勒比无码专区| 久久九色| 92久久| 狠狠狠一区二区三区| 97色香蕉| 嫩草 人人网精品| 国产日韩手机视频在线| 久久久18禁| 操逼片国产| 玖玖超碰熟| 九九aV| 天美传媒AV在线| 在线观看十八禁| 福利视频香蕉免费一区二区在线| 用力操死我| 交换娇妻呻吟声不停中文字幕| 亚洲欧美setu| 竹菊影视国产一区二区| 91精品丝袜久久久久久| 嗯嗯,啊啊,国产精品| 18禁看网站一区| 欧美色图 人妻| 去干网最新版| 少妇久久久久久| 9精品在线| 日韩性爱电影一区| 久久久久99精品成人片蜜臀| 丁香五月天婷婷姐| 99国产精品视频尤物| 夜夜国自区| 99热超碰| 国产精品蜜乳AV| 欧成人精品H无码| 综合天天网| 高清国产av无码| 国产美女高潮| 亚洲国产蜜臀系列在线观看| 精品久久一区二区三区四区五区| 日韩AV无码网站| 国产久9| 蜜臀在线免费观看在线免费观看| 免费亚洲黄色视频在线观看 | 99婷婷| 国产精品午夜福利亚洲综合网| 青草视频人妻在线观看| 色97| 性做久久久久久免费观看软件| 98久久| 在线小说视频一区| 精品人妻一区二区免费蜜桃| 日韩不卡av一二三| 国产精品成人久久一区二区三区| 97操b| 久久99草| 国产欧美一区二区| 中文字幕性感少妇av| 欧美真人抽搐一进一出gif | 激情久久av一区av二区av| 国产精品爆乳懂色蜜乳| 桑老女人九区| 亚洲黄a三级三级三级看三级| 欧美极品女人的天堂| 一区二区视频在线播放| A级片日韩欧美国产欧美视频精选观看| 99久在线精品99re8| 日本 免费 一区二区三区 久久香蕉 | 睡产熟女乱伦| 在线观看高清AV| 99色网| 亚洲美女精品九九视频| 欧美日韩亚洲国产中文永久天天看| 欧美一区二区在线资源| 920日本午夜免费| 成年人性爱日韩| 中文字幕奈奈美被公侵犯| 人妻色偷色噜| 麻豆天美91| 91欧美色| 少妇熟女一区二区三区| aV中文麻| 玖玖综合视频| 亚州欧美综合| 91人妻久久久久久久久久久久久| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 五月丁香影视| 激情综合亚洲| 99热综合| 清柠毛片| 欧美成人9797| 97九色人妻| 99免费在线视频| 五月婷久久| 婷婷综合激情| 长长久久免费视频| 嗯啊不要在线观看嗯啊| 久久极品一区二区| 日韩AV一区二区三区四四| 婷婷伊人| 亚洲色图激情小说| 99青草| 亚洲国产综合久久久性感熟妇| 国产一区二区三区不卡手机在线| 九九玖玖精品| 成人在线视频一区| 伊人色综合欧美| 伊人视频| 日韩九九九| 羞涩视频| 午夜福利av电影在线| 日韩亚洲中文字幕在线| 牛牛aV| 五月婷婷综合在线| 啪啪91| 蜜臀AV午夜精品久| 激情五月天中文字幕色| 老外又粗又长一晚做五次| 精品人妻一区二区视频| 久久亚洲AV成人精品无码| 国产精品视频精品一二| 东京热激情视频一二三区| 麻豆熟妇乱妇熟色A片在线看| 免费精品AB| 狠狠爱夜夜| 夜夜草天天| 国产精品视频麻豆入口| 久久草在线综合视频| 九九九九久久久| 欧洲乱码一区二区| 久久熟女久| 96超碰网| 美女操逼A A| 久久精品国产亚洲AV片多多| 一本久道久久综合狠狠爱| 国产大片精久久久久久| 日韩三级性| 操东北女人| 在线A日本| 欧美毛片在线网| 青青草成人视频在线观看二区| 蜜桃AV天堂| 国产精品白领在线观看| 上海一级黄片| 91人人爽人人爽人人人,gav福利视频导航,日韩欧美亚洲国产字幕四区 | 翔田千里Av在线| 欧美v亚洲v日韩v最新在线二区| 91蜜臀熟女| 大香蕉在线SuP| 永久电影三级在线观看| 国产成人精品日本亚洲语言| 中文字幕一区二区三区人妻少妇在线| 天海翼久久| 操碰97| 日韩女模中文造逼| 日韩精品99久久久久久中文字幕 | 日韩av不卡在线观看| 亚洲城人男人的天堂| 色婷婷A V一二三四区麻豆综合| 美女91网站| 人人考人人摸人人干| 九X超碰| 欧美综合网A| 中文字幕av亚洲在线| 亚洲色9| 五十路三区在线| 999国产精品999| 一区,二区,三区视频| 欧美激情一区| 天天插天天射| 成人九九| 在线可观看的黄色网址| 青青草视频导航官网| 91搡老女人老妇女老熟女歌词翻译| 日本精品无码三级网站| 欧美在线大香蕉| 秋霞Av理论一级在线| 99热精品在线观看| 亚洲天天自拍| 精品成人av一区二区三区在线| 欧美亚州综合图片| 欧美五十路熟| 色老汉色| 人妻偷拍一区二区三区| 99久久久无码| 超碰在线人人射| 色五91| 欧美黑人熟妇精品91| 99热精品在线观看| 亚洲日韩精品一区二区| 极品尤物在线观看| 久久久免费高清中文视频| 亚洲成熟国产精品美女| 激情小说亚洲视频| 美国aaaaa一级黄片| 成人精品视频| 国产一级高跟丝袜| 最新精品久久蜜桃 | 欧洲中文字幕| 人人操,人人插| 黑人天8A∨高清网站| 综合伊人激情| 999综合色| 三级色综合| 嫩草 我啊~嗯~在线| 秋霞曰韩R级| 久艹视频在线| 久久久久久欧美精品se一二三四| 欧美伊人电影| 91人人爽人人爽人人人,gav福利视频导航,日韩欧美亚洲国产字幕四区 | 日本在线视频导航| 91白虎| 久9久9久9久9久9久9| 亚洲欧洲日韩国产自在线| 国产中文字幕在线观看| 99热久| 偷拍偷窥与盗摄视频专区| 偷拍超碰| 粉嫩绯色AV一区二区在线| 欧美啪啪啪91| 91爱综合| 啪啪视频亚洲第一| 成人AV在线网站| www.狠狠干.coom| 国产高清视频无码在线| 综合一区二区影视| 99视频只有精品| 91精品国产91久久青草| 伊人网在线视频| 凹凸视频特色日本特黄| 欧美色亚洲| 欧美久久人妻少妇一区二区| 一区二区三区精品视频| 综合久久9| 亚洲精品一区二区免费在线观看| 天天色播亚洲综合网站| 999久久久| 久久视频少妇美女| 污啪啪啪视频| 国产精品久久99日日| 抽插亚洲无码| 人人妻人人色| 亚洲人人操| 人人看人人插| 久操免费视频| 欧洲亚洲人妻无码中字久久三区四区| 欧美十八禁网站| 东京热一区二区中文字幕| 日韩精品系列| 中文久久一区| 亚洲.欧美.丝袜.中文.综合| 久久五月天婷婷丁香中文字幕| 99久在线精品99re8蜜桃| 精品视频97| 婷婷五月天补不补| 国产乱人伦AVA麻豆软件.| 大JI巴好深好爽又大又粗视频| 色亚州人久干视频在线观看免费版| 六九九九| 午夜天堂啪啪| 99精品视频在线观看免费| 欧美亚洲激情| 亚洲人妻久久久| 久草草一二三四区久久| 96精品久久久久中文字幕| 色婷婷综合网站| 国模艳艳啪啪一区| 亚洲欧洲日本精品中文a∨| 亚洲欧美不卡线| 五月天AV资源| 日产123区精品免费观看| 黄色小说亚洲| 又大又黄国产| 正在播放:深夜激情大战,自带黑丝袜全力输出骚穴 | 人人做人人妻人人夜视频| 亚洲,日韩,欧美,成人播放| 神马久久久久久久| 伊人91| 躁躁躁日日躁2020| 人妻少妇精品久久久久久| 欧美激情亚洲情色| 久久久久密臀视频| www.高清无码诱惑一区.com | 欧美亚洲综合色| 六月激情婷婷| 国产福利精品最新在线| 69精品久久久久中文字幕| 777琪琪午夜免费A片| 国产亚洲色停停久久99精品91| 夜夜性| 日韩欧美女求操每天更新| 欧美天天影院| 91青青在线| 后入人妻无码| 加勒比综合在线| 国产日韩美女小穴视频网站不卡| av2014 日韩在线中文字幕| 好爽要喷了| 超碰天天去日穴| 欧美色图校园春色| 夜夜性| 国产品精品自在在线午夜免费| 久久久蜜桃臀无码视频| 亚洲全色网| 在线日韩日本亚洲国产| 囯产精品久久久久久久久久梁医生 | 色汉综合| 成 人 A V免费视频在线观看| 国产毛片片精品天天看视频| 乱伦日本中文自拍| 国产Av超碰| 欧美性爱www免费版| 探花一区在线| 色色亚洲| 日韩少妇丰满亚洲| 亚洲无限观看| 大香蕉2017| 男人的天堂va| 第四色奇米影视777| 色哟哟511老熟女| 国产亚洲精品自在线亚洲情侣| 亚洲综合激情五月久久| 高凊专区人人操| 啊灬快c我灬啊灬用力灬啊灬-国产精品性做久久久久久-成人AV | 九九精品99| 国产精品自拍欧美在线| 五月天婷婷影院| 日本一片一区| 久久久久幕乱码| 高清国产av无码| 女同亚洲欧美一二三区久久电影| 欧美精品91| 亚洲素人综合| 黄色免费一级在线毛片| 在线国产福利网址导航| 狠狠爱综合网| 久久久婷| 亚州欧美在线| 操婢日韩| 丁香五月性| 成人五月天色网| 精品人妻高清麻豆av| 另类图片欧美激情综合| 欧亚性爱视频免费看| 91女在线观看| 亚洲熟妇AV日韩熟妇在线| 香蕉视频精品亚洲一区二区三区在线播| 日韩精品在线放| 亚洲AV成人无码一区二区三区在线观看| 九九毛片这里只有精品| 蜜臀th| 免费精品无码一级毛片牛牛影视 | 婷婷五月成人| 91久久久老司机| 欧美色图亚洲色| 欧亚性爱啪啪| 欧美亚洲丝袜美女电影| 黄色成年| 欧美操逼熟女| 亚洲情色一区综合| 日本ZZ高免费A级视频| 蜜臀AV秘一区翔田千里| 婷婷五月综合激情| 97超碰总站| www.99色| 欧美久久九九| 久久精品一区一起草| 亚洲精品一区二区精品| 久久久精品日本一道| 麻豆区久久久久亚| 精品视频免费在线一区| 久草视频制服诱惑| 在线不欧美| 精品一区二区成人动漫| 97视频900| A片A5445444| 99re6久热只有精品6在线直播| 国产尤物在线三区| 欧美色性爱| 国产免费久久精品99re韩国| 欧美高清无码免费视频高清版| 一区二区日韩欧美久久| 99精品在线| 欧美顶级黄色大片免费| 97视频900| 精品人妻1区| 欧美狠狠弄| 一起草三级AV电影在线观看 | 在线无码操| 激情综合网一盗摄| 大学生口爆吞精| 欧美操逼视频二区| A片大香蕉在线| 日本熟人妻中文字幕在线|...久久国产精品-国产精品_日本一区二区三区中文字幕 | 欧美熟妇精品黑人巨大91| 91l欧美在线| 国产97色在线| 99爱精品| 天天亚洲| 日本一本一区二区三区四区五区欧美日韩中文字幕 | 久久成人午夜精品影院 | 亚洲欧美电影| 狠狠躁AV| 国内毛片欧美香蕉精品| 日本精品88888888| 国产成人超碰在线| 97视频7| 国产成人无码a| 加勒比av中文| 五月丁香社区婷婷日韩欧美精品影院| 97av,com| 国产久久久久久久久一区二区| 久啪视频| 男人的天堂啪啪啪啪啪蜜桃不卡| 国产一区在线看| 97亚洲综合电影| 日韩免费簧片| 久久久久久久久久久久久久久久9| 亚洲免费成人在线高清无码视频| 男人的天堂2000| 操我无码| v91av| 熟妇亚洲一区二区三区| 少妇厨房愉情理伦片bd在线观看| 97玖玖超碰| 中文操嬖片。| 91女日逼| 嗯……啊…嗯嗯…啊…好舒服| 两女互慰AV高潮喷水在线观看| AV色图| 欧美婷婷| 99亚洲国产精品色一区二区三区| 亚洲男人的天堂AV| 91人人臊| 少妇久久久久久| 超碰夫妻97| 91操碰| 伊人一级免费黄片| 天天综合网合集91| 男人天堂一区二区| 91伊人久| 欧美瑟综合| 日本加靬比网站发布页| 日韩成人性爱电影在线播放| 大香蕉综合网| #NAME?| 亚洲日韩一区电影| 亚洲啪啪视频一区二区| 中国91AV| 爱啪精品一区| 激情丁香五月| 国产日韩在线播放av| 亚洲熟女乱综合一区二区在线-...亚洲国产日韩欧美一区二区三区,久久久久久精 | 欧美一级专区免费大片| 欧美操人| 人人操人人摸人人看人人干| 78久久| 97国产精品久久久久| 美腿色图| 六十路日本| 欧美黄片免费在线观看视频| 一级毛片电影免费看| 国产黄色影片在线观看| 超碰诱惑| 色香伊人| 射丝袜高跟鞋99| 色情综合网| 国产成人欧美一区二区三区的国产| 亚州欧美另类| 99精品高潮| 嗯嗯啊啊亚欧精品| 久久婷婷五月天| 最新日产中文在线麻豆| 超碰97人妻免费在线| 97视频免费播放| 亚洲欧美视| 日韩 成人 有码| 亚洲最大黄网| 久久人妻视频网| 91天堂色男人的天堂| 国产亚洲深夜激情| 大象AV在线| 不卡视频一区蜜桃视频 | 91狠狠综合| 人妻丝袜一区二区三区在线| 久湿久久 | 欧洲亚洲人妻无码中字久久三区四区| 色综合天天| 欧美性爱精品一区二区| 操逼操逼视频操逼| 国产精品黄色三级av| 亚洲欧美一区二区网址| 日本天天干天天操一区| 色97干| 巨乳特殊服务按摩| 999久久久久久久久| 九九热午夜欧亚国产视频| 在线亚洲丝袜视频网站| 伦理弟一页| 在线亚洲精品久久久| 国产乱码精品久久久久久| 久久蜜色情在线视频xxx免费观看| www.四虎在线| 亚洲AV乱码专区国产噜噜亚洲| 欧美另类色| 色老汉色| 久久、1234| 91超碰碰在线| 97久久国产亚洲精品超碰热| 欧美高潮| 99999亚洲另类| 日韩十八禁|