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

ARTICLE DETAIL

資訊詳情

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

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

STM32實戰(zhàn):SPI從機主動發(fā)送數(shù)據(jù)的3種實現(xiàn)方案 做嵌入式這些年SPI 算是我用得最多的接口之一。前段時間有個項目兩個 STM32 要高速交換數(shù)據(jù)從機采集完一批數(shù)據(jù)后必須“立刻”發(fā)給主機。需求一提出來很多人第一反應(yīng)是SPI 從機怎么主動發(fā)數(shù)據(jù)SPI 主機才能提供時鐘從機連時鐘都沒有怎么主動這句話對但也不全對。SPI 從機確實不能憑空發(fā)起傳輸?shù)梢酝ㄟ^別的辦法“通知”主機來讀數(shù)據(jù)。這篇文章我就拿 STM32 為例分享從機主動發(fā)送數(shù)據(jù)的 3 種實現(xiàn)方式方案一是 GPIO 請求線加中斷方案二是主機輪詢方案三是 DMA 加乒乓緩沖各有優(yōu)缺點代碼也都給出來。1. 先搞清楚SPI從機憑什么“主動”1.1 SPI主從機制的底層邏輯SPI 之所以叫同步串行接口關(guān)鍵在于“同步”這兩個字。通信時誰提供 SCK 時鐘誰就是主機。主機控制 CS 片選信號決定跟哪個從機通信主機也決定什么時候開始傳輸、傳多少字節(jié)。從機的角色是被動的它只能檢測 CS 是否拉低、SCK 有沒有時鐘過來然后在時鐘的驅(qū)動下把數(shù)據(jù)從移位寄存器里送出去或者把總線上的數(shù)據(jù)收進來。所以從機“主動發(fā)送數(shù)據(jù)”這句話嚴格來說在 SPI 協(xié)議層面是不成立的。SCK 是主機的專屬資源從機沒有能力拉出 SCK 波形自然也就沒法啟動一次完整傳輸。我們要做的是在應(yīng)用層解決“從機有數(shù)據(jù)要發(fā)給主機”這個需求本質(zhì)思路都指向一句話讓從機通過某種方式告訴主機“我這有數(shù)據(jù)了你趕緊來讀”然后由主機發(fā)起 SPI 傳輸。這篇文章講的三種方式全是在這句話的基礎(chǔ)上展開的。1.2 三種思路的出發(fā)點第一種方式最直接從機專門拉一根 GPIO 線接到主機的 EXTI 中斷腳。從機有數(shù)據(jù)要發(fā)時先把 SPI 發(fā)送寄存器準備好再把這根請求線拉高主機收到中斷后就知道從機在等自己讀數(shù)據(jù)于是拉低 CS、啟動 SPI 接收。第二種方式省掉這根請求線主機按照固定周期主動發(fā)一個“讀命令”給從機從機收到命令后回傳數(shù)據(jù)。這種方式從機永遠不會主動開口但它實現(xiàn)了“從機數(shù)據(jù)能被及時拿走”的效果。代價是主機必須一直輪詢實時性和總線利用率都一般。第三種方式是把第一種方式的請求線和 DMA 結(jié)合適合數(shù)據(jù)量大、要求 CPU 占用低的場景。從機采集完數(shù)據(jù)后先啟動 SPI 的 DMA 發(fā)送然后拉高請求線主機在中斷里只用啟動 DMA 接收剩下的事全部交給 DMA 搬運。數(shù)據(jù)吞吐高而且不需要 CPU 一字節(jié)一字節(jié)地去處理。三種方式并不沖突實際項目里甚至可以組合使用。下面我分別把硬件連接、CubeMX 配置思路和 STM32 HAL 庫代碼拆開講。2. 方式一請求線EXTI中斷最快最直觀2.1 硬件連接與CubeMX配置思路方式一需要額外一根 GPIO 線我習慣叫它 REQ 線。連接是這樣的從機某個 GPIO 配置成推挽輸出接到主機的另一個 GPIO 輸入腳主機這個 GPIO 配置成 EXTI 外部中斷上升沿觸發(fā)。其他四根線照舊SCK、MOSI、MISO、CS 都接好主機和從機共地。CubeMX 里主機的 SPI 配置為 Full-Duplex Master從機配置為 Full-Duplex Slave。傳輸模式建議先用 Mode 0也就是 CPOL0、CPHA0這樣不容易出錯。主機 CS 引腳用普通 GPIO 輸出即可我習慣叫 CS_GPIO_Port / CS_Pin。從機的 NSS 如果不想用硬件控制可以把從機 SPI 的 NSS 設(shè)為 Software然后在初始化后把 SSI 置 1讓從機始終處于選中狀態(tài)真正的外部 CS 線就不參與 SPI 外設(shè)的使能判斷了。如果從機使用硬件 NSS則需要確保主機 CS 拉低時從機能檢測到片選有效時序要求更高新手階段容易被 NSS 的電平搞得一頭霧水所以軟件 NSS 更穩(wěn)。從機的 REQ 引腳在 CubeMX 里配成 GPIO_Output初始狀態(tài)輸出低電平主機的 REQ 引腳在 GPIO 配置里選擇 External Interrupt Mode with Rising edge trigger使能 EXTI 中斷。這里要注意主機的 GPIO 模式如果支持內(nèi)部上拉/下拉最好根據(jù)實際情況選擇是否啟用。REQ 線一般沒有高速翻轉(zhuǎn)要求普通推挽輸出就夠了。2.2 主機端代碼實現(xiàn)主機端的核心邏輯是在 EXTI 回調(diào)函數(shù)里只做一個標志位置位真正耗時的 SPI 接收放到主循環(huán)里處理不要在中斷服務(wù)函數(shù)里直接跑阻塞式 HAL_SPI_Receive否則主機整個中斷會被拉得很長其他實時任務(wù)可能被餓死。/* main.c 全局變量 */ volatile uint8_t g_slave_req 0; uint8_t g_rx_buf[32]; /* EXTI 回調(diào)REQ 引腳上升沿觸發(fā) */ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if (GPIO_Pin REQ_Pin) { g_slave_req 1; } } /* 主循環(huán) */ while (1) { if (g_slave_req) { g_slave_req 0; /* 拉低片選通知從機開始傳輸 */ HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_RESET); /* 主機提供時鐘接收從機數(shù)據(jù) */ HAL_SPI_Receive(hspi1, g_rx_buf, sizeof(g_rx_buf), 100); /* 拉高片選結(jié)束本次傳輸 */ HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET); ProcessData(g_rx_buf, sizeof(g_rx_buf)); } }這里有一個關(guān)鍵點主機的 HAL_SPI_Receive 在讀數(shù)據(jù)的同時SPI 硬件也會把數(shù)據(jù)線上的數(shù)據(jù)移位進來但根據(jù) SPI 全雙工特性主機發(fā)送的字節(jié)是 0x00 或 0xFF具體由 HAL 庫的清零處理決定。所以從機側(cè)只要提前把數(shù)據(jù)放進發(fā)送寄存器主機這邊就能完整收到。2.3 從機端代碼實現(xiàn)從機端要做的事就是應(yīng)用層準備好了數(shù)據(jù)后先把數(shù)據(jù)放進 SPI 發(fā)送通道再拉高 REQ 線通知主機。為什么要先放數(shù)據(jù)再拉高 REQ因為主機接收到中斷后馬上就會拉低 CS 并啟動時鐘如果從機這時候才開始填 SPI 數(shù)據(jù)寄存器第一個字節(jié)大概率來不及主機收到的第一個字節(jié)就是錯的。/* main.c 從機側(cè) */ uint8_t g_tx_buf[32]; volatile uint8_t g_tx_busy 0; void Slave_SendData(uint8_t *data, uint16_t len) { while (g_tx_busy); // 等待上一次發(fā)送完成 memcpy(g_tx_buf, data, len); /* 先啟動中斷發(fā)送讓第一個字節(jié)預(yù)裝載到 SPI 數(shù)據(jù)寄存器 */ HAL_SPI_Transmit_IT(hspi1, g_tx_buf, len); g_tx_busy 1; /* 再通知主機過來讀 */ HAL_GPIO_WritePin(REQ_GPIO_Port, REQ_Pin, GPIO_PIN_SET); } /* 從機發(fā)送完成回調(diào) */ void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi) { if (hspi hspi1) { /* 主機已經(jīng)讀完撤下請求線允許下一次請求 */ HAL_GPIO_WritePin(REQ_GPIO_Port, REQ_Pin, GPIO_PIN_RESET); g_tx_busy 0; } }從機調(diào)用 HAL_SPI_Transmit_IT 的時候CS 可能還是高電平SCK 也沒有時鐘但這不是問題。SPI 外設(shè)使能后數(shù)據(jù)寄存器是可寫的HAL_SPI_Transmit_IT 會把第一字節(jié)寫到數(shù)據(jù)寄存器里然后等 TXE 事件。等到主機拉低 CS、開始產(chǎn)生 SCK 時鐘時第一字節(jié)被移出去TXE 置位中斷再填充第二字節(jié)。所以“先啟動發(fā)送再通知主機”這個順序絕對不能反。2.4 方式一的關(guān)鍵細節(jié)第一個細節(jié)是請求線觸發(fā)方式。我在代碼里用的是上升沿觸發(fā)從機拉高 REQ 請求主機收到上升沿中斷。主機的判斷要帶標志位去清不要在主循環(huán)和 EXTI 回調(diào)之間出現(xiàn)競態(tài)。如果同時來了多個請求可以給標志位加計數(shù)但如果只需要“有數(shù)據(jù)就讀”一個標志位就夠了。第二個細節(jié)是 CS 的時序。對從機來說主機 CS 拉低后從機 SPI 外設(shè)才真正進入被選中狀態(tài)。如果從機用的是硬件 NSS那么 CS 線必須先于 SCK 拉低且持續(xù)到整個幀結(jié)束如果從機用軟件 NSS則外部 CS 不直接控制 SPI 外設(shè)但仍建議用 GPIO 模擬 CS 來保證從機應(yīng)用層能知道當前是否被選中這樣在調(diào)試時你能清楚看見時序。第三個細節(jié)是中斷優(yōu)先級。主機 EXTI 中斷不要設(shè)置成最高優(yōu)先級因為中斷里只置標志位實際 SPI 接收在主循環(huán)里所以優(yōu)先級比系統(tǒng)節(jié)拍低一點即可。從機 SPI 發(fā)送中斷的優(yōu)先級則要看實時性要求數(shù)據(jù)量大時建議把 SPI 中斷優(yōu)先級調(diào)高避免 SCK 時鐘太快導(dǎo)致 TXE 中斷沒來得及填充下一字節(jié)從而出現(xiàn)丟數(shù)據(jù)。3. 方式二主機輪詢命令應(yīng)答省一根請求線3.1 兩階段讀命令協(xié)議設(shè)計方式二適合不想多拉線的場景主機只要定時發(fā)命令從機在命令的驅(qū)動下返回數(shù)據(jù)。很多人寫到這里會忽略一個問題SPI 是全雙工通信主機發(fā)命令字節(jié)的同時從機的 MISO 線上其實也在輸出數(shù)據(jù)。從機在收到命令之后才準備數(shù)據(jù)那就晚了因為這個字節(jié)已經(jīng)隨著時鐘移出去了。所以需要把一次“讀取操作”拆成兩個階段。第一階段主機發(fā)送一字節(jié)命令從機接收命令的同時MISO 上送出的是上一次預(yù)留的應(yīng)答字節(jié)或者占位字節(jié)這一階段主機收到的數(shù)據(jù)一般丟棄。第二階段主機再發(fā)送一字節(jié)啞數(shù)據(jù)從機在收到第一階段的命令后已經(jīng)把真正的數(shù)據(jù)放到 SPI 發(fā)送數(shù)據(jù)寄存器里了這一次時鐘會把數(shù)據(jù)完整送出主機收到的就是有效數(shù)據(jù)。計算一下開銷每次讀取有效數(shù)據(jù) 1 字節(jié)實際總線傳輸 2 字節(jié)。如果主機輪詢周期是 1ms那么當前這包數(shù)據(jù)的最大延遲大約是 2ms平均延遲 1ms 左右。數(shù)據(jù)量小、實時性要求不高時這種方式很實用。3.2 主機輪詢代碼主機端比較簡單用一個定時器或者直接在主循環(huán)里做周期輪詢。我建議用定時器的回調(diào)置一個標志位主循環(huán)里處理避免在定時器中斷里阻塞太久。每次讀完再啟動下一次。/* main.c 主機 */ uint8_t cmd CMD_READ_DATA; uint8_t dummy 0; uint8_t rx_dummy; uint8_t rx_data; void TimerPeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim htim2) { g_poll_flag 1; } } while (1) { if (g_poll_flag) { g_poll_flag 0; /* CS 拉低 */ HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_RESET); /* 階段 1發(fā)送命令收到的是從機的占位數(shù)據(jù) */ HAL_SPI_TransmitReceive(hspi1, cmd, rx_dummy, 1, 10); /* 階段 2發(fā)送啞字節(jié)同時讀取從機的有效數(shù)據(jù) */ HAL_SPI_TransmitReceive(hspi1, dummy, rx_data, 1, 10); /* CS 拉高 */ HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET); ProcessSensorData(rx_data); } }如果主機需要一次讀取多個字節(jié)可以從機側(cè)在命令階段之后連續(xù)輸出多個有效字節(jié)。比如讀取 16 字節(jié)溫度數(shù)據(jù)主機第一階段發(fā)命令第二階段連續(xù)發(fā) 16 個啞字節(jié)從機狀態(tài)機里根據(jù)命令把 16 字節(jié)連續(xù)發(fā)送出來。3.3 從機狀態(tài)機代碼從機側(cè)我推薦用 HAL 庫的 HAL_SPI_TransmitReceive_IT讓狀態(tài)機始終處于接收狀態(tài)。初始化時先啟動一次“命令接收”傳輸收到命令后在回調(diào)里切換到“數(shù)據(jù)發(fā)送”狀態(tài)發(fā)送完成后再切換回“命令接收”狀態(tài)。/* 從機全局變量 */ uint8_t rx_byte; uint8_t tx_byte; uint8_t tx_dummy 0xFF; volatile uint8_t spi_state STATE_WAIT_CMD; // 0等命令1發(fā)數(shù)據(jù) /* 初始化時啟動命令接收 */ void Slave_SPI_Init(void) { spi_state STATE_WAIT_CMD; HAL_SPI_TransmitReceive_IT(hspi1, tx_dummy, rx_byte, 1); } /* 發(fā)送接收完成回調(diào) */ void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi) { if (hspi ! hspi1) return; if (spi_state STATE_WAIT_CMD) { if (rx_byte CMD_READ_DATA) { tx_byte ReadSensorData(); spi_state STATE_SEND_DATA; } /* 不管是不是有效命令都回到等待命令狀態(tài) 但若收到有效命令下一階段就會發(fā)送有效數(shù)據(jù) */ if (spi_state STATE_SEND_DATA) { /* 階段 2主機發(fā)送啞字節(jié)時從機發(fā)送 tx_byte */ HAL_SPI_TransmitReceive_IT(hspi1, tx_byte, rx_byte, 1); } else { HAL_SPI_TransmitReceive_IT(hspi1, tx_dummy, rx_byte, 1); } } else if (spi_state STATE_SEND_DATA) { /* 數(shù)據(jù)發(fā)送完成重新等命令 */ spi_state STATE_WAIT_CMD; HAL_SPI_TransmitReceive_IT(hspi1, tx_dummy, rx_byte, 1); } }這個狀態(tài)機代碼的精髓在于從機永遠在等主機發(fā)起的 SPI 傳輸永遠處于“接收命令或發(fā)送數(shù)據(jù)”的循環(huán)中。主機不來時鐘這個狀態(tài)機就一直掛著主機時鐘來了從機的數(shù)據(jù)就會自動被讀走。這種方式雖然叫“從機主動發(fā)送”但實際協(xié)議層面是主機一直在主動讀從機的主動性體現(xiàn)在“有數(shù)據(jù)時能及時通過命令應(yīng)答帶出去”。3.4 延遲與總線效率分析方式二最怕的是主機輪詢周期和數(shù)據(jù)到達時機不對齊。比如傳感器每 10ms 更新一次主機若 5ms 輪詢一次那讀取到的數(shù)據(jù)平均會有 2.5ms 左右的陳舊延遲。主機若在數(shù)據(jù)更新前讀拿到的就是上一周期的舊值如果業(yè)務(wù)要求拿到“最新值”可以給協(xié)議加一個狀態(tài)字段從機在應(yīng)答數(shù)據(jù)里帶一個“數(shù)據(jù)更新序號”或者“數(shù)據(jù)有效標志”主機讀到舊值時可以選擇連續(xù)重讀或丟棄??偩€效率方面方式二每一字節(jié)有效數(shù)據(jù)都要消耗兩個時鐘字節(jié)效率是 50%。如果主機能接受問題不大如果對總線效率敏感建議用方式一或方式三。另外主機輪詢會持續(xù)產(chǎn)生 SPI 時鐘對一些低功耗場景不友好因為主機不能一直跑否則系統(tǒng)功耗壓不下去。4. 方式三DMA批量搬運乒乓緩沖高性能大頭兵4.1 DMA請求線的配合方式方式三是方式一的升級版思路仍然是“從機請求主機讀取”但把“逐字節(jié)中斷搬運”替換成“DMA 搬運”。使用 DMA 的好處很明顯主機收到 REQ 中斷后只需拉低 CS、啟動一次 HAL_SPI_Receive_DMACPU 就可以去做別的事了DMA 會在 SPI 時鐘驅(qū)動下把數(shù)據(jù)自動搬到內(nèi)存。從機這邊也一樣數(shù)據(jù)在 DMA 的驅(qū)動下自動從內(nèi)存搬到 SPI 發(fā)送數(shù)據(jù)寄存器不需要內(nèi)核逐字節(jié)處理。這里有一個很重要的硬性約束從機必須先啟動 DMA 發(fā)送讓 DMA 把第一字節(jié)送到 SPI 數(shù)據(jù)寄存器再拉高 REQ 線。主機收到 REQ 后立即拉低 CS 并啟動讀取此時 SPI 時鐘一產(chǎn)生第一字節(jié)就能直接移出。如果順序顛倒從機先拉高 REQ主機隨后馬上產(chǎn)生時鐘而 DMA 還沒來得及把第一字節(jié)寫入 SPI 數(shù)據(jù)寄存器第一個字節(jié)就會變成上一個殘留數(shù)據(jù)或者干脆是空數(shù)據(jù)主機接收到的第一字節(jié)就會錯位。4.2 乒乓緩沖為了什么DMA 搬運數(shù)據(jù)是直接從內(nèi)存緩沖區(qū)搬到 SPI 外設(shè)不需要 CPU 參與。這意味著 CPU 可以在 DMA 正在發(fā)送緩沖區(qū) A 的時候去往緩沖區(qū) B 填充新數(shù)據(jù)等下一輪發(fā)送輪到緩沖區(qū) B 時CPU 又可以去填充緩沖區(qū) A。這叫乒乓緩沖。為什么一定要乒乓因為如果你只有一個緩沖區(qū)CPU 在一輪采集后填充完數(shù)據(jù)啟動 DMA 發(fā)送接著 CPU 又想在新一輪數(shù)據(jù)到達時填充同一個緩沖區(qū)就會導(dǎo)致 DMA 還沒發(fā)完的數(shù)據(jù)被新數(shù)據(jù)覆蓋主機讀到的數(shù)據(jù)前后撕裂或者出現(xiàn)半個新幀、半個舊幀。乒乓緩沖把“填充數(shù)據(jù)”和“發(fā)送數(shù)據(jù)”在時間上錯開只要 CPU 填充緩沖區(qū) B 的速度比 DMA 發(fā)送緩沖區(qū) A 的速度快就不會互相干擾。乒乓緩沖的代碼結(jié)構(gòu)簡單說就是兩個數(shù)組一個正在被 DMA 讀另一個正在被 CPU 填。發(fā)送完成后交換角色。我這里給一個單緩沖的簡化版本重點是把 DMA 和 REQ 請求怎么配合講清楚真正做乒乓時把下面代碼里的單個 buffer 換成 buffer[2]再用一個索引來切換即可。4.3 從機和主機代碼骨架從機側(cè)代碼假設(shè)傳感器采集好的數(shù)據(jù)已經(jīng)放在 g_tx_buffer 里長度為 BUF_LEN。/* 從機 */ #define BUF_LEN 256 uint8_t g_tx_buffer[BUF_LEN]; /* 應(yīng)用層數(shù)據(jù)準備好后主動發(fā)送 */ void Slave_RequestSend(uint8_t *data) { /* 拷貝數(shù)據(jù)到 DMA 發(fā)送緩沖區(qū) */ memcpy(g_tx_buffer, data, BUF_LEN); /* 等待上一次 DMA 發(fā)送完全結(jié)束 */ while (HAL_SPI_GetState(hspi1) ! HAL_SPI_STATE_READY); /* 先啟動 DMA 發(fā)送讓第一字節(jié)預(yù)裝載 */ HAL_SPI_Transmit_DMA(hspi1, g_tx_buffer, BUF_LEN); /* 再通知主機來讀 */ HAL_GPIO_WritePin(REQ_GPIO_Port, REQ_Pin, GPIO_PIN_SET); } /* 從機 DMA 發(fā)送完成回調(diào) */ void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi) { if (hspi hspi1) { /* 主機讀完了撤下請求線 */ HAL_GPIO_WritePin(REQ_GPIO_Port, REQ_Pin, GPIO_PIN_RESET); } }主機側(cè)代碼收到 REQ 中斷后啟動 DMA 接收。/* 主機全局變量 */ uint8_t g_rx_buffer[BUF_LEN]; volatile uint8_t g_slave_req 0; void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if (GPIO_Pin REQ_Pin) { g_slave_req 1; } } /* 主循環(huán) */ while (1) { if (g_slave_req) { g_slave_req 0; /* 拉低 CS從機開始輸出數(shù)據(jù) */ HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_RESET); /* 啟動 DMA 接收主機產(chǎn)生 BUF_LEN 個時鐘 */ HAL_SPI_Receive_DMA(hspi1, g_rx_buffer, BUF_LEN); } } /* DMA 接收完成回調(diào) */ void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi) { if (hspi hspi1) { /* 拉高 CS結(jié)束本次傳輸 */ HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET); /* 處理數(shù)據(jù) */ ProcessData(g_rx_buffer, BUF_LEN); } }這段代碼看起來很簡單但實際項目里我會把 HAL_SPI_Receive_DMA 放到 EXTI 回調(diào)里直接啟動因為函數(shù)本身只是配置 DMA 并開啟傳輸耗時極短。主循環(huán)里置標志位再處理也是一種穩(wěn)妥做法優(yōu)先級上并沒有問題。真正要注意的是 CS 引腳和 DMA 狀態(tài)的配合如果上一次 DMA 還沒有完成下一次 REQ 就來了主機這邊必須等待或做保護否則 CS 拉低之后啟動 DMA 會出現(xiàn)并發(fā)錯誤。4.4 避免DMA傳輸踩坑DMA 的第一個坑是緩沖區(qū)長度超長時SPI 時鐘連續(xù)翻轉(zhuǎn)如果主機和從機的波特率分頻設(shè)置不一致或者主頻不同就可能導(dǎo)致采樣點偏移。STM32 的 SPI 從模式一般可以跟得上主機速率但要注意 SPI 的時鐘極性和相位必須完全一致特別是 Mode 0 和 Mode 3 這兩個模式都不難配只是千萬別一邊配 Mode 0、一邊配 Mode 3。第二個坑是 DMA 中斷和 SPI 中斷的優(yōu)先級。從機在 DMA 發(fā)送完整個緩沖區(qū)后觸發(fā)完成中斷這個中斷里要拉低 REQ不能拖太久。如果 REQ 線被長時間占用主機可能來不及在下一輪請求前釋放資源。實際上我在做高速傳輸時會把從機的 DMA 中斷優(yōu)先級設(shè)置為較高主機的 EXTI 請求線中斷優(yōu)先級設(shè)置為中等SPI 的全局中斷優(yōu)先級設(shè)置為比 EXTI 低一點保證“請求”和“發(fā)送完成”不會被 DMA 中斷的長時間處理拖延。第三個坑是首字節(jié)錯誤。前面反復(fù)強調(diào)過從機要先啟動 DMA 再拉高 REQ。但還有一個細節(jié)是 DMA 配置里 Data Width 要和 SPI 數(shù)據(jù)寬度一致。STM32 的 SPI 通常配置 8 位數(shù)據(jù)DMA 的 Peripheral Data Size 和 Memory Data Size 都應(yīng)該是 Byte。如果配成 Half Word 或者 WordDMA 搬運的數(shù)據(jù)寬度會和 SPI 外設(shè)不匹配收發(fā)內(nèi)容直接亂掉。第四個坑是 CS 線。數(shù)據(jù)量大時CS 全程拉低直到 DMA 結(jié)束這一點協(xié)議上沒有爭議。但 CS 拉高前要確保主機已經(jīng)不再產(chǎn)生 SCK 時鐘。有些 HAL 庫版本在 SPI 完成 DMA 后會自動處理但 CS 是普通 GPIO不會自動拉高所以必須在 DMA 完成回調(diào)里手動操作。從機側(cè)如果使用硬件 NSS當 CS 拉高時從機 SPI 外設(shè)會強制停止當前傳輸導(dǎo)致 DMA 發(fā)送了一半被中止這個現(xiàn)象在調(diào)試時非常隱蔽。所以我個人強烈建議從機用軟件 NSS外部 CS 只做電平參考SPI 外設(shè)的選中狀態(tài)靠 SSI 位保持這樣即使 CS 提前拉高從機 DMA 也不會突然中斷。5. 三種方式怎么選一張表講清楚5.1 核心維度對比我把三種實現(xiàn)方式的關(guān)鍵參數(shù)放在一起直接對照著看更清楚。對比維度方式一請求線EXTI方式二主機輪詢方式三DMA請求線額外硬件引腳需要 1 根 REQ 線不需要額外引腳需要 1 根 REQ 線實時性高從機一拉線主機馬上響應(yīng)中取決于輪詢周期高請求后 DMA 批量讀取從機數(shù)據(jù)量小到中幾十字節(jié)合適小以單字節(jié)或短數(shù)據(jù)為主大幾百字節(jié)到幾 KB 最合適CPU 占用主機接收時消耗 CPU主機持續(xù)輪詢占用高主機和從機 CPU 占用都很低總線效率高一次傳輸全是有用數(shù)據(jù)低需要命令啞字節(jié)兩階段高批量數(shù)據(jù)一次傳完實現(xiàn)復(fù)雜度簡單簡單但協(xié)議要設(shè)計好較復(fù)雜需要處理 DMA 和乒乓典型場景按鍵、告警、小包數(shù)據(jù)傳感器周期上報、狀態(tài)查詢音頻、波形、高速數(shù)據(jù)采集5.2 實際項目選型經(jīng)驗如果從機只是偶發(fā)地報一下狀態(tài)比如按鍵按下、溫度越限、設(shè)備故障我一般選方式一。請求線加中斷代碼量小實時性高主機不需要一直跑輪詢功耗也低。如果是周期性的傳感器數(shù)據(jù)比如溫度、濕度、轉(zhuǎn)速這些數(shù)據(jù)本身量不大而且業(yè)務(wù)上允許幾百微秒到幾毫秒的延遲方式二最合適。它省了請求線主機按固定周期讀一次從機端只需要維護一個很簡單的狀態(tài)機。缺點就是主機輪詢必須一直跑不能停太久如果主機本身還在做其他實時任務(wù)要考慮輪詢周期是否影響整體調(diào)度。如果是做雙機間的高速數(shù)據(jù)交換比如從機采集 ADC 波形、音頻數(shù)據(jù)或者 IMU 九軸數(shù)據(jù)用方式三。請求線負責通知DMA 負責搬運乒乓緩沖負責把采集和發(fā)送流水線化。這種方式開發(fā)周期長一點但一旦調(diào)通效果非常穩(wěn)定主機側(cè)的 CPU 幾乎不用管數(shù)據(jù)搬運留給應(yīng)用層做算法和顯示。6. 常見問題與排查實錄6.1 一上電就是亂碼亂碼最常見的原因是 SPI 模式不一致。主機配置成 Mode 0從機配置成 Mode 3兩邊采樣點對不上數(shù)據(jù)就會錯位。碰到亂碼先把兩邊都改成 Mode 0CPOL0CPHA0然后檢查波特率分頻。STM32 主機 SPI 時鐘不能超過從機允許的極限從機 F103 一般建議主機 SPI 時鐘在 9 MHz 以下保守一點用 4.5 MHz 或 2.25 MHz 調(diào)通再說。另一個容易忽略的是 MISO 和 MOSI 接反。STM32 主機的 MISO 必須接從機的 MISO主機的 MOSI 必須接從機的 MOSI。很多杜邦線項目里顏色一多就容易把兩根數(shù)據(jù)線對調(diào)結(jié)果主機發(fā)命令從機收不到從機發(fā)數(shù)據(jù)主機也收不到。6.2 主機收不到從機數(shù)據(jù)先量一下 REQ 線有沒有正常拉高。如果 REQ 線一直是低電平說明從機應(yīng)用層可能沒走到發(fā)送函數(shù)或者發(fā)送函數(shù)卡在 while 等待里。再量 CS 線有沒有在主機收到請求后拉低。CS 線拉低但 MISO 沒有數(shù)據(jù)大概率是從機還沒準備好數(shù)據(jù)就通知了主機或者從機 SPI 沒有正確使能。還要檢查從機的 NSS 配置。如果從機用的硬件 NSS而主機的 CS 線和從機的 NSS 引腳沒接到一起或者電平邏輯反了從機 SPI 外設(shè)根本沒被選中自然發(fā)不出數(shù)據(jù)。從機用軟件 NSS 時要在 SPI 初始化后把 SSI 位置 1否則從機以為自己沒被選中也會罷工。6.3 請求線誤觸發(fā)或丟失請求線誤觸發(fā)大多是因為 REQ 線上有毛刺。從機 REQ 是普通 GPIO 推挽輸出正常不會有毛刺但如果主機 REQ 輸入引腳沒有使能內(nèi)部上拉懸空時很容易受干擾。建議主機 REQ 引腳配置上拉輸入并且在 EXTI 回調(diào)里加一個軟件去抖比如連續(xù)檢測兩次電平都滿足條件再置標志位。請求線丟失則要檢查從機拉高 REQ 之后是不是馬上又被自己的發(fā)送完成回調(diào)拉低了。比如主機響應(yīng)得很快CS 拉低、SCK 開始、DMA/中斷發(fā)送完成后從機立刻拉低 REQ。如果這個拉低發(fā)生在主機 EXTI 上升沿還沒被正確鎖存之前某些單片機可能會丟中斷。解決辦法是 REQ 拉低的時機不要放在從機發(fā)送完成回調(diào)里而是放到主機讀取完成后由主機主動拉低或者從機發(fā)送完成后再等一小段時間再拉低。實際項目里我習慣用從機發(fā)送完成回調(diào)拉低 REQ只要主機 EXTI 是上升沿觸發(fā)且中斷正?;径寄苕i住但如果性能測試發(fā)現(xiàn)偶發(fā)丟請求可以考慮把 REQ 改成電平觸發(fā)加標志位輪詢。6.4 DMA傳輸和中斷卡死DMA 卡死的典型現(xiàn)象是程序跑著跑著SPI 不再產(chǎn)生時鐘REQ 線一直高主機的 DMA 接收回調(diào)一直不執(zhí)行。原因一般有兩個。第一個是主機在 DMA 接收過程中再次收到 REQ 中斷主循環(huán)又把 CS 拉低、再次啟動 DMA導(dǎo)致上一次 DMA 還沒完成就被新的 DMA 請求覆蓋HAL 庫內(nèi)部狀態(tài)錯亂。解決辦法是加一個 g_dma_busy 標志DMA 接收完成回調(diào)里清除下次請求到來時如果 busy 還在就直接忽略或者排隊處理。第二個是從機 DMA 發(fā)送緩沖區(qū)在發(fā)送過程中被應(yīng)用層覆蓋了。我在做乒乓緩沖時遇到過從機正在 DMA 發(fā)送 buffer A采集任務(wù)卻把新數(shù)據(jù)寫到 buffer A導(dǎo)致發(fā)送數(shù)據(jù)被新數(shù)據(jù)污染。加乒乓緩沖后這個問題就消失了核心原則是DMA 正在用的緩沖區(qū)應(yīng)用層絕對不能寫。6.5 FreeRTOS下SPI中斷優(yōu)先級怎么設(shè)置如果項目里用了 FreeRTOSSPI 中斷和 EXTI 中斷的優(yōu)先級不能隨便給。HAL 庫在中斷回調(diào)里可能會調(diào)用portYIELD_FROM_ISR這樣的 FreeRTOS 宏如果中斷優(yōu)先級比configMAX_SYSCALL_INTERRUPT_PRIORITY更高FreeRTOS 就不允許在該中斷里調(diào)用任何與系統(tǒng)相關(guān)的 API否則會觸發(fā)斷言或直接卡死。我的習慣是把 STM32 的中斷優(yōu)先級分組設(shè)置為 4 位搶占優(yōu)先級然后 SPI 中斷和 EXTI 中斷的搶占優(yōu)先級都設(shè)置在 5~7 之間不要設(shè)到 0~3。這樣 FreeRTOS 可以管理這些中斷而且不會影響系統(tǒng)節(jié)拍。如果業(yè)務(wù)上確實需要更高的實時性可以把 SPI 中斷優(yōu)先級設(shè)為 4但代價是不能在中斷回調(diào)里調(diào)用任何 FreeRTOS API只能通過信號量或標志位通知任務(wù)不能直接在回調(diào)里osSemaphoreRelease或osMessageQueuePut。6.6 硬件NSS與軟件NSS的選擇STM32 的 SPI 支持硬件 NSS 和軟件 NSS初學者經(jīng)常在這上面踩坑。硬件 NSS 由 SPI 外設(shè)自動控制主機模式下可以在一次傳輸開始時自動拉低 NSS傳輸結(jié)束后拉高從機模式下 NSS 引腳的外部電平會直接決定從機是否被選中??雌饋砗芊奖愕珜嶋H調(diào)試時NSS 和 SCK 的相對時序、多從機沖突、以及 DMA 傳輸過程中 CS 自動變化都會引入隱蔽問題。軟件 NSS 則是把 NSS 功能交給 GPIO 手動控制。主機側(cè) CS 引腳用普通 GPIO 拉低拉高完全由自己控制時序從機側(cè) SPI 的 NSS 配置為軟件模式然后設(shè)置 SPI 的 SSI 位為 1讓從機一直處于“邏輯選中”狀態(tài)外部 CS 線只作為應(yīng)用層判斷。這樣 SPI 外設(shè)的數(shù)據(jù)收發(fā)不會因為 CS 時序問題突然中止代碼也更好調(diào)。我個人做雙機通信更推薦軟件 NSS雖然要自己管理 CS 引腳但穩(wěn)定性會明顯好很多。7. 一點額外體會如果讓我在新項目里重新選一次偶發(fā)小數(shù)據(jù)我會選方式一周期性傳感器數(shù)據(jù)選方式二大數(shù)據(jù)量高速傳輸選方式三。實際項目里我更多是把方式一和方式三結(jié)合使用請求線負責通知DMA 負責搬運既能保證實時性又能把 CPU 從繁重的數(shù)據(jù)搬運里解放出來。SPI 的從機“主動發(fā)送”說到底只能做到通知主機來讀真正的主從關(guān)系并沒有變。選型時先想清楚數(shù)據(jù)量、延遲要求和引腳余量就不會走彎路。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
岛国成人av在线播放网址| 天天色怡春院| 亚洲性爱无码乱伦av| 久9九综合在线| 日本天堂网| 777奇米影视777四色| 亚洲影视综合| 精品玖九九久| 校园春色美腿丝袜| 青草伊人久久| 大乔未久88一区| 97亚洲国产影视| 99热99色| 久久久 国产精品| 婷婷色综合欧美日韩| 91欧美丨精品丨入口| 人妻加勒比东京热| 婷婷五月天AV| 中文字幕成人| 成年女人一区| 不卡在线一区,精品一区二区三区中| 人人操肉肉| 欧美gv在线观看| 9118禁| 天天综合站| 亚洲欧洲无码97久久精品| 激情五月天色播| 自拍偷拍 日韩无码| 亚洲春色一区二区三区| 夜夜精品视频| 人妻精品一区二区三区| 老女人91| 91久久国外网| 91麻豆一二三区| 免费网站观看www在线观| 天天爽爽爽爽| 日日干夜夜操视频h| 清清一区二区三区四区不卡视频| 天天综合精品| 嗯嗯啊啊操死我| 午夜欧美J进J出白浆流出久久久| 九热超碰| 亚洲天天综合| 韩国免费播放一级毛片| 377p欧洲日本亚洲大胆| 金莲网址| 久操精品网| 久久精品美女一区| 91爱综合| 精品十三区| 欧美综合 站| 九九九九九九视频| 蜜桃香蕉久草精品在线| 91情色| 欧美性xxxxx狂欢| 内射夫妻三片| 国产精品一二三在线看| 九九视品黄色| 久久草视频污视频| 综合亚洲欧美| 91精品微拍福利| 欧美日韩国产黄色片| 性久久| 精品-91人妻子系列| 欧美性爱五月天| 久久午夜伦| 91草草草| 亚州色图欧美| 嗯嗯嗯啊啊在线观看| 俺去啦自拍| 2017天天操天天日| 成年人黄色视频免费| 富女玩鸭子一级毛片| 飘花国产午夜精品不卡| 色播综合| 99热18这里只有精品| 中国熟妇| 国产女人高潮嗷嗷嗷叫小说| 亚洲图片偷拍视频区| 亚洲午夜免费狠狠干| 欧美97日韩精品| 欧美色狠| 2001天天操| 久久亚洲天堂| 国产高清视频无码在线| 亚洲另类小说卡通动漫| av绯色| 99热最新| 欧亚韩国999| 国产97在线 | 亚洲| 国产精品剧情| 手机看av网站在线看| 人妻av在线| 亚洲91网站| 97免费在线观看| 秋霞无码av鲁丝片一区| 毛片视频白嫩| 熟女熟妇一区二区三四区| 国产精品一区二区亚洲人成毛片 | 免费的黄片有限公司| 高清国产av无码| 美女97超碰| 久久久久久久97| 人妻精品一区二区在线| 91激情网| 欧美日韩午夜精品一区二区三区| 99操逼| 裸体美女久久久| 肉动漫无遮挡h在线观看| 可以在线观看AV的网站| #NAME?| 欧洲成人性爱视频| 九九热这里只有在线精品视 伊人草 成人菠萝蜜视频在线观看 | 欧美少妇高潮视频| 偷窥自拍A片| 日韩毛片9| 国产午夜无码片在线观看影视| 成年女人一区| 国产人妻久久精品一区二区三区| 日韩精品亚洲专区在线影视| 九九九九九九九九九五码| 国产精品视频内谢女人| 精品免费1| 人妻娇喘 激情视频| 日韩av在线免费网站| 日本 免费 一区二区三区 久久香蕉| 欧美日韩亚洲天堂| 国产11页| 国产综合在线视频网站| 国产精品网站www| 日本孕妇一区二区视频操逼免费看 | 婷婷av在线中文字幕| 91欧美偷拍| 国产又猛又粗又爽又黄| 蘋果手機免費看成人Av| 精品成人av一区二区三区在线| 蜜桃丰满熟妇av无码区不卡| 精品一区二区成人| #NAME?| 青青草中文-久久青草精品一区二区三 | 天天激色| 成人看片网站| 自拍偷拍第26| www久久精品| 男人的天堂一区三区| 亚洲狠狠入| 裸体美女免费看网站青草| 日本人妻最新在线中| 亚熟在线| 婷婷丁香在线| 日婷婷| 天天影视综合色| 五月婷婷色| 成人午夜高潮av猛片| 特级大荫道BBwBBwBBW| 久久欲| 国产精品。| 国产99久久99热这里只有精品15| 另类专区加勒比| 国产又爽又黄| 伊人丁香五月婷婷| 精品欧美乱码久| 成人热久久精品| 极品极品色影院| 偷拍精品一区二区三区| 96一区二区三区| 日韩成人色图| 超碰免费人人| 国产黄色在线播放观看| 99re黄 | 青青草原香蕉日本Ap| 久妇网| 天天草天天干天天日| 日韩综合色图| 久区视频| 色拍偷亚洲| 91N五十路| 性色av婷婷久久一区二区点复制| 日韩一区二区精彩视频| 综合网天天| 色777999综合| 欧美A√综合网| 精精夜夜| 国产人伦精品一区二区三区 | 欧美精品亚洲精品日韩传电影| 国产欧美美女免费观看视频| www.av在线观看| 国产女s强制榨精视频| 91精品国产一区三一| 国产性爱欧美性爱在线| 91天美传媒在线| 人妻激情另类| 一本久道久久综合狠狠爱| 新版天堂中文资源8在线| 欧美爆乳精品一区二区| 熟妇乱伦一区二区| 日本不卡五区| 婷婷涩嫩草鲁丝久久午夜精品| 日韩丨制服丨中文|在线| 98精品国产乱码久久久久久| 绑缚麻绳人妻寝取完整版| 亚洲熟妇图片| 97爱b| 青青草乱入乱欲视频在线观看| 日韩免费人妻色情网站| 亚州国产精品乱| 大香蕉手机视频| 亚洲精品a人片在线观看视| 自怕偷自怕亚洲精品| a级免费在线观看| 97欧美超碰| 欧美亚洲自拍另类人妻| 澳门黄片一香蕉视频| 三上悠亚在线毛片91| 亚洲精品欧洲色| 无码人妻一区二区三区四区老鸭窝| 日韩欧美三级| 久久东京热久久| 男女啊啊啊啊啊| 亚洲色图A| 国产精品日日摸天天碰| 久久久久久九九九| 一级做受视频免费是看美女| 亚洲国产一区二区日韩专区| 国产成人无码高清| 中文字幕国产精品1区| 欧美综合骚| 精品国产嫩穴视频| 欧美亚洲国产日本在线,久久精品国产| 精品人妻一区二区乱码一区二区| 97就爱干| 国产精品97视频| 加勒比99999| 天天综合网91| 五月婷婷六月丁香网址| 去干网最新版| 国产精品情侣啪啪| 和协影院中文字幕三区| 老熟乱一区二区三区四区| 好涩综合| 国产精品欧美日韩久久| 欧美视频在线第3页| 91在线限制级| 久久香蕉国产线看观看亚洲女人 | 男人天堂久久日韩| 欧美97av| 中文字幕国产| 国产原创自拍| 久噜噜| 久久东京热成人| 午夜a成v人电影| 欧美精品久久久久久久久88| 一二三四视频在线社区中文字幕| 亚洲小说视频| 26uuu性| 久久午夜伦| 欧美国产操逼| 日本成人在线不卡一区二区三区| 国产尤物AV尤物在线观看不卡| 亚洲乱熟女一区二区三区大香蕉| 超碰98综合网| 大象AV在线| 99热这里只有精品地址| 手机不卡视频不卡在线一二三区| 久久成人东京热人妻| 深夜福利黄片| 成人日韩欧美| 国产免费内射视频| 日韩激情啪啪| 97国产天堂岛| 亚洲av性爱电影| 大香蕉综合在线| 加勒比伊人影院| 日韩性爱长视频免费| 国产91久久九九免费精品无码| 天堂资源欧美| 欧美天天弄| 婷婷综合久久| 夜夜夜爽www精品视频| 夜嗨影院| 久久久久921| A一区片| 一区二区偷拍拍视频| 久久精品国产97欧美精品亚洲| 免费一级精品啪啪视频| 欧美97视频| 少妇高潮流水av免费| 久热69九色熟妇97| 亚洲九九九九| 亚洲少妇色图自慰直播| 美国黄片aaa| 熟妇人妻一区二区三区| 国产黄色剧情影片麻豆免费播放| 日韩啪啪啪啪啪| 亚洲美女精品九九视频| 久久国产视频性吧| 国产精品久久久久久久久久久久| 亚洲五月婷婷| 亚洲人妻精品一区二区| 亚州色图第三区| 国产400孕妇孕交群| 日本三级中国三级99人妇网站| 91天堂丝袜美腿| 精品国产久热在线观看| 91大香蕉伊人| 国产亚洲人妻综合日韩 久久| 日比av无码| 久久麻豆一区二区| 五月丁香六月综合缴清无码| 熟妇高潮精品一区二区三区下载| 国产高清免费不卡av| 18禁久极品美女久久哦哟呀!| 国产精品久久天天干| 亚州乱码中文字幕综合久久久| 国产v片在线免费观看| 青青草乱入乱欲视频在线观看| 欧美日日操| 久久九精品| 人人操人人摸人 | 51一区二区三区| 蜜桃午夜视频一区二区| 天天综合网91入口| 思思热国产在线视频| 久久久一区二区| 色色丁香| 人人操,人人插| 亚洲在钱| 久久色一区| 嫩呦国产一区二区三区AV| 亚洲熟女乱综合一区二区三区| 手机看片1024你懂的国产| 在线看污网站| 东北女人| 亚洲有码 欧美精品| 在线综合 亚洲 欧美中文字幕| 欧美色日| 大香蕉 222| 另类 日韩 熟女| 亚洲国产97| 超碰精品| 国产又操| 强奸乱伦大香蕉| 中文字幕在线免费观看 | 天天操妹子| 国产精品 午夜福利| 一起草日韩| 超碰色老头| 91超碰碰在线| 鲁鲁色综合网| 911粉嫩人妻| 日本性感人妻91| 九九九九九九精品| 长久操视频| 成人精品视频一区二区| 日韩啪啪啪啪啪| 伊人网综合在线视频| 大JI巴好深好爽又大又粗视频| 亚洲精品一区二区免费在线观看| 久久超碰、| 色五月婷婷网| 亚欧国产无码精品在线| 亚洲第一黄色av网站| 乱欲视频| 91精片| 91丝袜人妻| 天天综合麻豆视频| 神马久久69| 青青草精玖玖69精品| 黄片免费久久久久久久| 1区2区3区视频| 中文字幕一二三av| 亚洲双插| 色天天野狼综合社区| 国产二区三区粉嫩在线| A男人的天堂| 天天综合影院91| 欧美不卡在线美女| 一道本东京热加勒比一区二区三区| 亚洲九九夜夜| 婷婷亚洲色| 制服乱伦| 日韩在线76| 激情综合五月| 操逼日韩无码| 特级丰满少妇一级AAAA爱毛片| 啊啊啊啊免费视频| 亚洲精品一卡二卡三卡福利视频网站 | 日韩欧美中文字| 精品176精品2| 日日摸日日碰| 美女91av| 国产精品天干天干综合网麻豆| 长长久久曰曰夜夜成人网| 免费自拍三级综合| 97操| 99视频这有这里有精品| 屁屁影院一区二区三区国产 | 久久久月天| 视频二区美腿制服人妻欧美| 综合影院永久入口国产| 中文字幕精品一区二区精| 色伊人91| 五月婷在线| 91人人爽人人爽人人人,gav福利视频导航,日韩欧美亚洲国产字幕四区 | 亚洲精品国产日韩无码AV永久免| 日韩性爱视频在线免费观看 | 999久久久久久久久| 欧美热图99| 久久91| 在线播放一级无码视频| 国产日本久久免费精品| 亚洲综合春色| 1000午夜黄色| 97chaopengongkai| 国产精品日韩在线一区| 婷婷中文字幕| 国产视频第2页| 亚洲中文字幕av| 少妇久久久久久| 中文日本免费高清| 囯产精品一区二区三区线|亚洲人成无码网WWW动漫|国产精品免费一级... | AV天堂国产| 新版天堂中文资源8在线| 26uuu国产| 大香蕉99热| 国产精品动态一区二区三区四四| 欧美色视| 特级毛片特黄久久免费看| 97香蕉碰碰人妻国产欧美| 亚洲成人av色网| 天堂在线一区二区| 我想要啊 啊 啊| 秋霞Av理论一级在线| 久久社区一区二区三区| 亚洲欧美一区二区三区在钱蜜桃 | jazzjazz国产精品麻豆| 任你草| 蜜臀99999| 91成人无码| 精品午夜福利国产一区二区在线观看| 色五月亚洲| 国产免费久久精品99re韩国| 国产激情视频一区区三区| 无码 黑人一区二区三区| 亚洲最新a在线观看| 亚洲婷婷综合网| 日韩精品在线观看网站| 激情终合网| 性色aV一区二区三区噜噜| A V视频日本| 亚洲s在线观看| 美女91网址 | 亚洲AV无码乱码在线观看性色| 亚洲男人的天堂一区二区| 久久大香蕉97| 性爱1区| 亚洲青色欧美| 日本人妻伦在线中文字幕| 婷婷五月av| 久久网亚洲| 色伊人91| 久久久少妇诱惑精品视频| 久久久精品91八戒| 国产熟女精品区| 一级做受视频免费是看美女| 99re6久热只有精品6在线直播| 欧美图片校园春色| 国产精品午夜高潮呻吟久久av| 精品九九九九九九九九九| 日韩有码 一区二区三区| 97久久资源| 欧亚日韩一区在线| 尹人大香蕉视频在线| 欧美图片校园春色| 久久丁香五月天| 日韩97超碰| 亚洲中文日韩精品| 我爱操| 亚洲精品美女久久久久久久久| 亚洲宗合网| 国产三级日产三级韩国三级| 欧美日韩97在线| 久久三| 人人摸人人舔一区二区| 国产成人网站在线观看| 亚洲精品电影| ′ !γ}丶。。久久精品欧美一区二区三区 | 好爽视频在线观看| 久久久工口| 综合av社区| 久久超碰大香蕉| 成人八戒网站| 97se亚洲| 99国产在线绯色一区| 操操操五月天婷婷丁香影院| 91黑丝美女| a级成人毛片免费视频高清| 欧洲一区二区| 秋霞男人网| 色yeye成人免费视频| 久久精品国产99久久,亚洲日韩久久日本一区一区三区 | 久操视频免费在线观看| 亚洲无线码欧洲精品区别| 日本顶级天天操狠狠操夜夜操中文字幕 | 精品 码产区一区二-1080P高清在线www-B029AV | ji熟女.com| 中文字幕二区| 东北女人av| 少妇人妻太紧太深av| 色网亚洲人| 久久久久久亚洲精品不卡人乳| 思思热在线视频免费| 亚洲男人的天堂网| 日韩人体偷拍| 久久99人妖视频国产| 91美女网站| 成人欧美日超碰| 婷婷丁香五月综合| 免费一级黄色录像影片| 96久久久久| 欧美夜色| 人妻激情另类| 偷看洗澡一二三区美女| 91网九色蝌蚪操熟女| 无码人妻丰满熟妇区毛片| 韩国一区二区精品亚洲| 最新国产亚洲精品精品国产亚洲综合| 9久在线视频只有精品| 夜夜免费视频| 60秒试看最爽10分钟网站| 香蕉久久国产AV一区二区| 成人午夜高潮av猛片| 国产97在线播放| 久久97资源 网| 日本三级大片| 99热只有这里有精品| 欧州一区二区三区四区| 97视频一区| 天美传媒av在线| 欧美狠狠弄| 天天插天天射| 亚洲色欲天天人妻无码系列专区| 一级黄色视频网| 男女性无套 免费九一| 一本一道久久综合久久| 日本中文字幕熟妇| 夜夜爽爽夜夜精品视频| 国产精品欧美激在线| 久久草草欧美精品| www.夜夜| 欧美精品99久久久| 99久久综合| 午夜黄色免费在线观看| 激情综合网五月婷婷五月天| 欧美大香蕉同搞| 久久精品国内Av熟女高清| www国产无码| 大奶的诱惑| 美女啊啊啊啊啊啊| 九九九九热只有精品| 青青草华人在线欧美在线| 国产女人9999| 欧美日韩中国x| 久久久成人精品| av久日| 另类专区加勒比| 精品少妇人妻| 人妻色情天天操| 久久久天美| 密臀成人视频久久久| 黄色交缠性感爆操91国产精品免费一区二区三区 | 丝袜美腿操av| 久这精品中文在线观看视频| 一区二区三区看视频| 精品国产乱码久久久A| 老鸭窝成人免费毛片视频| 麻豆 美女 丝袜 人妻 中文| 日日摸天天爽夜夜欢| 91麻豆天美| 大香蕉视频一二三区| 欧美日日操| 亚洲精品一区二区三区在线播放| 97香蕉碰碰人妻国产欧美| 99这里只有精品| 骚乳在线| 97热视频在线观看| 伊人麻豆传媒| 国产亚洲深夜激情| 国精精品无码一二三区水多多| 日欧操屄视频| AV天天综合| 99re99视频在线免费观看| 亚洲AV在线资源| 国产尤物在线三区| 国产 日韩 欧美一区| 成年人三级黄色片视频| 日本肉体xxxx裸交| 日本丝袜美腿人妻九九| 男人的天堂无码| 欧美色院| 久久久久成人亚洲国产| 夜色五月天| 国产成人天堂| 校园春色五月天| 秋霞网—男女啪啪亚洲免费体验区| 中国一区二区亚洲人妻| 色女网日韩| 亚洲九九视频在线观看| 三上悠亚在线毛片91| 人干人人人操人人摸| 激情六月婷婷| 97超碰人操| 日韩性爱长视频免费| 浪人综合网| 日韩内射视频| 怡红院成人视频| 亚洲囯产精品女人久久久| 人妻久久久久久| 新视频sss国产| 中文字幕欧美丝袜07资源| 手机在线视频国内精品| 97玖玖人妻| 日韩无码第3页| 天天操夜夜嗨| 99爱久久视频频| 国产丁香精品露脸视频| 免费的很黄很污的全部视频| 国产精品对白内射| 91美女视频在线观看| 天天做日日爱夜夜爽| 国产熟女| 国产粉嫩蜜臀av一区二区三区| 婷婷激情综合网| 97在线资源| 无码高清操逼网址| 久草视频制服诱惑| 亚洲美女av无码| 日本 欧美 亚中文字幕| 亚洲精品97久久中文字幕| 欧美操逼熟女| 韩日巨乳美女免费视频在线观看| 亚洲97成人在线观看| 欧美少妇熟女| 啊啊啊爽爽| 九月色婷婷| 日韩日韩日韩-国产乱码精品一区二区| 日本不卡高清视频| 亚洲黄色网址| 国产操偷| 欧美精品欧美精品系列| 性爱乱伦一区| 久久久96精品| 欧美日韩第一页| 91欧美情色| 99热18| 99久草| 91人妻超碰| 国产精品白丝| 视频在线观看一二三区| 久久久久久久免费A片国产成a人亚洲精∨品无码 | 97啪啪| 丰满人妻一区二区三区四区| AV大香蕉| 小说区 图片区色 综合区| 亚洲aw毛茸茸在线 | 男人下部插入女人下部| 青青青国产手线观看视频2| 操人妻逼91| 欧美一级国产一级| av天堂加勒比| 女色视频社区| 人人看人人插| 天欧美在线| a久久| 亚洲伊人久久综合97| 福利一级版子| 日本午夜久久电影| 色欧洲| 欧美青青视频| 女人爽到高潮潮喷18禁网站| 少妇久久久久| 黄色不卡视频| 丁香五月影院| 性爱视频免费网址| 9九九国产| 亚洲性综合9| 国产Aα| 久久精品国产亚洲粉嫩| 日韩精品熟妇| 两性综合网| 国产免费一区2区3区| 91影视亚洲| 婷婷久月| 被男人添B超爽视频| 亚洲熟女乱综合一区二区在线-...亚洲国产日韩欧美一区二区三区,久久久久久精 | 91伊人| 久久AV色| www鬼畜国产男人的天堂| 脫衣舞一区二区三区| 96久久久久| 熟女网站最新| 人妻碰碰碰碰碰碰| 久久一区二区三区入口| 97色伦97色伦国产欧美| 骚鸭AV| 97er欧美性| 亚洲丝袜色| 自拍偷拍 日韩无码| 97在线观看| 91成人亚洲色图| 亚洲情色在线| 美女超碰978| 国产人妻天天干精品| 日婷婷| 欧美翘臀视频网站一区二区三区| 无码人妻系列少妇| 色九九九| 在线观看AV不卡| 日本护士高潮| 四虎影视永久在线免费| 91精品国产91久久福利| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区 | 很黄很色的视频在线观看| 我想要 啊 啊 啊| 欧洲站一级二级三级h| 99精品伊人| 日韩一999精品| 婷婷久久综合| 五月天激情影院| 久草网站免费在线观看| 日韩在线性爱免费视频| 亚洲日韩人妻中文字幕一区| 97超碰9| 在线洲亚线| 色香91| 制服中出中文人人精品| 欧美日韩婷婷中文| 日韩激情视频| 日韩精品第3页| 天美一二三在线观看Av| 91女网站| 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | 色999人与兽| 情侣开房子拍 日韩无码 女的很漂亮| 成人看片网站| 亚洲激情四射| 欧美有码激情视频一区二区三区| 色婷婷影视| 二色av| 色爱综合网| 亚洲情色电影网| 99re6久热只有精品6在线直播| 少妇一线天久久久久久| 精品久久青青草| AND人妻系列| 色天使大香蕉| 97超碰资源网| 99福利社| 久久 精品| 欧美精品二区视频在线| www.久久制服糖| 18禁美女裸体无遮挡啪啪| 日日操丁香五月天| 国产高清成人传媒影视| 曰韩精品九九无码| 欧美三级免费伊人| 欧色性第一页| 超碰97极品9| 午夜精品久久99蜜桃的功能章节| 久久久性| 日本操逼二区| 99热这里是精品| 丰满少妇一区二区三区四区观看| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 啊…啊…操我用力操我| 伊人97色天使| 欧美综合 站| 91美女片在线| 岛国1区2区3区在线观看| 日韩欧美aⅴ综合网站发布| 国产大学生高潮在线播放| 六六久久日韩不卡| 99国产精品免费| 91九色丰满高潮| 日韩视频中文字幕| 黄色免费网页无码| 在线观看一卡二卡| 久久一二三四五六七八九区区| 夜夜春夜夜操| 天堂v无码免费视频| 精品一区二区在线针对华人免费观看这里只有精品免费观看 | 久草视频观看视频在线| 超碰AV在线| 九月AV| 东北老熟女| 国模无码人体一区二区三| 91麻豆va国产精品| 麻豆天美传媒在线视频天堂| 青青草华人在线欧美在线| 中文字幕av亚洲精品| 中文字幕精品资源在线| 中文字幕 一区二区 亚洲无码| 国产精品在线一区二区| 草草草视频在线免费看| 久久亚洲精品成人av| 暖暖精品二区三区观看| 精品美女少妇一区二区| 午夜一区二区三区国产| 九色 人妻 大香蕉| 天干天干天干天天做| 麻豆国产视频精品观看| 素人播放一区| 亚洲精品九九九九九九| 人人操人人插人人摸人人干| 99r九九| 亚洲少妇视频| 色香色欲天天综合网天天来吧 | 久久久国产av美女私房| 黑丝少妇在线观看| 蜜臀99久久精品| 久久久久亚洲av综合波多野制衣| 久久人妻97久久久久久久| 精品人妻久久久| 亚洲国产成人精品无码专区| 女生自91网站| 岛国黄片网站| 北京专精特新企业招聘信息| 97亚洲中文| 99久热| 91成人亚洲色图| 国产午夜无码片在线观看影视| 97视频620| 人妻精品免费一二三区| 91亚洲人电影| 97超碰久久| 亚洲第一页色| 9久久久久| 99激情| 青草一区二区| 久久久九97| 日本韩国五十路六十路七十路老熟女作爱视频网站 | 色播五月丁香| 青青青在线高清视频在线一二三四区| 亚洲天堂 视频你懂的| 99热国产精品| 蜜臀AV网站| av影院十区| 色噜噜综合网| 亚洲 欧美 色图| 精品久久視頻在线| 97精品久久| 少妇同性| 婷婷丁香九月| 91碰碰| 久久九色| 中文字幕乱码在线| 99re不伦| jk白丝没脱就开始啪啪| 亚欧美综合| 99热超碰| 熟妇乱伦一区二区| 97久久久精品| 日本性爱不卡视频| 国产馆| 操我啊啊啊啊啊| 成人麻豆av电影网站| 日日干夜夜欢| 五月婷婷激情网| 久久AV无码AV| 18禁久极品美女久久哦哟呀!| 日本一区二区成人在线| 97超碰精品图片| 国产乱婷婷精品二区三区| 欧 美 自 拍 偷 拍| 精品中文一区二区| 日日夜夜天天| 三级AV入口| 久久久久久久综合,国产| 激情综合五月婷婷| 岛国1区2区3区在线观看| 欧美高潮| 精品妇女一区二区三区| 中文字幕国产| 麻豆成人影音在线| 日韩人妻精品中文字幕| 九九黄色网| 国产丝袜美女在线一区| 激情婷婷丁香网| 人妻在线中出视频| 免费A V在线播放| 69麻豆天美| 天天操天天日青青草超碰av| 97九色人妻| 乱伦Av网| 免费试看60秒| 久久精品无码熟妇一区二区三区视频导航 | 欧美日韩免费专区在线| 人人妻人人狠人人| 老外又粗又长一晚做五次| 208天天久久九九九| 麻豆人妻少妇在线免费观看| 色婷婷丁香| 日日夜夜精品| 2017亚洲天堂| 久久亚洲欧美一区二区三区-亚洲国产精品第一区二区 | 留下AⅤ黄色片| av网站免费线看| 久久久亚洲精品中文字幕人妻| 蜜桃色院一区久久 | 青青操在线亚洲视频观看欧美在线| 黄片直播三级黄片两女一男| 精品人妻一区二区三区四区石在线| 久久成人东京热人妻| 97视频620| 麻豆久久视频在线地址| 性色av婷婷久久一区二区点复制| 中文人妻av高清一区| 色99999| 欧美宗合色| 天天日天天干天天摸天天操| 男人精品天堂一区| 欧美 日韩 另类 亚洲| 日本曲间由美性生活片| 国产一级片| 欧美精品自慰系列寂寞少妇 | 亚洲码和欧洲精品激情系列| 色色99| 日韩操人| 欧美性爱在线无码| 免费人成?大片在线播放| 亚洲精品一二区| 中文字幕人成乱码熟女香港| 成年人黄色视频免费| 97视频在线播放| 天天综合~91| 日韩小电影| 欧美78P| 性色aV一区二区三区噜噜| 怡红院成人视频| 婷婷10月天青娱乐| 九九九久| 日韩天天综合| 久久在肏| 色网色网色网色网色网色| 久久午夜色播影院免费高清| 欧美劲爆第一页| 另类欧美色| 91丝袜在线观看| 国产强奸乱伦第1页| 欧美日本成人一区二区| 秋霞午夜成人福利片片| 国产毛片毛片4p懂色| 日本东京热久久久电影| 亚洲色图尤物视频| 天天摸夜夜添无码小视频| 日韩乱伦影音先锋| 竹菊影视国产一区二区| 99久久9| 日韩pv中文| 国产精品 午夜福利| 亚洲黄色网址| 天天干夜夜操一区二区| 亚洲欧美伦综合| 一级二级在线观看| 91深夜夜| 国产视频不卡在线观看| 99在线精品视频| 啊啊啊啊视频免费| 无码人妻精品一区二区三区九九| 日韩精品国模| 97久久超碰日韩精品| 欧美色图片| 日韩Va亚洲va欧美Ⅴa久久| 精品国产www久久| 天天操夜夜操| 亚洲男人的天堂AV| 蜜桃网熟妇| 91精品国产91久久青草| av在线观看不卡网站| 免费精品福利在线观看| 95精品在线| 偷拍综合亚洲| 天堂性色| 变态乱伦伪娘灌肠一区二区| 在线看免费无码AV天堂的| 亚洲情色五月天| 九九九精品一区二区无码| 熟妇色99| 国产最新小视频在线播放下载| 无码伊人久久大杳蕉中文无码| 丝袜美腿欧美| 九九免费影片| 人人爱人人乐人人操| 欧美顶级黄色大片免费| 日韩人妻少妇中文字幕| 欧洲亚洲综合| 三级日韩一区二区三区| 色爱国产| 国产不卡中文字幕免费avi| 青青青在线高清视频在线一二三四区| 午夜视频黄| 99综合免费视频| 伊人久久蜜月| 操逼网站网站| 综合网色| 久久成人午夜狠狠| 在线观看亚洲成人精品| 五月婷婷综合网| 久久妇| 一级性爱视频免费在线| 婷婷久久久| 久久久成人免费av电影| 富女玩鸭子一级毛片| 九九久久99| 大香蕉日亚洲日本亚大| 91伊人久| 熟妇女人妻呻吟久久AV| 天天狂操夜夜狂日| 国产精品久久久久无码AV会牛| 五月天综合网| 91天天看| 婷婷亚洲中文字幕在线| 人妻蜜桃臀| 日韩激情啪啪| 日韩 女同 综合| 成人a大片在线观看| 欧美天天综| 精品无码久久久久久久杏吧| 亚洲欧洲另类| 欧美日韩小说| 爽 好舒服 无码刺激久久| 另类专区加勒比| 凹凸视频在线观看伊人| 天天天天天天天天综合| 午夜a成v人电影| 久久天天躁日日躁狠狠躁| 综合久久97| 久热伊人99re| 欧美999| 欧美人妻二区三区| 日本国产欧美一区三区二区| 国产不卡片| 亚洲丝袜诱惑| 国模限制级电影| 成年无码动漫av片无尽在线 | 中文字幕在线免费观看2| 欧美日韩夜夜| 国产精品高潮久久久无码| 欧美天天拍| 老熟女乱伦片| 天天享受天天看| 亚洲 自拍偷拍 欧美| 东京热精品97综合网| 日韩卡一卡二卡三在线| 青青草无码视频| 操逼操操操91| 人妻喷水| 91撸色网 玖玖网 欧美| 家庭乱伦国产精品| 校园春色中文字幕AV| 99久久精品国产高潮| 97av在线观看| 欧美性Fer办公室秘书| 婷婷五月色| 人摸人人操人| 情趣丝袜无码操逼视频| 天天综合站| 96免费视频在线| 综合熟女| 日本日皮视频逼| www.色吧5.com| 久久二| 欧美丝袜91| 久久久久久99999国产精品| 91久久久久免| 中 文字幕一区二区三四 五 区日 日 骚| 2018色综合天天操| 大香久久| 亚洲欧洲日产国产综合网| 亚洲第一页色| 欧美久热| 欧美操人| 狠狠爱综合网| 九月色婷婷| 开心激情站| 亚州少妇| 狠狠干综合| 性高潮久久久| AAA久久| 欧美性视频二区三区| 精品性爱一二三区| 国产女人视频三四五区| 97久久免费| 再深点灬舒服灬太大了好硬好爽| 麻豆久久精品亚洲精品88 | 伊人欧美大香蕉视频| 欧美 亚洲 制服 精品| AAAAAAAAA黄片| 青青草好吊色| 一区二区三区成人 | 亚洲成人贴图| 综合性视频99| 精品久久久久9999| 日本肉体xxxx裸交| 人人干黄色| 国产AV中文| Aa东京男人的天堂| 亚欧美天堂在线| 午夜男人一级A片7777| 在线观看无码三级少妇| 91人人| 人人妻人人色一区二区三区| 亚州成人A√| 成功精品影院| 亚洲美女自拍偷拍视频| 无码人妻一区二区三区色欲aⅴ| 国产91丝袜 在线播放| 1000午夜黄色| 久久婷婷在线观看视频| 五月丁香六月激情综合| 操高情无码| 国产成人无码a| 青娱乐休闲视频在线观看| 99热这里只有精品1| 欧美国产操逼| 97色涩| 成人网欧美风情| 天天影视综合网欧美精品| 91黑人无码激情在线| 中文字幕一区二区韩| 亚洲AV秘无码一区..| 精品蜜乳AV免费观看| 夜夜欢天天干| 一级做a爰片性色毛片久久| 精品人妻一区| 99久久精品欧美国产| 九九九九精品九九九九| 亚洲美女精品九九视频| 91N综合网| 亚洲另类色综合网站| 99最新日韩偷拍视频| 欧洲自拍色图gif在线| 亚州中文字幕超碰97| 久久偷拍人| 亚洲瓯美色图| 一区二区三区四区姦女| 在线观看十八禁| 欧美另类色| 嗯嗯啊啊用力视频免费| 日本不卡三级网在线播放| 97干com| 欧美一区二区在线资源| 日本天堂网| 久偷拍| 96国产污污污丝袜| 婷婷15月天青娱乐| 91爱欧美| 久久精品噜噜噜成人看免欧美大片| 精品无人区麻豆乱码1区2区图片| 亚洲好色人妻|