日韩精品一区二区三区在线视频放-无码中文字幕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
返回資訊列表
国产亚洲 中文欧美久久| 男人天堂2030| 日韩啪啪啪视频| 国产熟女完整版中字| 久久手机视直播| 亚洲麻豆18发?| 亚洲人妻久久| 午夜男女爽爽爽在线视频| 67194无码不卡| 国产精品久久久久久9999| 一区二区三| 色五月av| 日韩一级二级三级| 人妻乱仑一区二区三区| 热热热热日日漂亮永久永久国产日| 美女性91| 狠狠干狠狠色| 妇女性内射冈站HDWWWCOM| 91啪啪视频| 夜夜夜夜爽| 久久社区一区二区三区| 精吧天堂| 婷婷综合网| 欧美人妻少妇| 麻豆精品A片免费观看| 国产粉嫩蜜臀av一区二区三区| 99热久| 青青三级视频| 日本午夜久久电影| 免费A片三p视频| 77777亚洲蜜臀精品久久综合蜜臀| 黄色工厂这里只有精品| 色婷婷基地| 国产精品乱码久久久久久久久| 国产懂色精品国产av| 成人精品欧洲亚洲| 牛黄色久午久| 国际精品久久久| 天天日天天插| 国产极品粉嫩馒头一线天av| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师 | 色第一页| 国产麻豆福利av在线播放| 91精品国| 天天操狠狠日夜夜干超碰撸com视频在线观看| 五月天婷婷社区| 青青草操逼逼视频| 9999久久久| 九九英色视频| 人人妻人射| 亚洲欧美91√| 97人人干| 欧美性爱日韩高清| 欧美色图在线视频少妇| 亚洲天天自拍| 91大神电影天堂| 日韩有码 一区二区三区| 97超碰中文| 亚洲九月丁香| 国产精品久久久久久久无码AV| 国产精品久久久久久夜夜夜| 天天躁日日躁AAAXX| 精品国产乱码久久久影院| A久久| 成人av毛片在线观看| 99操| 精品十三区| 操逼网免费无码视频| 91中文字幕在线观看| h在线看免费版在线看| 天美传媒婬乱在| 国产又大又粗又长视频在线| 人妻久久久| 日韩欧美日韩| 91天美免费| 亚洲欧美校园另类春色| 日韩精品中文字幕一| 四虎精品永久在线观看| 五月天色电影| 3571色综合一区二区二区| 啪啪啪东京| 午夜福利 成人 91| 欧美视频第二页| 日韩不卡av一二三| 欧美性爱伊人| 激情看片网站| 午夜一区二区三区国产| 六月婷婷综合| 久久婷婷精品| 欧美很很操视频| 亚洲精品一区二区精品| 亚洲激情片| 91女优在线观看| 欧美老熟另类| 密桃99999| 中文字幕精品一区二区精| 免费国产视频| 日韩有码专区| 久草新在线| 久久久久九九九九九| 亚洲 图片 欧美 色图| 99热婷婷| 国产成人资源| yirendaxiangjiashipin| 无套内射性感少妇视频| 少妇xx精品| 久久精品久久久久久久久| 97在线视频免费看| 水滴偷拍| 97色亚洲| 啊啊啊免费视频| 九九五月天| 日韩大香蕉AV影片| 中文字幕在线免费观看 | 日韩午夜国产| 91网站18在线| 综合网97| 精品人妻伦一区二区三区久久| 国产精品suv一区| 欧美色图片91| 淫乱图区 | 免费看黄视频亚洲网站| 操操逼操操逼操操逼逼| 樱花蜜乳av| 国产一区二区免费福利片| 婷婷色综合欧美日韩| 视频黄站| 97ai亚洲| 欧美宗合色| 中国91AV| 欧美日韩国产一区二区小黄片大全| 97精品免费视频网站| 视频不卡中文字幕| 欧美人与动性人交a| 岛国免费黄色网址| 国产一级做a爰大片免费久久| 激情无码日韩| 91Chinese在线| 色99色| 99久久久无码| 好吊爽好吊爽在线视频,中文字幕精品一区二区日本,国产良妇出轨视频在线观看, | 新版天堂中文资源8在线| 亚洲自拍天堂| 95人妻爽爽人人做人人澡 | 国产三区免费在线观看| 日本污ww视频网站| 色婷婷综合久久久久中文国产精品一区中文字幕,国产福利电影一区二区三区 | 日本精品第一视频在'| 青草av在线| 色色热| 青青草精玖玖69精品| 超碰在线综合97| 加勒比99999| 黑人综合网| 国产精品视频麻豆入口| 欧美99| 国精品一区二区三| 夜夜操一区二区| 亚洲图片欧美偷拍| 国产一级舔足在线观看| 精品亚洲黄色片 国产精品导航一区二区 | 日韩欧美女求操每天更新| 欧亚日韩中文在线| 人人摸人人叼| 清柠毛片| 噜噜噜久久亚洲精品色情| 久久久九九| 久久风骚城市| 17c嫩草51久久91嫩草| 天堂俺去俺来也www久久婷婷| 无码一区二区精品视频久久久春药| 中文字幕乱在线伦视频中文字幕乱码在线| 日本色婷婷| 欧美 日韩 国产传媒| 国产中午字一暮区| 豆花视频操逼网址| 999岛国大片| 日本精品人妻少妇一区二区| 伊人91| 老司机老司机午夜影院| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 91精品人妻一区二区三区蜜桃| 亚洲字幕一区二区| 亚洲人妻熟妇三十三区| 少妇高潮九九九九| hd成人一区二区在线| 在现视频女上位好爽| 久久久久婷婷精品av电影| 黄视频免费| 欧美国产日韩高清在线| 狠狠图片青青草| 91九九| 九九无码视频| 亚洲综合校园春色| 黄片com.| 91超碰碰在线| 美女操逼A A| 男人的天堂2019AV| 亚洲色欧| 国产亚洲禁久一区二区| 嫩草伊人久久精品| 呦呦影院| 亚洲色鬼| 精品一区二区三区国产| 国产成人亚洲精品自产在线| 狠狠爱夜夜| 久久AV无码网址| 久草精品国产蜜臀| 日韩欧美大片免费高清啪啪| 蜜桃久久综合视频| 大香蕉免费3| 亚熟在线| 日本成人免费一区二区三区| 亚州色站 日韩电影| 国产美女高潮| 美女高潮视频91| 久久大黄片| 国产精品一区二区在钱播放| 欧美亚洲情色| 美女的肌被草喷水视频| 深夜福利黄片| 国产精品suv一区| 男人的天堂亚洲| 99色在线| 亚洲AV成人无码一区二区三区在线观看 | 免费成人自拍视频在线| 天美麻豆精品视频99| 久久久久久九九九| 精品视频97| 91一区二区三区蜜桃| 亚洲城人男人的天堂| 新亚洲无码| 天天天肏屄欧美| 国产欧美在线观看免费观看| 欧美婷婷久久| 日韩亚洲中文字幕在线| 易易A毛视频| 天美麻豆精品视频99| 99无码| 欧美综合色站| 99这里只有精品国产| 91美女色视频亚洲| 欧美99热| 精品人妻一二三| 日韩一级二级在线| 18禁精品网站在线看| 97欧美色综合| av大香蕉| 自拍偷拍国产欧美日韩韩| 99re69| 国产精品久久久久久久AV大片| 精品人妻一区二区乱码一区二区| 丝袜熟女一区二区三区| 欧美天天性| 久久超碰av在线| 久久99网站| 国产区日韩区在线观看| 热热热热日日漂亮永久永久国产日| 中文字幕123| 美女黄页网站| 亚洲综合888| 香蕉人人操tv| 国产在线视频午夜精华在 | 大香交伊人网| 天天搞在线综合网| 春色91| 99蜜桃臀亚洲成人在线观看| 色婷婷丁香五月| 免费黄色片。| 丝袜 中出 制服 人妻 美腿 中文字幕| 偷拍 精品 另类 四区| 综合欧美激情网| 成人国产二区三区在线,男女精品。| 精品人妻一区二区三区-国产精品| 秋霞免费AV| 亚洲一区二区在线观看91| 国产精品人妻一区二区| 久草色在线观看| 亚洲。日韩。欧美| 超碰91在线| 多毛小伙内射老太婆| 亚州综合色| AV色五月天| 欧美亚洲一区二区久久久婷精品大包诱| 少妇一级婬片免费放一级a性色.| 999综合网| 啊啊啊啊啊啊啊啊要喷了| 欧美久久草熟女| 久久婷五月| 日韩精品资源专区二区| 色图综合| 校园春色亚洲色图| 大干人妻| 九九九久| 色综合1991| 人妻酒店出差被中出免费在线播放| 丁香六月激情综合| 人妻少妇视频在线播放| 狠狠操狠狠| 操我无码| 97干在线| 激情五月婷婷| 亚欧精品久久久久久久久久久| 福利在线黄片| JULIA一区二区三区在线播放| 日韩欧美tv一区二区在线观看| 国产老太乱伦一区| 亚州综合在线| 精品美女久久久久| 日韩久久.一级黄色片| 日韩免费a级毛片无码a∨| 精品午夜福利| 亚洲成人性爱网站在线播放| 26uuu国产亚洲综合| 国产真乱mangent| 国产婷婷综合在线观看| 国产精品原创巨作?v网站| 亚洲电影中字一区二区| 国产粉嫩蜜臀av一区二区三区| 欧美一级二级三级| 成人怡红院| 精品在线蜜臀| 国产狂喷潮在线精品| 韩国免费播放一级毛片| 欧美日韩国产三级黄色| 免费强奸av| 欧美日韩国产色图在线| 超碰成人免费| 白丝1区2区3区| 欧美天天综| 青久操| 青青草好吊| 天天影视综合色| 日韩性色| 乱性AV| 天天享受天天看| 亚洲人在线| 熟妇高潮一区二| 亚洲欧洲激情| 免费精品无码一级毛片牛牛影视| 久久久久久久久久久免费精品| 久久亚洲欧美中文字幕国语 | avav青青草久久夜| 91操操操操| 久久黄色视频一区二区三区| 91小视频| 亚洲国产欧美日韩精品一区二区三区,国产一区二区三区在线看片,欧美性猛交 XXX | 久久99草| 国产尤物在线三区| 内射夫妻三片| 女人被添高潮免费视频| 色91综合网| 97情超碰色| 欧美天天综合| 丁香五月综合| 嗯嗯啊啊操死我| x97av| 久久区| 一起草日韩| 又黑又大又粗| 日日躁狠狠躁天天躁精品| 香蕉国产精品麻豆亚洲欧美日韩| 97av在线视频| 久操视频免费观看| 国产高清亚洲日韩一区| 熟妇操花| 久久亚洲不卡一区二区三区| 天天欲望网| 嫩呦国产一区二区三区AV| 男人的天堂2019AV| 在线色资源| 小说区 图片区色 综合区| 亚洲无码久久久久久久| 深爱五月天| 性一交一乱一交A片久久四色| 免费在线黄片视频| 97色97好| 欧洲在线性爱视频| 欧美亚洲日韩人妻在线观看| 欧美最大综合网| 在线播放成人高清免费视频| 亚洲色图久久精品蜜| 亚洲中字慕不卡| 国产一级黄色片在线观看| 国产熟妇一区二区| 人人操人人舒服| 久久亚洲骚逼综合| 91美女片在线| 偷拍亚洲| 青久操| 欧美日韩国产电影| 屁股久久久久久久久| 精品人妻一区二区三区-国产| 香蕉大久久久| 欧美特大黄一级片片免费| 日韩精品影视| 日本超碰97日韩精品人妻| 97频视在线| 成人线上超碰| 亚州再线| AV污污污污| 啊啊啊啊啊舒服| 吖在线不卡一区二区国产剧情 | 国产探花精品在线| 国产成人啪一区二区| 色狠狠综合| 亚洲高清欧美总合| n1038 一二三区| 亚洲精品xxx| 亚洲人妻久久久| 亚洲综合色网| 亚洲天天操| 老熟女区| 一级免费啪啪片| 久久久亚洲熟妇熟女| 午夜天堂精品久久| 久久久久久久久久8888| 久久亚洲中文字幕视频| 色偷偷超碰亚洲| 天天爽天天爽| 家庭乱伦网站国产| 九九AV| 麻豆影音天美视频| 天天干天天拍| 日韩午夜精品一区二区三区电影| 另类图片综合| 影音先锋乱伦资源| 老司机午夜精品福利视频一区二区| 激情综合五月| 亚欧Av| a亚洲欧美色欲| 婷婷激情四射| 人人妻人人色一区二区三区| 熟女一区二区三区| 可以看的av| 免费强奸av| 91av一区二区在线观看| 97欧美超碰| 久久久999国产精品| 大香蕉伊在线久草麻豆天堂故事| 麻豆精品久久久久久久| 五月天激情四射| 破苞ⅩXXX性无码动漫无码| 欧美精品精品一区二区| 97干在线| 人人弄人人摸| 国产精品直播在线观看直播| 人妻夜夜爽天天爽三区麻豆AV网站| 大香蕉视频一二三区| 91五十路| 精品久久久久黄少妇| 免费av高清无码| 亚洲欧洲第二视频在线观看色图| 97玖玖人妻| 91N欧美| 中文字幕文字幕无码一区二区三区电影99| 超碰在线香蕉| 国产97视频免费观看| 国产51色综合久久免费| 亚洲日韩美国人妻| 国产操逼逼网| 91精品大奶人妻| 91碰碰| 中文字幕第页| 91模特在线观看| 2017天天透天天通天天擦| 黑人粗大V S日韩女优视频| 久久久精品一区二区| 死我十八禁| 91精品人妻一品二品三品| 日韩精品人妻| 芊芊操逼视频无码| 久久艹逼视频| 97操97色| 99热国产| 亚洲中文字幕在线视频一区二区| 内射夫妻三片| 国产精品视频精品一二| 天天综合色| 亚洲精品男人的天堂| 大香蕉十区| 96精品一区| 精品人妻一二三| 玖玖玖玖精品国产剧情| 天天操狠狠日夜夜干超碰撸com视频在线观看 | 任你爽视频| 成人女人国产| 啊啊啊啊好疼| 青椒国产97在线熟女| 五月激情小说| 蜜桃一区二区三区| 97香蕉网| 亚洲激情AV| 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | 啊啊啊啊啊啊啊啊啊啊在线观看| 性色综合网| 国产操偷| 无码视频一区二区| 久久天堂婷婷网| 久操九九九九九九九九九九九九九九九九九九九九九九九九九九九九 | 成人网欧美风情| 欧美日韩天堂| 国产一区二区三三视频| 夜夜一区二区| 亚洲97资源| 久久夜黄色无码A级大片| 久久久久久久久久久六六| 天天干18禁| av在线观看不卡网站| 开心五月婷婷| 久热精品在线| 爽 好舒服 无码刺激久久| 人人噜夜夜操| 一起草欧美| 久久久久久中文版| www.色吧5.com| 久久国产视频专区一二三 | 日韩图区| 涩涩这里只有精品视频| 欲射影视| 亚洲av综合色区无码一| 国产高清在线自在拍69| 日本性爱网址| 久久久一区二区三区麻豆| 亚洲色图亚洲无码强奸乱伦| 941超碰| 国产精品久久久久久 百度| 人妻少妇久久| 丁香五月影院| 东京热双插| 91oumei| 天天插网| 91精品国久久久久久无码| 亚洲成人一区二区精品| 日本性爰一道本| 欧美日韩国产男人| 亚洲二区精品在线观看| 97公开久久| 久久人妻| 欧美天堂日韩三级国产传媒| 日韩亚洲中文字幕在线| 女人喷水视频在线观看| 欧洲乱码视频| 无码99| 国产成人自拍视频在线| 青青草字幕AV| 久日综合网| 美女操逼A A| www.色操逼| 欧美高潮| 操逼不卡中文字幕| 天堂精品一区| 蜜桃视频精品一区二区| 日本操逼视频免费| 亚洲精品 欧美精品| 国产乱伦搜索结果91P| 九九热超碰97亚洲最新香蕉| 欧美大香蕉专区网| 青草影院内射高潮| 高清无码网址| 操操操五月天婷婷丁香影院| 国产亚洲精品美女| 激情五月婷| 国产一国产一级毛片古装| 亚洲五区熟女| 欧美啪啪女女| 美女裸体无遮挡永久免费观看网站| 久草资源在线视频官方总站日韩丝袜美腿| 精品视频免费在线一区| 久久嫩草| 情侣操 逼视频99| 五月婷婷性爱| 中文字幕一二区二三区人妻专区| AV中亚| 国产精品视频播放| 另类小说五月天| 乳欲人妻办公室奶水| 91美女国产在线| 大香蕉伊人亚洲| 亚洲一区二区三区四区视频| 欧亚日本情色| 啊啊啊com| 中国亚洲呦女专区| 黄色一级视| 中文字幕一区二区三区视频播放| 操一操摸一摸| 97在线视频网站| 亚洲欲| 蜜伊人色综合97| 一区二区激情国产熟女 | 91美女丝袜诱惑视频| 亚洲一区中文精品| 亚洲欧美日韩不卡人妻| 一本色道久久综合狠狠操| 久久久久骚| 亚洲av综合色区图片亚洲| 亚洲色欧美| 啊啊啊啊好爽好舒服一区二区易域| 综合激情一一91| 西西美女视频网| 黄网站黄视频网站进入口 | 草草草草视频| 欧美日韩在线视频网站| 老外又粗又长一晚做五次| a'v在线资源| A 天堂| 美国日韩黄片| 69视频入口| 综合亚洲欧美精品日韩?v| 九九九色| 精品亚洲成人免费在线| 韩三级a视频在线观看| 成人26uuu| 1769国内精品视频| 天天干天天操天天干天天操| 亚洲AV免费在线| 色香蕉影院| 亚洲蜜乳av| 抽插无码高清一区| 精品色色| 五月丁香在线| 北京美女一区二区| 97操B| 三及片网站| 黄色无码高清黄色无码网站| 久久久噜噜噜久久久| 久久9亚洲| 伦在线97| 免费操逼91| 亚洲熟女性高潮久久久| 99re久久| 天堂伊人久久| www.人人摸在线视频| 欧美精品三区| 久久香蕉国产线看观看猫咪av| 思思热免费视频观看| 伊人久久大香线综合无码| 九一性生活免费视频| 亚洲a色| 欧美人妻久久精品二区三区| 日韩人妻资源在线看| 久久av网| 波多野结衣之双飞调教在线播放| 丁香九月激情啪| 香蕉久久精品| 84YTCOM性无码| 乱色视频中文字幕| 老女人91| 国产日韩区| 手机不卡视频不卡在线一二三区| 日韩欧美久久婷婷网站| 人妻色偷色噜| 婷婷久草一区二区三区| 99999亚洲另类| 日韩人妻一区二区| 69精品人人人人| 九热超碰| 97最新在线播放视频| 无码人妻一区二区一牛影视| 可乐操亚洲蜜911| 国产女人91精品嗷嗷嗷嗷| 加勒比综合九九99视频在线播放| 中文字幕乱妇免费视频| 色爱综合网| 久9综合在线| 久久亚洲AV无码专区首页| 亚熟hd视频在线| 国产一区二区在线播放量| a在线视频免费观看| 9久9久| 亚洲男人bt天堂| 亚洲美女精品九九视频| 欧美色图亚洲色图成人在在线| 一二三区精品视频| 五月天婷婷影院| 欧美色图 色综合图| 伊人97色天使| 91丨九色丨国产丨人妻在线 | 天美传媒AV在线| 亚洲乱色视频一区、二区在线| 色噜噜日韩精品| 99re6国产精品99re在线| a片 xxxx受爽视频| 青青草色插素人| 亚洲免费人妻在| 久久精品熟妇丰满人妻99| 在线另类| 午夜乱轮操逼视频免费看| 97超碰色中文字幕| 9热9热综合网| 亚洲熟女中文字幕在线| 97伊人| 欧美大香蕉97| 丁香色婷婷| 午夜视频黄| 日韩精品一区二区人人人| 蜜臀人妻少妇久久在线观看| 丰满人妻大屁一区二区| 五月丁香六月综合缴清无码| 狠狠2050在线观看| 97精彩视频网站| 青娱乐国产盛宴视频| 亚洲精品久久久久毛片A片拉屎 | 日韩有码 一区二区三区| 91天天美女| 国产盗摄美女如厕大神作品在线观看| 亚洲激情网| 精品一级毛片在线观看| 四虎av在线| av东京热男人的天堂| 区日韩亚洲乱码av电影| 欧美一级黄片免费播放| 少妇人妻好深太紧了vr91| 天天干18禁| 色综合1991| 色综合20p| 一区二区三区蜜桃成人撸久久东京热 | 福利风月五月天影院| 人妻无码一区二区三区久久99| 老色69| 亚码激情| 最新国产亚洲精品精品国产亚洲综合| 色欧美综合| 最新国产精品| 国产乱伦搜索结果91P| 少妇久久久久久| 日日骚中文字幕| 久久 精品| 国产精品久久久久9999小说| 麻豆精品天美| 夜夜爽夜夜摸夜夜操免费视频| 天天综合麻豆视频| 后入精品| 干B网| 麻豆视频一区二区| 91美女视频在线观看| 婷婷久久久精品| 国产乱码久久久| 97国产伦理| 九久9精品| 18禁无码永久免费无限制| 成人无码在线超碰网| 久久精品国产亚洲AV无码做| 天天射影院| 精品176精品2| 天天干18禁| 无码动漫av中文字幕| 国产高清MV操逼视频| 视频国产成人精品日本亚洲18| 精品免费视频国产一区| 欧美日韩国产另类综合| 亚洲无码久久久久久久| 午夜精品一区二区三区三上悠亚| 九九英色视频| 夫妻AV网站| 日韩欧美大片免费高清啪啪| 亚洲麻豆av一区二区| 男女性感激情网站| 99精品热| 亚洲精品国产av天美传媒| 999色欧美中文字幕| 草草电影院| 人人看人人插| 亚洲图片欧美91N| 密臀在线免费观看| 啊啊啊啊好疼| 成年人三级黄色片视频| 天天欧美色| 综合网亚洲1| 日韩av影片在线观看| 少好三P| 国产激情av女片自拍| 大香蕉在线视频重口味毛片在线| 狠狠超| 午夜免费视频1000| 日逼97| 久99热| 东北老熟女| 九九色图| 蜜臀99久久精品久久久懂爱| 精品视频久久久久九九九九9999| 啊啊啊啊好疼| 观看免费区二区三区二| 日韩成人性日韩成人性爱视频在线免费观看 | 日本色日夜干| 亚 欧 美 综合| 乱伦熟女论坛| 国产乱码久久久久久| 播播亚洲小说亚洲| 老熟乱一区二区三区四区| 婷婷AV一区二区三区| 亚洲成成熟女人综合一区二区| www.色五月| 最新无码国产| 啊啊啊啊啊啊啊在线| 久久久久九九九| 亚州欧美另类| 操我啊啊啊啊啊| 午夜超爽| 2017天天插| 97干天天| 屌色在线97视频| 热思思免费视频| 亚洲人精品午夜不卡| 精品一区二区啪啪啪| 人人看人人爰人人操| 99超碰网| 日本新免费二区三区| 久久久久9| 成年人网站在线免费观看| 久草精品一区 | 视频国产成人精品日本亚洲18| 亚洲国产青青| 久久久久国产亚洲一区欧美色图日韩 | 97国产精品国| 操美女高潮抽搐白浆| 国产精品分类在线观看| 久久精品电影在线| 96久久久精品| 欧美极品女人的天堂| 美女尤物人人操| 爱爱啊啊啊| 蜜乳av一区二区三区四区不卡| 色狠狠综合噜一二三区| 五月综合色| 日本韩欧美在线播放a| 日本孕妇一区二区视频操逼免费看 | 久久中日麻豆| 嗯嗯嗯嗯啊啊啊好紧好大| www.av在线观看| 久久久精品91八戒| 国产内射爽爽大片| 久久久久久久| 久久一区二区蜜桃| 九九九九九九九九九国产精品| 亚洲脚交| 全国男人天堂网| 九九九九一级| 欧美日韩人妻婷婷一区| 人妻少妇三级| 国产青青美女玩逼视频| 久操 高清| 麻豆天美制片厂网站视频| 麻豆婷婷成人一二三| 亚洲情色在线| 搡老女人老91妇女熟女| 后入式五六区| 欲色综合| 熟女少妇视频| 亚洲男人天堂AV| 日韩综合97p| 日本操逼无码| 国产一区免费午夜视频| 密乳AV免费观看| 亚洲国产午夜真人一级片中文字幕精品黄网站 | 久久久中文版| 日本精品久久久久久久| 亚洲a色| 农村女一级毛卡片| 91午夜无码| 国产一区二区三区精品观看啪| 91精品大奶人妻| 久久久久久大| 国产精品3| 欧美AB在线| 裸体女人草逼视频播放一区,二区,三区,四区,五区 | 日韩有码 一区二区三区| 成人性爱av| 无码99| 国产一区二区三区,在线观看观看| 国产AV线| AV一区观看| 国产精选三级在线观看| 91AV老熟女视频| 青青三级视频| 清纯唯美亚洲| 日韩丰满熟妇| 91国产丝袜足交精品视频| 99re在线精品78| 中国农村熟妇毛片视频| 超碰91在线| 蜜桃臀一区二区aV| 一级AV性爱| oumeisetu综合| 噜噜噜噜天天狠狠| 亚洲高清无码在线桃色| 韩国轻伦国内自拍一区| 丰满人妻-区二区三区免费看| 日韩图区 偷拍| 伊人97色天使| 97超碰人妻| 2020国产精品| 人妻少妇久久| 无码天天操| 日韩精品99久久久久久中文字幕 | 色噜噜国产在线| 成人情色综合网| av日韩国产一区二区| 久草精品热视| 试看60秒 爽| 青青草九九九九九| 亚洲国产综合图区中文字幕| a网站免费观看| 亚洲中文丝袜美腿诱惑字幕| 天天看,天天做| 色九九久九九| 男人兔费天堂| 97在线观看免费视频| 欧美亚州手机在线| 波多野结衣之双飞调教在线播放| 欧美极品女人的天堂| 婷婷色色五月天福利| 色好看av| 免费一级黄色录像影片| 天天躁狠狠躁av| 岛国精品视频在线观看| 九七超碰人人乐| 欧美淫穴| 国产成人亚洲精品无码古代早漏男| …中文字幕亚洲乱,97人妻无码费视…| 极品白嫩美女白浆成人福利在线看| 天堂亚洲精品| 亚洲丝袜B诱惑| av无码av无码专区| 亚洲色电影在线| 精品然女一区二区| 色情综合| www熟女乱伦com| 超碰欧美97资源| 九九精品美女高溯喷水| 天天插夜夜操| 国产熟妇 码视频户外直播 | 中文字幕制服欧美久久一区| 少妇一级婬片免费放一级a性色.| av草草在线电影| 亚洲熟妇乱女区二区三区| 操逼视频亚洲| 九九九久久久| 中文在线视频| 91色碰| 国内自拍 日韩激情 99| 久久人妻| 99视频自拍| 久久夜黄色无码A级大片| 97干色| 超碰97.com| 麻豆精品三区视频| 亚洲天堂性爱| 性爱综合网| 国产精品无码在线| 另类小说综合网| 久久九色| 女优大全 - 91n| 嗯嗯不要 视频| 少好三P| 精品人妻一二三四区视频| 夜夜嗨AV蜜臀av| 好湿好紧好爽 视频| AV免费在线播放一区| 丁香六月激情| 亚洲精品影视老司机| 偷拍三区| 亚洲国产精品9999在线观看| 日韩日本欧美在线观看| 亚洲 暴爽 AV人人爽日日碰| 本道综合精品| 色图四区| 久久超碰网| 亚洲美女AV无码| A片大香蕉在线| 人人人摸人人| 久久久久免费看少妇A片特黄| 无遮挡一级毛片视频免费的| 天堂69亚洲精品中文字| AV和黑人在线播放| 色欲日韩欧美在线一区| 精品人妻美妇91job| 欧美一区二区三区日韩| 色婷婷网| 亚洲。日韩。欧美| 色娱乐色呦呦夜夜夜夜av| 91成人久久| 精品人妻丰满熟妇一区二区三| 91丝袜在线播放| 综合亚洲欧美精品日韩?v| 国产精品嫩草影院免费| 国产精品久久久久久片| 啪啪91| 久热久一区二区三区| 青青国产在线拍揄自揄拍| 精品人妻伦一区二区三区久久| 麻豆熟妇乱妇熟色A片在线看| 宗合情欲网| 激情小说亚洲视频| 好爽视频在线观看视频| 亚洲日本激情| 91狠狠色丁香婷婷综合久久精品| 欧美爆操91| 国产精品日日摸天天碰| 中国农村熟妇毛片视频| 国产无马av| 久久免费精品96| 精品国产乱子伦一区二区三区,精品一| 亚洲精品白浆高清久久久久久| 国模少妇一区二区三区| 韩国女主播青草在线| 精品人妻高清麻豆av| 乱伦a片视频| 欧美色三级片91| 91在线观看,天天综合| 女人 A一级| 熟女自慰久久久| 综合网天天| 精品人人插人人操| 无码操逼天堂| 美女熟妇色| 人妻插插人妻人| 性天堂| 亚洲AV无码天美传媒一区| 亚洲色图8| 亚洲午夜福利视频| 国产乱码久久久久久| 性色AV蜜色av色欲av| 四虎永久在线精品免费网址| 99re在线| 成人夜夜爽| 99热在线观看| 欧美少妇熟女| 啊啊啊想要| 久久9亚洲| 日本国产欧美一区三区二区| 亚洲欧美一区二区三区在钱蜜桃 | 青青草九九九九九| 蜜桃狠狠色伊人亚洲综合网站| 国内91熟女人妻丝袜天天精品视频在线| 新91视频.cmp| 国产成人亚洲精品自产在线| 欲香欲色综合天天伊人| 亚洲一区二区麻豆影院| 青青草好吊色| 嗯嗯嗯,草死我| 成人性爱视频在线看| 国产情色在线| 99在线精品观看99| 在线视频97| 久久伊人青青草| 人人射人人操人人摸| 国产丁香精品露脸视频| 日韩av女优在线免费一区| 欧美性性性| 日逼五月天| 一区三区啪啪| 日产操逼| 亚洲国产中文字幕| 自拍大香蕉乱插| 国产高清成人免费视频| 亚洲欧洲色情高清| 九九色婷婷| 亚洲最大成人a毛毛片| 四虎av在线| 91天天爱| 日韩乱码Av| 亚洲成人性爱在线观看| 成人五月天丁香激情综合| 91强在线播放| 少妇诱惑视频| 九九色热| 亚洲精品毛片在线观看| 青青草中文字幕| 欧美综合自拍亚洲综合图| 91啪9色| 九九这里只有精品| 综合免费无码中文| 岛国1区2区3区在线观看| 五月天婷婷社区| 欧美高潮| 欧美熟女丝袜| 91电影色诱| 亚州成人A√| 97干97色| 亚洲成人AB| 亚洲干B| AV中文字幕三四五| 久久久久幕乱码| 风骚少妇视频中文字幕| 色 亚洲 91| 一直超碰| 嗯嗯啊啊好大好爽| 欧美亚洲美少妇一区二区| 欧美性色综合网| 超碰人妻久久人妻中文97| 偷拍网站久久男女男| 色综合美国| 超AV色女| 刺激性视频黄页| 丝袜无码a片| 精品96久久| 超碰97久久国| 婷婷10月天青娱乐| 欧美日日人人天天| 久久精品操| 欧美色宗合| 亚洲日韩在线a不卡99精品| 亚洲精品白浆高清久久久久久 | 亚洲欧美天| 青青青青青手机视频| 蜜臀一区二区三区在线 | 97天天插| 蜜臀久久久99久久久久| 亚洲av性爱电影| 日韩激情啪啪啪| 激情专区综合| 蜜臀亚洲中文| 欧美亚洲AN| 日韩欧美女求操每天更新| A级国产欧美激情在线| 国产成人无码啪| 久久香蕉网| 午夜精品久久久久久久99热影院| 中字一区| 日韩性爱小视频| 国产免费永久精品无码| 久久免费中文字幕在线观看| 中文字幕久久亚州无码| 91天堂网| 性影在线视频| 美女尤物福利视频| 欧美色图小说综合| 中国AAAAAA黄色片| 99综合免费视频| 欧美日本不卡| 操屄日韩| 中文字幕在线观看丝袜| 国产亚热在线久久| 加勒比伊人| 亚洲综合在线视频| 99国内熟女露脸视频| 农村女一级毛卡片| 色综合色| 97 国产精品| 日韩AV无码网站| 久久婷婷国产一区二区色| 日本欧美不卡| 亚洲精品亚洲人成在线麻豆| 99RE在线视频精品,这里只有精品| av激情亚洲五月天| 婷婷色导航| 在线洲亚线| 欧美激情一区| 99热这里只有精品8| 久久久久久裸体| 无码自拍SM| 深夜视频| 99热这里只有精品8| 欧美色网络| 黄色污污污污污污网站| 色香欲影| 狠狠搞 亚洲91| www..com操老师| 激情视频一二三|