日韩精品一区二区三区在线视频放-无码中文字幕V?一区二区-成年片免费观看视频-国内少妇人妻丰满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
返回資訊列表
激情看片网站| 精品美女少妇一区二区| 欧美黄色片AAAAA| 国产91 丝袜在线播放| yy少妇精品久久| 日本特黄f c2| 九九无码| 亚洲九区| 婷婷视频网| 色情乱伦AV| 麻豆国产精品午夜视频| 熟女熟妇一区二区三区视频| 国产后入内射| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 激情色播| 看黄片视频免费| 国产精品久久久久久久久久久久| Julia Annxxxxx| 一区二区三区四区姦女| 青青草十区九区爱夜| 天天干一干| 国人欧美精品一区二区| 国产色精品午夜大片| 福利视频合集| 青娱乐啪啪视频| 91中文字幕制服丝袜免费视频| 午夜精品久久999热蜜桃介男人用| 欧美天天拍| 人人看人人摸人人色| 思思热免费在线视频| 亚洲成人黄色在线观看| 少妇熟女1区2区3区| 日韩成人私密一级精品av| 久久91| 视频二区美腿制服人妻欧美| 亚洲日精品| 久久大香蕉97| 91视频在线观看18| 天天看天天日| 日本爽爽爽爽爽爽免费视频| 亲子敌伦对白在线播放| 亚洲网站一区二区在线| 91社区伊人| 人人性爱视频免费| 在线岛国新天堂8| A级国产欧美激情在线| 亚洲国产97| 丰满人妻一区二区三区免费| 欧美天天干| 91少妇人妻| 欧美翘臀视频网站一区二区三区| 亚洲天天操| 91国模| 熟女探花啪啪| 免费伦费视频在线观看| 国产亚洲精品自在线亚洲情侣| 粉嫩在线一区二区懂色| 亚洲人人操| 囯产精品一区二区三区线|亚洲人成无码网WWW动漫|国产精品免费一级... | 婷婷爽人人婷婷爽视频| 国产美女口爆吞精视频| 在线国产福利网址导航| 日韩性爱小视频在线观看| 欧美日韩国产色图在线| 99免费在线视频| 国产一区麻豆免费观看| 欧美色图91p| 一级免费精品| 大香蕉欧美| 大香蕉一区二区在线观看.| 男人的天堂一区三区| 一起草AV| 日韩国产十八禁| 久久久久96| 日韩15p| 人人玩人人添人人澡免费| 黄色区免费观看中文字幕| 久久99999| 91青青| 中文字幕第9页萱萱影音先锋| 美女操逼A A| 白嫩国模丰满一二三区| 亚州成人a∨| jiujiujiujingpin| 精品999一区二区| 精品国产91内射久久| 综合欧美日本三级| 91中文精品日韩欧美在线 | av爱爱爱| 天天综合色电影| 超碰综合97在线| 亚洲欧美日韩制服另类| 麻豆久久久一区二区| 国产亚洲精品美女| 国产久久成人| 国产又大又粗又长视频在线| 欧美日韩中文字幕人妻| 亚洲五月婷| 久久骚少妇| 清纯唯美亚洲| 丝袜内射| 中文字幕黄片在线| 91麻豆一二三区| 日韩免费三级黄片电影| 四虎永久在线精品免费网址| 人人妻人人爽一区二区三区| 五月天黄色激情视频| 欧美97视频| 99e久久国产精品| 狠狠干综合| 国产不卡的视频 | 欧美日韩青操| 日韩色欲久久一二三四区| 欧美 中文字幕 一区| 天天舔日美女视频| 亚洲综合色婷婷| 加勒比久久av| 凹凸视频特色日本特黄| 天堂亚洲欧美| 四虎AV在线观看| 97chaopengongkai| 九九热精品| 伊人在线大香蕉视频久久| 人人干人人操人人爱| 91在线免费观看处女| 老司机香蕉| 亚洲第一成人影院色播| 色欧美色交综合| 91人妻素女| 久干网| 在线观看亚洲成人精品| 九九热这里只有在线精品视 伊人草 成人菠萝蜜视频在线观看 | 精品九九淫乱男| 国产91影院| 91亚洲人电影| 欧美 亚洲 在线| 久久99综合| 欧美日本不卡在线| 五月婷婷色| 999国产精品999久久久久久| 国产一区二区三区中文字幕| 熟女熟妇一区二区三区视频| 按摩中文字幕| 秋霞操逼片| 91大学精品激情戏| 久久天堂| 久操在97| 精品伊人久久久大香线蕉小说| 国产成人精品午夜福利| 成人福利视频网| 蜜桃午夜视频一区二区 | 26uuu性| 亚洲天天影视色综合| 日韩操逼HD| 久干网| av婷婷色婷婷色六月| 干妹子| 五月天婷婷成人网| 日本三级A片网站com| 玖玖蜜臀资源网| 亚洲一卡二卡在线免费| 区自美91| 手机不卡视频不卡在线一二三区| 亚洲午夜福利视频| 搡老女人老91二区| 91熟女.com| 日本片日本片祼观看网站在线看中文版网页在线看 | 亚洲影院成人| 久热精品在线| 97网址97| 久久99999| 激情网五月天| 十八禁av无码免费网站APP| 精品久久艹| 男人的天堂2019AV| 人妻少妇av在线观看| 欧美91在线| 五十路人妻在线| 97精品国产97久久久| 国产精品乱人伊人网| 国产精品久久久久久无码红治院| 一区二区高清视频| 亚洲素人综合| 色天堂综合| 快播久久人人aV| 精品夜夜澡人妻无码| 狠狠中文字幕| 蜜乳AV色欲AVAV无码| 超碰在线观看av不卡| 国产亚州高清国产拍精| 亚洲综合九九| 校园春色综合| 欧美亚洲AN| 中文字幕AV片| 99操逼| 97操97干| 精品一区二区国产日韩| 久久久久亚洲?V片无码V| 天天干天天狼在线视频| 欧美疯狂做爰xxxx| 91色碰| 成人精品视频一区二区| 美女黄码视频午夜| 欧美另类综合久久| 国产亚洲欧洲在线观看| 亚洲综合首页| 天天摸天天插天天日| 亚洲s色图| 深夜福利黄片| 久久久久久久人妻| 日本一久是| 人人看黄色视频| 色999五月色| 91爱做| www男人天堂| 久久夜黄色无码A级大片| yazhousetuoumei| 日日爱99| 欧美97视频| 蜜乳视频网站| 黑丝少妇麻豆| 国产综合色精品在线观看| www.色操逼| 热热热热日日漂亮永久永久国产日| 丝袜亚洲综合| 91撸色网 玖玖网 欧美| 天美传媒精品久久视频| 欧美成人性爱视频大全| 国产自偷| 骚货| 天天操夜夜操狠很操| 亚洲中文字幕日产无码久久| 日韩一级久久毛片| 久久是精品| 欧美乱伦专区| 欧美亚洲丝袜美女电影| 欧美亚洲第一页| 久久成人网站| 日韩欧美成人大香蕉| 中文字幕人妻资源在线| 欧美在线大香999| 亚洲一区深夜| 国产传媒操逼视频| 午夜毛片亚洲精品片国产久久久| 免费的av网| 人人操肉肉| 一二三四区操操Av| 极品AV网站在线观看| 色噜噜婷婷| 亚洲91在线播放影院| 天天操天天日天天干| 成人免费在线网站| 人人做人人妻人人夜视频| 好吊色青靑草| 超碰在线1234区| 久热伊人99re| 大稥蕉免费视频这里只有精品| 中文字幕中文字幕一区二区| 91人妻精华帖| 日本免费中文字幕在线| 另类欧美色| 91爱做| 熟妇熟女一区二三区| 在线观看日韩av不卡| 亚洲熟妇一,二,三期| 欧美人妖内射| 92一区二区| 国产精品久久久| 91 丝袜在线播放| 日本操逼无码| 1769一区| 欧美一区二区日韩三区| 交换娇妻呻吟声不停中文字幕| av天堂电影网| 国产精品美女视频诱惑| 一级黄色性爱裸体视频| 亚洲天堂区| 欧美一级色| 人人乐大香蕉| 大香蕉日韩欧美| 久久有码视频| 屁股久久久久久| 久久人妻熟女一区二区| 快播电影网日韩新片| 久久久啊啊啊| 粉嫩av久久一区二区三区| 成 人片 黄色大片| 五月丁香亭亭| 九一综合网| 久久青娱乐| 97天堂| A一区片| 亚洲日韩美女中文字幕乱| 黄片无码在线制服| 丝袜美腿诱惑亚洲欧美视频在线观看| 亚州操操穴网| 91日日夜夜| 91在线欧美| 日韩视频啪啪| 成人在线视频一区| 精品九九九九九九| 国产一区二区视频在线播放| 成人影 天天操 亚洲| 少妇人妻精品| 国产日韩精品suv| 五月天婷婷久久| 欧美国产操逼| 日韩人妻免费精品| 日韩欧美丝袜诱惑| 欧美gv在线观看| 精品超碰中文在线| 天天欲望网| 国产成人免费观看在线视频| 99热aaa| 97aiaiai| 色五月第四色| 国产亚洲日本精品在线| 国产精品69久久久久孕妇欧美| 97碰久久| 久久久久久久 九九九九九九九| 精品一区二区三区蜜桃| 女优免费一区二区永久| 久久一区二区蜜桃| 蜜臀精品1区2区| 成人自拍三级在线观看| 老熟妇一区二区三区啪啪| 黄色操人| 亚洲综合伊人| 午夜一区| 99热在线观看| 日本999精品| A 天堂在线观看视频| 91色夜| 日韩久久超碰色| 岛国大片在线观看网站入口| 后入合集| 国产性感在线观看| 天堂俺去俺来也www久久婷婷| 91最新综合| 国产精品一级毛片不卡视| 婷婷国产精品一区二区| 欧美91精彩| 97天天摸天天碰| 中文?日韩?免费?精品| 玖玖资源中文字幕制服丝袜| 成人性爱电影一区二区| 伊人国产成人av网站| 国产精品亚洲日韩骚欢乐谷最新地址发布页huanieguty性屋娱乐妖精视频 | 综合久久中文字幕综合日韩精品| 91色插| 久久伊人青青草| 婷婷五月天激情小说| 国产一区二区在线播放量| 色欲天香天天综合网-成年人三级片网站-欧美乱妇狂野-日韩国产专区-久久久久久 | 91AV天美在线视频| 四月丁香婷婷| 久久精精区一区二区一蜜桃一区二区| 亚洲成人日韩小说| 777AV电影| 伦激情人妻另类人妻| 亚欧高清| 蜜区区视频79 | 人妻熟女av国产网站| 97超碰碰| 思思热一热婷婷热一热| 国产久久久久久久久一区二区| 18禁美女裸体无遮挡啪啪| 日B操| 17c嫩草51久久91嫩草| 成人小电影网站tex| 中文字幕av一区二区三区人妻少妇 | 免费看一级a性色生活片久久无| 亚洲 日韩 丝袜 熟女 变态| 精品人妻一区二区视频| 日韩乱中文| 污啪啪啪视频| 3p国产欧美99热| 亚欧性爱在线无码| 国内精品不卡无毒99999| 激情四射婷婷四五月天| 国产美女激情| 清纯唯美综合| 在线观看高清AV| 天天躁日日躁xxxxx| 亚洲精品一二区| 日韩免费看黄片| 五月天激情网图片| 96久久久精品| 五月天我淫我色av| 久久香蕉影院| 高潮嗯啊性感美女久久久| 97色欧州| 性感美女91影视| 不卡中文字幕aⅴ在线| 美中日韩无码| 亚洲天堂区| 人人操人人狠狠操| WWW4虎| 国产精品熟女一区二区三区| 岛国在线免费视频| 后X久久| 国产无吗在线播放| 欧美亚洲美少妇一区二区| 99在线观看| av在线浏览| 精品国产乱码| 2019天天干| 青女在线| 国产不卡精品91| 北京专精特新企业招聘信息| 久久九九99| 国产久久久久久| 亚洲国产欧美日韩精品一区二区三区,国产一区二区三区在线看片,欧美性猛交 XXX | 黄色免费网| 中文字幕精品探花视频| 边做饭边操逼逼| 操逼无码操逼| 日本日皮视频逼| 婷婷丁香成人| 天天天乱色综合全| 天天爽入口| 日韩9区| 啊啊啊啊啊啊好多水| 亚洲春色欧美激情自拍| 欧美疯狂做爰xxxx| 亚洲精品一二三四区| 精品九九九九九九九| 嗯嗯啊啊啊啊轻点视频| 青青青青青手机视频| 1000部熟女视频在线观看| 九月丁香婷婷色| 伊人99热| 免费超碰97久久| 热99这里有精品综合久久| 成人av在线播放| 120分钟婬片免费看| 欧美在线官网| 欧美日韩亚洲少妇寂寞影院正在播放 | 职场同事知名国产国产精品久久欧美日韩 | TS人妖另类精品视频系列| 午夜视频好爽啊| 九月丁香婷婷| 天天看高清麻豆| 搡老女人老熟女91| 看日韩操逼| 97超碰色屌| 国产后入式在线观看| 高清一区AV无码| 思思99热| 久肏视频字幕| 秋霞久久亚洲精品成人| 欧美三级免费伊人| 成年人免费观看网站| 操国产逼| 曰本精品久久久| 少妇天堂| 丁香六月综合激情| 欧美日韩97在线| 色五天伊人| 宅男91视频在线播放| 亚洲第一视频 欧美风情 日韩| 91久热| 日本污ww视频网站| 无码日韩人妻av一| 91综合国产精品| 欧美18老人禁| 天天射网| 91精品久久久久久| 极品白嫩美女白浆成人福利在线看| 青青草色插素人| 国产精品免费久久久久久久久久| 伊人成人中文字幕久久网| 大屁股熟女一区二区三区| 国产精品一区av在线| 青青操97| 精品国产乱码| 日本999精品| 国产精品免费日韩| 亚州色图欧美| 黑人嘿嘿嘿超爽免费视频| 99热 按摩 日韩| 一二三四视频中文字幕在线看| 玖玖97综合 | 一二三四视频在线社区中文字幕| 国产精品女生av| 9超碰免费| 国产精品亚洲高清在线| 丝袜亚洲91| 欧美特大黄一级片片免费| 超碰一区二区| 日本大片日本一区二区免费高清| 97免费视频在线| 91九久| 日韩电影在线观看网址| 97超碰亚洲| 被窝影院午夜看片无码| 是还免费视频1727我| 操比国产| 欧美人妻制服| 熟女天天干| 亚洲精品无码成人久久久99| 国产精品97超碰| 99热综合| 一区二区三区亚洲| 色天使AV天堂| 色九九九| 免费αV在线视频| av东京热男人的天堂| 综合自拍| 亚洲一区中文精品| 精品视频一区二区| 91在线美女| 国产又大又硬又长又粗| 中日韓欧美高清| a片亚洲一本通视频| 牛牛aV| 人妻天天爽天天爽三区| 亚州色图欧美| 色欧美天天| 萌白酱自拍视频| 色欲天香天天综合网-成年人三级片网站-欧美乱妇狂野-日韩国产专区-久久久久久 | 久久久久久欧美精品se一二三四| 亚洲国产精品无码AV久久| 嗯嗯啊啊好大好爽| 午夜天天碰综合视频| 国产女人与拘做受视频免费| 日韩熟女精一区二区三区不卡| 美女的肌被草喷水视频| 免费观看欧美日韩操逼视频| 韩日性爱av| 久久产精品一区二区三区电影| 96久久久精品| 麻豆天美制片厂网站视频| 美国日韩黄色片| 色翁荡息又大又硬又粗又爽| 欧美综合亚洲综合| 91成人亚洲色图| 免费成人在线熟妇网| 欧美亚涩| 任你草| 欧美性爱1080p| 国产色综合亚洲色综合吹潮| 国产激情在线| 久射吧| 青青青草伊人精品| 欧美性生活内射| 久九干| 99热这里只有精品8| 无码av永久免费专区网站| 97亚洲综合| 中文字幕精品探花视频| 久久爱97| 欧美春色| 亚洲男人天堂网站| 精品久9| 国产美女91| 小骚逼被操的爽不爽| 精品视频97| 久久熟女人| 久久久久久性爱片| 一二三区在线| 爆乳免费黄网站| 大香蕉色十月| 夜夜高潮夜夜爽高清视频一| 亚洲色堂免费视频| 大香蕉免| 欧美色色人| 国产九区| 九九九只有精品| 偷拍五区| 亚洲国产97在线精品一区| 九九九九免费视频| 啊啊啊骚| 日骚逼视频| 九九九九热| 欧美日韩亚洲天堂| 亚洲最新Av| 在线有码中文字幕| 国产精品干干干| 不卡啪啪视频| 99热综合| 亚洲自拍一区夜夜操| 亚洲揄拍网| 91热色| 欧美青青草视频| 国产9l 大屁股| 亚洲精品久久久久毛片A片拉屎| 欧美性爱第1 页| 日韩免费高清大片在线| 国产精品极品美女视频| 日韩精品中文字幕二区| 欧苏综合色综合| 久久久国产精品人妻丝袜| 啊啊啊好湿久久| 亚洲综合小视频小说在线观看| 亚洲的天堂网| 欧美激情精品| 亚洲 自拍偷拍 欧美| 国产大学生口爆吞精合集| 色5月婷婷| 亚洲熟妇丝袜在线观看| 国产日韩中文字幕欧美| 日韩国产精品人妻无码久久久| 伊人久久综合影院精品久久久| 国产18精品亚洲精品| 亚洲色图久久成人| 韩国毛片一区二区三区| 伊人网高清| 久久精品高清AV| 大香蕉碰| 91蜜臀人妻中文字幕在线| 一级AV性爱| 国产福利第一视频| 99色热| 精品一区二区三区最新| 夜夜国产一区| 91欧洲国产成人久久精品网站| 免费啪啪一级视频| 高凊专区人人操| 中文字幕精品亚洲熟女| 尤物视频视频官网| 激情综合五月| 99热99re6国产在线播放| 国产高清成人免费视频| 丁香五月影院| 日韩一级二级三级免费看完整版国语版| 综合色好色| 欧美十八禁网站| 欧美97在线观看| 欧美精品69性爱| 日韩中文欧美| 99在线观看视频在线高清| 亚洲日韩视频二区| 一个人在线看的黄色电影网站| 欧美性少妇| 九九探花视频在线观看| 在线一区| 操逼逼一区视频| 啊啊啊啊啊操我视频| 超碰精品97| 麻豆国产免费影片| 在线五区| 狼人久草| 97鸡把在线视频| 久操不卡视频| 欧美日韩亚洲少妇寂寞影院正在播放 | 亚洲性综合| 日韩免费大片一级播放| 天天综合网久久ww| 五月丁香激情四射| 蜜色网色哟哟| 91 欧美| 麻豆久久久久久久久丝袜| 大香蕉中文201| www.久久爱| 亚洲影视第一页| 日本www操操操| 欧美淫乱视频| 99人人干| 青娱乐淫乱1314| 九九久久久九九| 粉嫩av平台| juliaann丝袜大战黑鬼| 先锋影音av先锋一区| 性色av一区二区| 三级激情网站| 拍拍拍拍大尺度黄色三级片拍拍拍拍拍照 | 国产女人和拘做爰视频 | 一区二区三区一亚洲中文字幕、综合区灬 | 草草影院最新网址| 台湾肥佬网一区二区三区| 八戒午夜福利理论片| 亚洲男人的天堂在线看| 色色香蕉| 嗯嗯啊啊啊好爽| 97干日韩| 香蕉久久AⅤ...| 少妇大屁屁| 天综合网| 一线黄色免费性爱片| 欧美综合 站| 激情色播| 91在线观看,天天综合| 天天干天天操天天拍| 国产精品盗摄 偷窥盗摄| 熟女网站最新| 夜夜爽33333| 婷婷色色五月天福利| 精品人妻一二三四区视频| 亚洲中文字幕网| 色综合加勒比| 中文字幕无码不卡啪啪| 亚洲色图大香| 性色av蜜臀av色欲aV| 人妻欧美| 国产亚洲日本| 欧美熟妇视频| 久久国内| 亚洲欧洲无码bt精品合集| 97精品视频在线| 嗯嗯嗯嗯啊啊啊好紧好大| 日韩视频啪啪| 尤物av网站免费在线播放| 中文字幕无码不卡啪啪| 白丝AV网站| 日韩精品一区的| 国产一级高跟丝袜| 97精品一区二区三区免费| 色网综合网| 亚乱色| 岛国黄片网站| 亚洲综合第一页| 97超色| 夜夜综合| 欧美 亚洲 偷拍自拍| 精品人妻1区| 无码人妻1727| 91热色| 色麻豆AV| 好吊妞转入那个网| 大香蕉丝袜一级片| 国产福利小视频高清在线观看| 99色网| 天天伊人| 97av在线观看| 久久9免费视频| 欧美综合 站| 中美日韩毛片| 99999精品成人| 欧美 中文字幕 一区| 五月丁香六月婷综合成人综合| 在线看片国产精品每日更新| 久久超碰国产一区二区三区| 中文字幕丰满人妻日本| 欧美天天射| 99热欧美| 男人天堂新| 午夜操一视频一区| 亚洲色婷婷综合久久久久中文| 久草成人影片| 天天综合网~91综合网| 国产视频小说| 97视频在线观看播放与子乱对白在线……| 久青草影院| 亚洲成人碰碰| 日本 欧美 亚中文字幕| 中文字幕二区日韩天堂| 亚洲国产欧美日韩人妻日中文| 激情综合五月丁香| 正在播放:深夜激情大战,自带黑丝袜全力输出骚穴 | 人妻日日夜夜精品| 第四色色综合91| 久久久不能久久久久| 欧美一区二区在线资源| 亭亭丁香激情| 欧美在线大香蕉| 白 大 人妻 区 在线| 夜夜久久| 人妻少妇久久| 亚洲区 欧美区| 精品999一区二区| 极品销魂美女一区二区| 国产毛片毛片4p懂色| 午夜乱轮操逼视频免费看| 久久男人精品| 日本一区二区成人在线| 五月婷婷综合网| 日韩欧美经典在线观看| 国产精品老师| 干B视频伊人网| 少妇人妻精品| 久久精品无码熟妇一区二区三区视频导航 | 欧美亚洲涩涩| 五十路熟女,国产欧美精品区一区二区三区 | 秋霞一级鲁丝片A片| 亚洲国产精品成人综合| 国产精品无码AV网站| 乱色视频中文字幕| 久久男人的天堂国产| 9999伦理视频| 亚洲色丰满少妇高潮| 久久久久久久综合,国产| 97chaopengongkai| 少妇人妻太紧太深av| 无码聚合| 国产日韩精品一区二区三区| 久久久久久久久久黄色网| 校园春色美腿丝袜 | 一二三区精品视频| 一区二区三区美女超清| 国产视频一区二区免费| 久久婷婷在线观看视频| 国产一区二区在线播放,久久亚洲精品中文字幕第一区,亚洲精品在线中文字幕视频 | 97爱免费插| 美女网站黄页| 精…码一二三区| 99热只有这里有精品| 久久理论字幕视频| 97国产精品久久久久| 台湾一区国产高清在线| 久久久婷婷婷| 操B久久| 啊啊啊想要| 成人美女av| 一区二区三区四区五区高清无码永久视频 | 中文字幕精品久久久久人妻红杏ⅰ| 青青草综合在线| 成人性爱视频在线看| 亚洲91av| 中文字幕在线第二页| 最新av网站在线观看| 亚洲AV成人在线| 九热超碰| 很黄很色的视频在线观看| 91国产精品在线看| 激情内射| 爆操无码| 色色99| 自拍偷拍第26| 啊嗯好大视频在线观看| 亚洲成人在线乱码色午夜| 国产无马视频| 蜜臀av一区二区三区免费观看| 人妻丰满熟妇av无码区蜜桃| 日韩成人精品视频自拍| 超碰97资源中文字幕| 91丝袜| 日本在线一二| 久久久久久久久久久精| 无码免费精品高清| 91少妇通奸网站| 琪琪精品免费一区二区三区| 97久久超碰国产网站| 成人精品无码| 黄污污污污| 女生久久网| 婬女免费一二三区A片| 欧美色图在线视频少妇| 围产精品一区二区三区视频播放| 日日干夜夜操视频h| 日韩性爱小视频| 2025亚洲男人天堂| 久久久97| 久插综合| 精品人妻av在线播放| 天天日天天舔东京热| 第四色奇米影视777| 欧美日韩亚洲天堂网| 久操操AV电影| 99国内熟女露脸视频| 欧美久久伊人| 夜夜国自区| 日韩人妻资源在线看| 97超碰伊人| 天天干一干| 久久久久亚洲Av无码专区老牛影视| 日本超碰在线国产一区| 男女性无套 免费九一| 国产污视频麻豆传媒一区二区 | 亚洲国产一级中文综合久久天堂在线免费观看| 欧美精品成人一区二区在线观看 | 人人弄人人摸| 嗯~啊~快点 死我视频| 极品销魂美女一区二区| 欧美亚洲日韩16色| 亚洲性爱乱操x| 国产精品69久久久久孕妇欧美| 激情五月天色色网| 果冻传媒一区二区三区| 水野优香在线观看| 在线中文字幕| 久久久成人精品| www.99热| 强被迫伦姧在线观看无码网站| 98精品国产乱码久久久久久| 自拍大香蕉乱插| 精品国产乱码久久久久久蜜臀| 日韩亚洲美女一区久久| 久久久久久电影| 色97欧美| 亚洲熟妇图片| 日本三级R| 人人么人人操| 综合大香蕉美。| 97中文天堂| 国产精品69人妻无码久久久| 国产又大又粗又长视频| 九九九久千久久激情蜜桃在线看 | 久热这里| 日韩激情啪啪啪| 久久久久久十| 九热大香蕉| 欧美操逼一二三区| 国产精品探花视频| 超碰社区97| 九九热免费国产视频婷婷伊人五月 | 九九AV| 色色网91| 欧美色交| 夜夜嗷嗷一区二区| 日本污ww视频网站| 亚洲精品欧洲色| 久久亚洲天天做| 婷婷五月天久久久| 翔田千里AⅤHD无码| 亚洲在线观看| 麻豆婷婷成人一二三| 一级片在线观看高清无码| 高精欧美色| 素人无码中文字幕| 91偷拍欧美亚洲| 一品道视频一区二区三区| 国产自产一区视频在线| 操操操五月天婷婷丁香影院| 加勒比海人人操超碰在线| 黄资源| 97人亚洲综合字幕| 亚洲欲色9532548967一区| 免费αV在线视频| 水多多映视AV| 超碰地址久久| 国产精品国产| 女人一区| 成人网欧美风情| 亚洲 日韩 欧美 国产综合体| 97chaopenrihan| 玖玖爱综合| 涩五月婷婷| 国产精品麻豆免费视频| 欧美男人天堂| 天天久久| 亚洲黄色| 三久久久四久久久久| oumeizonghese,www| 91亚洲不卡一区| 成人夜夜爽| 久久久久久久一级黄色打同平台| 亚洲AV成人无码久久精品播放| 国产 日韩 欧美 中文 另类,国产 欧美 另类 制服 变态,高清 日韩 欧美 中文,高 | 日韩AV噜噜噜一区二区三区四区 | 天天看,天天做| 久久精品中文字幕无码l| 亚洲1区2区三区高清中文字幕| 日本免费中文字幕在线| 久久久久久久免费A片国产成a人亚洲精∨品无码 | 91网站18在线| 97久久超碰国产网站| 少妇人妻精品| 亚洲欧洲无码一区夜| 亚洲永久永久永久永久一级一级一级精品 | 青青草在线视频美女| 97欧美色综合| 久久97视频| 九月伊人中文字幕| 日本媚薬中文字幕在线| 亚洲综合首页| 欧美大香蕉久| 国产白丝精品在线观看| 99e久久国产精品| 亚洲91在线播放影院| 日韩在线观看字幕精品| 97国产高清视频在线观看| 九色婷婷| 青青国产精品在线| 啊嗯好大视频在线观看| 97在线青| 精品久久久久综合无码| 欧美亚洲综合高清在线| 精品国产91内射久久| 色噜噜精品一区二区三| 91碰超| 色情五月综合婷婷| 成人AV素股で擦久久| 欧美精品三区| 老司机福利社视频在线观看| 香蕉视频欧美一卡二卡| 看免费的黄片| 欧美三级中文字幕hd| 亚洲天堂男人在线| 97色妞| 亚洲天堂情色| 男人天堂新在线| 蜜乳av一区二区| 99自拍视频在线| 中文字幕 一区二区 亚洲无码| 1024手机看片欧美日韩| 熟妇人妻丰满久久久久久久无码| 亚洲国产精品无石码久久| 777AV电影| 91neishe| 九九人妻| 老司机午夜精品视频| 国产剧情AV不卡在线观看| 久久人妻97久久久久久久| 欧美97视频| 天天躁日日躁狠狠躁| 91成人久久| 五月婷婷六月丁香| 亚洲欧美日韩国产丝袜自拍中文| 超碰97COm中文| 永久免费发布性爱网| 日韩人妻资源在线看| 操逼短片| 国产中文字幕在线点播| 四虎影院成年人片| 欧美午夜视频| 国产精品白丝在线播放| 99亚洲精品| 国产熟女二区| AV麻豆免费一区| 一道本久久棕合爱| 日韩精品影视| 精品成人无码| 极品粉嫩一区二区| 午夜在线播放| 国产一级作爱毛片| 一牛一区二区三区久久| 国产精品人妻免费精品| 久久社区一区二区三区| 爱干爱射网啊啊啊| 久操97| 999在线电影香蕉| 日韩干B| 俺去俺来也在线www| 色综合99999| 国产日产精品久久快鸭的功能介绍| 91碰碰碰| 日韩在线电影| 亚洲综合激情五月久久| 欧美A√综合网 | 天天上日日上日韩精品| 亚 欧 美 综合| 加勒比久久av| 香蕉热人人精品| 蜜臀99999| 欧美日韩另类在线播放| 日韩99神马视频播放片在线播放| 国产精品久久久久久久久久久久久久| 美女自卫慰黄网站免费| 久啪视频| 在线国产一区二区av| 天天综合网合集91| 国产精品久久久久久久久AV大片| 操我啊啊啊啊啊| 日本一区二区亚洲综合| 欧美一区二区在线资源| 无码免费在线观看黄色片| 亚洲日韩肥臀视频在线观看| 欲香欲色| 色五月天AV| 福利社区午夜一区二区| 亚洲欧洲日产国产综合网| 亚洲国产成人福利在线观看| 成人在线午夜视频一区| 日韩熟女无码| 丝袜美腿校园春色| 婷婷激情五月天小说网| 88在线一区二区三区| 四虎影院成年人片| 91殴美| 欧美 日韩 国产传媒| 国产传媒操逼视频| 色欧洲97| av九九| 国内毛片欧美香蕉精品| 97色色,97综合| 91c色| 91精品导航| 亚洲色图a| 亚洲欧美高清无码| 亚洲美女色图| 毛片电影一区二区三区| 欧美人妻少妇| 一区二区三区精品黑丝白丝酒店对鸡| 亚洲精品一区二区日本| 婷婷15月天青娱乐| 久9热| 亚洲一区二区在线观看91| 日韩人妻精品中文字幕| 大香蕉乱伦视频网| 91av熟女人妻| 久久99精品国产| 99热精品在线观看| 五月婷婷丁香六月丁香| 热G综合热G中文| 啊啊啊好爽快点啊啊啊嗯嗯| 人人看人人插| 欧美96在线|欧| 2019天天操天天爽天天拍| 国产一级作爱毛片| 亚洲无 码A片在线观看麻豆| 日韩精品三级片长长久久| 六月激情婷婷| 欧美成人一级麻豆| 欧美日韩中国x| 91最新综合| 人妻22p| 9国产超碰| 九t超碰| 大屁股国产在线视频| 久久一二区四| 人妻中文字幕日韩电影| 国产精品一区二区手机看片| nuu12国产麻豆精品| 操人妻逼91| 99天堂网| 顶级丝袜熟女一区二区三区| 欧美色亚洲| 欧美草草高清日韩视频| 亚洲色图加勒比| 中出91| 婷婷五月天激情网| 美国精品国产精品| 免费视频一二三区| 亚洲中文字幕久久无码精品| 精品无码人妻一区二区免费蜜桃| 国产剧情一区在线观看| 国产极品99热在线播放69| 成人毛片免费| 99热在线播放| 97在线/亚洲| 99999久久久久9国产精品| 五月天婷婷基地| 国产美女高潮叫床视频| 日韩 欧美 视频 在线 一区| 亚洲在线观看| 国产九九久久久精品| 欧美一级A片不卡视频。| 国产熟妇 码视频户外直播| 午夜精品久久久99热蜜桃的功能特点| 操b网站亚洲无码| 啊灬啊灬啊灬啊灬高潮奶出了免费视 | 无码逼| 日日干天天干夜夜爽| 澳门特级毛片免费观看| 久久成人国产| 午夜影美女日鸡鸡天天视频国产| 日韩av不卡在线看| 日韩三级伊人| 秋霞Av理论一级在线| 日日夜夜摸| 激情综合网亚洲| 九九九九热只有精品| 欧美在线综合| 伊人久大| 天天天干977| 天美传媒婬乱在| 91色插| 九九无码| 色欲Av人妻精品一区二| 日日操免费视频| 亚洲第一免费视频| 国产最新小视频在线播放下载| 大香蕉一区二区在线观看.| 亚洲 日本 国产 综合| 亚洲精品一二区| 丁香六月激情| 欧美成人黄网色网站| 十八禁视频网站| 七久久久|