亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

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
返回資訊列表
亚洲精品97久久| 色青青久久影视| 色牛牛AV| 天天干人妻视频| 国产二区三区免费视频| 色色亚洲| 久久精品无码熟妇一区二区三区视频导航 | 日韩无码a片| 乱精品一区字幕二区| 久久人妻少妇| av日韩国产一区二区| 欧美三级一级| 大香蕉手机在线| 三级片网站在线播放| 欧美日韩亚洲高清不卡一区二区三区| 日韩在线国产字幕| 亚洲国产精品久久久久久久久久| 欧美精品不卡一二三四在线91| 久久免费99精品久久久久久| 精品熟女一区=区三区| 亚洲欧美另类图片| 日本3级一区二区免费| 亚州欧美综合| 丰满少妇乱子伦精品无| 九九这里只有精品| 久久天堂网| 中文字幕123| 中国熟女老妇仑乱一区二区三区| 国产91丝袜 在线播放| 亚洲熟伦熟妇AV无码春色| 少妇久久久| 久久免费少妇| 不卡一区二区日本视频| 97 视频在线| 一区AV| 欧美另类色| 欧美97| 色哟哟-国产专区| 日本色色色网站免费看不卡| 97色冈| 黑人猛交| 亚洲宗合网| 久久久久成人亚洲国产| 久久久久久久久9| 一区二区三区欧美激情| 狠日欧美| 精品乱子一区二区三区99| 亚洲97成人在线观看| 九九久久99| 日韩精品碰碰| 日本高清加勒比| 色官网色综合| 九九操久久国产免费视频| 狠狠爱综合网| 狠狠久久手机视频精品| 国产精品对白自产拍| 日韩999| 久久产精品一区二区三区电影| 自拍丝袜美腿人妻| 日本道久久综合色色| 中文字幕文字幕无码一区二区三区电影99| 中日韩欧美精品无码AⅤ一区二区| 亚洲综人| 亚州操操穴网| www.99中文字幕| 在线电影亚洲色图| 亚洲18禁| 激情视屏国产乱伦强奸| 91五十路| 中文字幕、久久精品国产2020、久久综合久久自在自线精品自、亚洲 | 久久久久久久唑| 夜夜狼人妻| 日韩少妇一区二区三区| 91狠狠综| 欧美综合区| 国产精品懂色tv影视免费观看| 伊人久久88国产女| 久久久亚洲高清不打码| 中文字幕青青草| 丝袜狠狠草尤物人妻av91| 亚洲免费在线探花| 91美| 伦理日韩国产久久| 精品国产自在在线99| 免费αV在线视频| 黑人干亚洲| 色av中文字| 秋霞网—男女啪啪亚洲免费体验区| 91久久堂| 色爱欲亚洲| 色超碰综合| 99热精品在线在线| 日韩在线一区二区| 成人97人人超碰人人| 在线小说视频一区| 蜜臀AV成人精品蜜臀AV久久| 精品女人999| 黄色av片三级三级三级免费看| 蜜臀久久99精品久久久久久无删减 | 国产精品3| 日韩另类色图| 亚欧高清在线| 在线播放免费av福利片| 嗯嗯啊好爽| 精品丰满熟妇人妻一区| 东方亚洲在线操逼天堂| 六月丁操逼| 99热这里都是精品| 精品人妻一区二区三区视频在线| 91在线精品| 超碰欧美97| 日韩无码服务区| 天天爽夜夜欢视| 99热在线播放| 午夜丁香| 欧美一级三级| www.狠狠| 中文字幕 码精品视频网站| 综合操逼| 在线观看色视频| 国产女同视频在线播放| 日本精品网站在线中文| 成人羞羞视频国产| V A在线| 久久精品无码专区| 99热这里只有精| 嗯啊不要在线观看嗯啊| 国产精品成人无码av| av天堂精品久久| 欧美AAAA黄片| 女人被男人桶爽视频网站| 色汉综合| 神马久久久久久| 97国产|免费| 欧美在线干| 久久久久久久久久久久久久久久9| 国产怡红院| 日韩国语字幕| AV老汉| 亚洲棕合电彰| 伊人国产视频| 蜜桃狠狠色伊人亚洲综合 | 3p国产欧美99热| 操逼逼福利视频| 秋霞无码av鲁丝片一区| 欧日a| 久操网无码在线| 草草影院最新网址| 午夜精品久久久久久久久久蜜桃| 97在线精品观看视频| 久久久久久久九九九九九九| 亚洲欧美日韩精品久久久一区二区| 肏逼视频日本| 九月激情婷婷| 最新日韩黄片| www四虎| 久久天天性久久伊人| 青青草原狼av| 你草精品在线视频| 午夜福利在线合集| 91四海无码日韩欧美| 大香蕉日韩| 大粗鳼巴久久久久| 日本爽爽爽爽爽爽免费视频| 密乳无码| 久久人妻精品| 中文字幕神马久久| 成视频在线观看免费看| 青娱乐国产盛宴视频| 日韩一级片在线看| 九九九九九九九精品视频| 亚洲免费精品一区| 欧亚韩国999| 噜噜噜噜久久久精品免费| 精品九九九九| 人人摸人人摸人人干| 激情综合色| 亚洲色图a| 国产一区二区精品在线视频| 97综合| 俄罗斯一区二区视频在线观看| 久久三| 天无日色综合| 欧美激情亚洲色图| 超碰社区97| 欧美色网| 97人人射| 色麻豆AV| 麻豆久久一区二区三区| 超碰国产精品久| 天天综合精品| 大香蕉宅男伊人| 加勒比久久av| 九九精品无码专区免费| 99热这里是精品| 区二区亚洲婷| 欧美天天综合网版| 国产成人午夜视频网址| 超碰超碰95| 色臀aV| 中文乱码字字幕在线第5页| 亚欧日韩成人| 亚洲国产剧情少妇激情| 密臀在线视频| 五月丁香拍拍激情综合三级| 影音综合网| 丝袜翘臀后入欧美校园亚洲自拍另类小说一区中文字幕少妇诱惑 | 91精品人| 九热视频| AND人妻系列| 久久精品人妻一区二区三区| 三级精品三级在线观看| 九九久久九九久久| 久久精品国产97欧美精品亚洲 | 国产黑白丝在线| 天天网综合| 人人摸.人人色| 这里只有精品视频| 亚洲涩图欧美| 亚州一区二区成人片免费| 人人天天欧洲| 亚洲图片 欧美电影| 97精品一区二区视频| 97操碰| 五月丁香婷婷啪啪| 3P乱轮视频| 日本一区99| 婷婷五月天网| 九九九不卡| 精品亚洲国产成人精品| 99精品伊人| 啊啊啊好想要| 欧亚综合一卡二卡中文字幕| 蜜臀99精品国产高清在线观看| 日本操嫩b网| 大乔未久88一区| 综合激情二| 亚洲一区中文字幕久久,果冻传媒一区二区天美传媒 | 强乱老妇中文字幕| 岛国成人av在线播放网址| 欧美91网站| 福利视频香蕉免费一区二区在线| 亚洲国产精品久久久久婷婷青年| 97在线看| 日韩欧亚太美不卡| 岛国1区2区3区在线观看| 成人熟女视频一区二区三区| 99视频这有这里有精品| 影音先锋一区二区在线资源| 蜜乳AV一区| 玖玖草久草99蜜月一区二区三区| 日本人人操人人操| 亚洲脚交| www.狠狠操| 亚洲综合20p| 伊人网av| 日本性爰一道本| 欧美性综合| 日本五十路熟女一区二区| 操九九九九九九| 午夜性生活av免费在线看| 奸色色 男人天堂 天天射| 亚州综合色| 在线二区不卡| 亚洲图片视频小说| 淫妻综合网| 另类欧美色| 久久精品欧美一区蜜桃| 一本色道久久天天射天天干| 亚洲黄a三级三级三级看三级| 大学生口爆吞精| 欧美天天综合站| 日韩av在线播放不卡| 加勒比综合在线| 久久人妻视频| 精品蜜乳AV免费观看| 中文字幕加勒比海高清无码免费视频| 日韩国产欧美伦理在线| av72网| 色色色欧美| 啊啊啊啊啊,啊啊啊啊好舒服,操我舒服啊啊啊 | 自拍盗摄一区| 日韩av在线播放不卡| 全国男人天堂网| 亚洲国产成人精品久久久国产成人一区二区| 亚洲丝袜综合| 91精品伊人久久久大香线蕉91| 亚洲老司机123专区| 日本国产欧美高清在线| 久久天堂| 国产夫妻性生活视频| 首页亚洲国产高跟丝袜诱惑视频| 国产精品高清2021在线| 久久久女人| 麻豆黄色五月天| 成人小说另类在线| 精品成人女人久久| 欧美日不卡| 日韩激情小说一区二区| 久9精品| 一个人在线看的黄色电影网站| 青娱乐亚洲自拍| 久久久久久加勒比| 丁香激情五月天| 黄片qw| 日本亚欧爱爱| 天堂在线一区二区| 麻豆精品久久久久久久| 欧美性爱伊人| 国产高清自拍视频| 999色欧美中文字幕| 婷婷色香| 婷婷亚洲综合| 日本一级二级三级网站| 久操操AV电影| 人人摸人人入| 欧姜老司机| 色亚州人久干视频在线观看免费版| 亚洲色图大香| 激情五月婷婷综合| 国产高清成人传媒影视| 大香蕉强奸乱伦| 色噜噜国产在线| 亚洲色情在线影视| 丝袜制服字幕在线| 天天爽夜夜操| 久操热线| 久久高清欧美国产| 超碰在线观看av不卡| 久 久无码人妻AV| 欧美黑人日韩少妇色情| 97色涩| 久久这里精品国产99丫e6| 天天肏夜夜肏| 无码 有码 国产18p| 国产日产精品久久快鸭的功能介绍| 啊啊啊免费视频| 在线洲亚线| 欧美综合传媒| 丝袜天堂| 青青草十区九区爱夜| 韩国一级婬片A片AAAAA| 亚洲九月丁香| 啪啪资源网| 97视频网站在线观看| 情色av电影| 日韩性爱1级片视频| 牛牛aV| 亚洲最大无码中文字幕网站| 26uuu国产免费观看| 激情婷婷丁香| 99久久99久久综合| 色五月婷婷色| 亚洲 欧美 小说| 男人的天堂2018.| 欧美亚洲清纯| 欧美激情视频在线一区| 欧美啪啪女女| 一直超碰| 亚洲国产美女久久久久| 立川理惠加勒比无码| 超碰99在线观看| 九九十八精品| 亚洲图片另类| 久久成人午夜精品影院| 人妻精品一区二区全免费| 久射吧| 日韩欧美成人综合在线| 精品熟女一区=区三区| 33044男人的天堂深夜备| 被男人吃奶很爽的毛片| 91欧美偷拍| 色五月av| 激情五月天网站| 久久精品国产97欧美精品亚洲 | 9 1果冻精品视频| 探花一区二区三| 精品网站9999| 97视频在线播放| 狠狠操综合| 国产丝袜一区二区三区| 最近2019中文字幕国语免费版 | 密桃99999| 亚洲双插| 91大学精品激情戏| 超碰在线综合97| 日本色色色色色视频| 国产精品视频播放| 欧美经典一区二区三区| 亚州高清色综合| 午夜.DJ高清在线观看免费7| 欧美韩国你懂得在线| 黄片qw| 熟女在线视频| 天天爱天天操| 超碰97欧美在线| 香蕉欧美| 国产视频第2页| 综合操逼| 网友自拍第1页 | 国产91精品福利在线| 久操影视| 日韩精品国产精品五码一区二区| 九t超碰| 99热婷婷| 五码视频在线观看| 9久精品视频在线观看| 亚洲一区二区中文字幕| 亚洲天堂男| 婷婷三区| 影音先锋国产精品| 亚洲综合嫩| 久久久不能久久久久| 亚洲色系另类精品国产| 伊人在线大香蕉视频久久| 欧美色色色| 欧美人与动性人交a| 偷拍综合亚洲| 啊啊啊啊视频免费| 天堂无码精品国产久| 易易A毛视频| 伊人991| 欧美99| 免费伦费视频在线观看| 女生看匆91网站| 久久精品视频28| 五月天久久久| 天天视频黄网站| 中文字幕乱亚洲美女精品一区| 亚洲 欧美 另类 日韩 人妻一区 | 天天弄欧美| 日韩婷婷| h4610国产人妻| 亚洲成人黄色在线观看| 欧美大片91| 中文字幕乱码人妻二区三区| 91天天综合日韩欧美| 蜜臀久久99精品久久久老,,| 99夜夜操| 久久免费99精品久久久久久| 熟妇视频一区二区三区在线观看| 精品欧美老熟女一二区| 亚洲国产精品久久久男人的天堂| 国产尹人在线视频免费| 五月亭亭六月丁香| 亚洲精品白丝| 亚洲情色电影网| 一区二区三区探花在线观看| 97天堂| 国产肏屁眼视频| 日本精品成人无码| 97天天日| 强乱老妇中文字幕| 色踪合AV| 欧美亚洲宗合色性图| 91美女丝袜诱惑视频| 日本操逼视频不卡直接放| 国产91丝袜 在线播放| 久久夜夜夜夜| 男人的天堂.com| 青娱乐日韩无码| 久久久久国产精品喷潮免费观看臀| 久久97超碰| 狠狠2050在线观看| 欧美视频激情久久久久久| 欧洲精品在线播放| 嗯啊不要啊啊在线观看视频| 國產尤物AV尤物在線觀看| 99久久亚洲精品无码毛片潘甜甜 | 花花AV导航| yiren97| 亚洲。日韩。欧美| 六月丁香网| 男啪女色黄无遮挡免费观看| 欧美综合网| 丰满人妻区一区二区三| 成人国产视频在线观看| 午夜小电影在线插入淫高潮 | 国产传媒日本欧美专区| 中文字幕久久精视频久久大全| 插老姨肥穴| 91精品国久久久久久无码| 91网站18在线| 久久视频,这里只有精品 | 麻豆色99999| 五月天亚洲网| 特色a在线上| 国产精品白丝在线播放| 欧美性爱日韩性爱| 亚洲夜夜欢无码一区二区| 狠狠爱综合| 懂色AV一区二区三区| 天天看天天综合成人网| 久偷拍| 东京热大香焦| 久热最新在线杭州| 亚洲色婷婷久久91| heyZO天然素人无码AⅤ专区| 中国探花熟女| 久操99| 一区超碰一区| 亚洲综合在线第一页| 亚洲欧美国产va在线播放频| 成人性爱电影一区二区| 欧美性猛交美女自慰91| av线电影| 污色区网站| 久99视频| 丝袜喷水在线| 秋霞福利网| 天天综合~91| 黄色视频特级毛片| 天天干一区二区| 久久是精品| 欧美色图色综合| 人妻精品视频一区二区| 91在线|亚| 欧美色天堂网在线视频| 久久专区| 色婷婷影院| 丰满欧美放荡少妇在线| 51久久夜色精品国产麻豆| 色色操| 国产精品97超碰| 无码精品久久久天天影视| 人妻精品一区二区在线| 欧美亚洲涩涩| 黄人人操人人操| 亚洲不卡不卡中文字幕不卡| 一二三四视频在线社区中文字幕| 天天综合亚洲综合| 亚洲精品日韩国产欧美| 在线小说视频一区| 操逼逼中文字幕| 区一二区日韩亚洲乱码av电影| 老鸭窝成人免费毛片视频| 十八禁啪啦拍视频无遮挡| 97操在线| 八人操人人摸人人看| 久久久久久久国产| 日韩综合无码一区久久92| 婷婷色综合| 熟人人妻少妇精品久久| 国产按摩一区二区三区| 老司机福利青青草| 先锋音影AV| 天天影视色香欲综合网小说| 欧美 亚洲 综合 制服| 久久超碰日韩精品| 五月天色图| 92一区二区| 无码一区二区三区四区五区六区七区八区九区十区视频 | 亚洲一区二区三区AV无码| 91爱看| 日韩欧美tv一区二区在线观看| 新精精品久久精品| 8050无码八戒| 久久三区四区| 91 国产丝袜在线放观看| 黄片免费视频2019| 福利天天都操| 美国美女AV在线| 强奸乱伦 亚洲一区| 成人精品视频| 亚州色图第三区| 亚洲一二三四区| 超AV色女| 欧美激情中文字幕另类小说| 91精品国产一区三一| 天天摸夜夜操视频| 麻豆久久久久久久久丝袜| 精品性爱一二三区| 91久久免费视频互動交流| 97就爱干| 啊啊啊啊啊操我视频| 自慰白浆在线观看| 天天激情干| 农村少妇久久久久久久| 亚洲熟女乱熟乱熟妇综合网二区| 天天干,夜夜爽| 高清国产成人无码| 亚洲资源站| 夜夜做夜夜爽精品视频| 欧美一二三区四五区| 婷婷久久久| 人人摸人人添人人操| 国产福利视频精品视频| 97干97色| com 首页 18岁 禁区 女优 免费 精选 同城 | 久久成年片色大黄全免费网站| 97在线观看免费视频l| 一区久久久二区| 天天干一干| 成人丁香五月| 天天躁日日躁AAAXX| 99久久久无码国产精品性男| 岛国视频免费在线观看| 亚欧无码在线| 影音先锋乱| 国产麻豆一级精品视频| 亚洲Av无码成人精品国产| 欧美顶级黄色大片免费| 无码人妻丰满热妇又大又粗| 密乳无码| 99热9| 亚洲夜色在线| 日日骚 av| 大香蕉伊人色偷偷在线| 九九九九九九亚洲| AV99热18这里只有精品| 久久成人午夜狠狠| 婷婷色香伊人| 欧美一区二区三区四区综合| 大香网站| 日本91白丝| 精品国产一区二区三区久久久蜜臀 | 婷婷五月天小说| 六六久久日韩不卡| 天美传媒Av在线| 91成人亚洲色图| 91性感在线| 久久久精品电影| 在线观看黄色电话| 色色99| 国产中文福利| 色综合天天爱去电影网| 亚洲一区二区三区中文字幕| 色99视频| 日本97久久久精品| 花花AV导航| 亚洲av无码国产精品字幕| 超碰人妻天天干| 亚州少妇| 色狠狠一区二区三区香蕉| 欧美成人一级麻豆| 一区二区三区视频| 天欧美在线| 国产亚洲福利第一页丝袜| 噜噜吧,噜噜色,噜噜| 久久久久久午夜男人的天堂| 天天内射| yw尤物av无码点击进入麻豆| 92福利社视频| 91女优在线观看| 在线播放成人高清免费视频| 好淫网一二三视区| 天天综合网~91| 视频在线观看免费一区二区三区| 精品久久在线区一区| 九九九九一级| 做爱A级亚欧| 亚洲色图加勒比| 欧美BT 亚洲色图| 在线人人人人人人精品超| 宗合情欲网| a级免费在线观看| 国产视频一区二区在线| 美女久久久久久久久久久| 五月丁香啪啪啪| 青草一区二区| 国产男人又猛又粗又爽| 手机在线视频国内精品| 熟妇激情| 综合网色| 色色97爱| 玖色AV| 激情欧美97| 午夜福利成人免费视频| 欧美日韩久久精品爱爱| 热久久精品| 97色伦97色伦国产欧美| 岛国人妻少妇av在线观看| 免费观看国产小粉嫩喷水精品午| 亚洲激情色片| 欧亚性爱啪啪| 免费视频一二三区| 大香蕉欧美伊| 欧美三级中文字幕hd| 天天搞欧美| 97久久久久久久精| 国产欧美精选自拍一区| 蜜桃午夜视频一区二区| 亚洲天天艹| 亚洲最新av无码成人精品区| 十八禁电影伊人网| 91精品成人www| 日韩无码精品综合久久| AV男人天堂网| 亚洲一二三四区机械| 黄片免费看黄片免费看| 国产老太乱伦一区| 精品日韩产品在线,日韩在线不卡视频,欧美日韩免费专区/久, | 97 视频在线| 欧亚免费视频| 国产日逼视频| 亚洲麻豆av一区二区| 亚洲人妻久久久| 九九热九九热| 97色色网| 成人综合久久精品色婷婷| 亚洲无码超碰免费| www欧美91| 老熟女中文字幕高清| 久久久999日本大片| 去干网最新版| 搞中出久久| 日韩簧片免费看| 日韩视频中文字幕| 欧美色老汉| 久9综合在线| 97精品中文字幕| 一区 欧美 日韩 麻豆| 欧美v日韩欧亚洲电影天堂色诱,国产传媒| 国产精品婬乱一级毛片彝族| a亚洲欧美色欲| 国产精品国产亚洲区艳妇糸列| 日韩综合97p| 九九九偷拍| chaopen97久久| 天操天操夜操夜月月年年操操| 久久久精品久久| 亚洲日韩久久精品一区| 亚洲欧美在线综合| 本道在线| 国产视频第二页| 天天日夜干| 久久超碰网| 成人av在线播放| 久久精品国产亚洲妲己影视| 97在线观看播放视频| 中文一区在线视频| 欧美很很操视频| JIZZJIZZ国产精品喷水| 中文字幕在线日亚州9| 717影院理论午夜伦八戒| 国产日韩欧美三级片| 午夜精品一区二区三区三上悠亚| 日本人体九九九九九九| 久久久久久久一级黄色打同平台| 免费人人搞97| 色婷婷蜜臀av| xxx亚洲午夜天堂| 久久一区二区加油站| 久9久9久9久9久9久9| 99热在线只有精品| 国产女同在线观看视频| 污污汅18禁网站在线永久免费观看 | 射丝袜大香蕉| 日少妇视频| 欧美日韩在线国产在线| 欧美日本国产日韩激情视频| 免费AV播放| 欧美72网页| 0755午夜福利视频| 欧洲亚洲国产综合在线| 九九无码视频| 亚洲素人网| 天天插网| 久久一级无码精品毛片6| 日本一区二区电影网站| 欧美成人精品一区二区男人蜜臀 | 超碰97伊人| 国产高清视频无码在线| 91美女中出| 天堂伊人久久| 日本操逼无码| 激情五月婷婷| 天美麻豆一区二区三区| 秋霞免费AV| 日韩伦理视频| 亚洲人妻久久| 99在线观看| 日日日色色色色色| 东北丰满熟女国产一区| 青女在线| 性影在线视频| 色老汉色| 人人操人人操人人人操| 男女91| 欧美日日夜夜| 久久AV色| 青青久久手机线视频| 嗯阿好爽好紧| 中文字幕黄片在线| 蜜乳AV免费观看| 久久超碰亚洲人| 奇米四色网| 99国产精品免费| 人妻熟女一区二区在线视频| 国产成人无码网站在线视频| 青青草久草AV| 国产乱码精品一区二区三区四川| 香蕉大久久久| 久热伊人| 亚洲色婷婷久久91| 操人妻少妇中文| 久久AV无码AV| 97er欧美性| 8050午夜少妇无码| 大香蕉人妻久久| 精品久久視頻在线| 最近2018中文字幕在线高清第一页| 99自拍B亚洲| 曰韩精品视频一区二区| 夜夜综合| 久久香蕉网| a片自拍直播视频| 热热色色综合| 亚洲高潮少妇| 九九久久一区二区伦理| 九九热精品视频六| 亚洲人妻熟妇三十三区| 日日碰狠狠添天天爽超| 天堂成人网| 日韩操呦呦影院在线观看| 婷婷六月色| 18禁网站在线播放| 校园春色 欧美| 国产热av| 五月天综合网| 亚洲国产欧美日韩精品一区二区三区,国产一区二区三区在线看片,欧美性猛交 XXX | 久久久久九九九| 欧美成人性活片| 人妻少妇久久中文| 国产精品成人无码av| 国产日韩中文字幕欧美| 日日天天久久啊啊aaa| 国产AV高清AV无码| 日本一级真人黄色性爱视频| 99热这里只有精品1| 久久綜合很很很| 人妻激情偷乱视三区频一区二区| 强奸乱伦免费网站| 人妻夜夜爽天天爽三区麻豆AV网站| 91 综合 色| 91骚妇| 欧美综合制服在线| 男人干美女| 偷看洗澡一二三区美女| 懂色AV蜜臀无码精品APP| 曰韩精品视频一区二区| 久久亚洲欧美中文字幕国语 | 黄aaaaaaaaaaaaaaaaaa色网站| 国产深夜福利| 伊人麻豆传媒| 无码不卡亚洲成?人片| 国产传媒日本欧美专区| 五月激情视频| 日亚韩精品视频二区三| 亚洲系列第一页| 久久国产乱子伦精品免费女人| 天天综合-91入口| 午夜精品久久久99热蜜桃的功能特点| 隔壁邻居波多野结衣中文字幕| 在线中文字幕视频| 翔田千里AV无码秘 三区| 国语av狠狠色丁香婷婷综合激情| 亚洲无码视频免费在线观看网址!| 天天色欧美| 91视频在线观看18| 亚洲成人黄色在线观看| 看大黄色大片原件| 97久久久| 波多野结衣AV无码一区| 日本熟女不卡视频| 久久久成人国产精品无码| 五月天婷婷综合网| 国精综合一二三区影视| 人妻在线大香蕉| 91久久国外网| 日本天天干天天操一区| 国产精品麻豆成人av| 在线观看国产黄色| 久久国产99精品72福利| 亚洲aw毛茸茸在线| 久久亚州大香蕉| 一区AV| 免费毛片在线播放| 欧美大香蕉在线观看| 9.1小视频| 乱伦一二三区| 九九热在线视频| 后入式视频国产自| 百度百度日本操逼| 久久99久久99精品免视看婷婷| 日本日日色视频| 国产午夜福利合集| 天天夜躁日日躁狠狠2002| 人干人人人操人人摸| 久久9久9久99久9久9| 亚洲和欧美裸体美女双飞视频| 黄片www视频免费| 在线无码视频| 国产伦精品免编号公布| 欧美综合色| 国产成年免费大片黄在线观看| 色噜噜人妻av 中文字幕| 亚洲美女黄色| 乱欲一区二区| 久久欧洲| gogogo免费高清看中国国语| 久操B网| 日韩一级二级三级| 91在线无码精品秘 软件| 亚洲综合情色| 18禁超污无遮挡无码免费网| 亚洲91大片| 伊人网免费视频| 日本精品人妻少妇一区二区| 超碰97丝袜| 中文字幕精品一区二区精品| 青青草好吊色| 国产欧美第五页| 97超碰日韩| 嗯嗯啊操我| 日韩操啪| 国产精品亚洲日韩骚欢乐谷最新地址发布页huanieguty性屋娱乐妖精视频 | 国产91影院| 精爱久久| 夜夜草我| 大香蕉啪啪啪啪在线| 欧美激情性爱视频网站| 乱久久久| 丁香五月久久| 亚洲 无码 偷拍| 国产精品 午夜福利| 成人av在线播放| 免费看国产大AB| www99热| 草草草草视频| 青青操97| 国产18精品亚洲精品| 中日韓欧美高清| 国产13区| 丁香五月婷婷色| 国产强奸乱伦xd| 熟女欧美日韩综合婷婷| 久久性爱大全| 中文字幕在线免费观看2| 福利天堂| 秋霞视频一区二区| 亚洲情色综合| 久久久九九| 91大胆欧美| 国产福利电影| 久草这里只有精品| 男人精品天堂一区| 欧美久久婷| 六月丁香婷| 国产AV超爽| 淫荡少妇免费| 日韩综合成人免费视频| 婷婷午夜清品久久久久久久性色视频观| 久久只有精品一区二区三区| 这里只有精品久久| 人人做人人妻人人夜视频| 大肥女高潮bbwbbwhd视频| 91精品国| 中文字幕免费看| 亚洲综合夜色| 久久久禁| 欧美18禁91| 中文字幕在线观看视频www| 国产欧美日韩一区二区三区| 在线视频 亚洲精品| 丝袜AV一区二区三区| 欧美成人贴图| 日逼97| 国产精品久久久久久久久久久久久久吹 | 91欧美经典| 大香蕉线| 成年无码动漫av片无尽在线| 夜夜躁狠狠躁日日躁av| 亚洲丝袜综合| 人人爱人人乐人人操| 青娱乐休闲视频在线观看| 日本一区二区不卡| 草草电影院| 久久久久久久九九九九九九| 天天干天天燥| 日本精品网站在线中文| 草草影院最新网址| 日本视频一区二区三区| 日韩一级片在线看| 久久精品亚洲成a人天堂| 97碰在线视频| 精精夜夜| 不卡一区视频| 青青草一区二区高清无码视频| 男人天堂2019| 不卡av在线中文字幕| 亚洲无码AV九九九| 亚洲精品丝袜-不卡成人免费……| 东北夫妻性偷拍| 黄网站黄视频网站进入口| 日韩色女精品| 清纯唯美亚洲综合| 强奸乱伦动态污图免费 | 久久久九九九九| 激情四射婷婷六月天| 超碰精品人妻狠狠干| 在线洲亚线| 97在线免费看视频| 无遮挡男女激烈动态图| 欧美,日韩,亚洲视频| 操人妻少妇中文 | AV不卡在线| 人妻AV 中文字幕的| 9久久9综合| 久久人体一区二区| 亚洲国产丝袜熟女av| 欧美一级做a爰片免费视频| 色五月首页| 素颜老阿姨乱情色| 亚洲人天堂| 亚洲av无码国产精品字幕| 99热在线播放| 中文在线视频| 青草草免费网站av| 99热免费| 9118禁| 天天日天天舔| 大香蕉之青青草原| 亚洲电影中字一区二区| 混色激情av| 天天狂操夜夜狂日| 五月丁香六月激情| 欧美丰满少妇交换91欧美精品| 飘花国产午夜精品不卡| 久久久久久91香蕉国产| 欧美视频在线第3页| 日韩本不卡视频在线观看| 欧美亚洲| 97精品97| 亚洲国产一区二区入口| 夜夜狠狠躁日日躁色视频| 久久国内| 婷婷激情五月综合| 97超碰伊人| 久热9| 欧洲精品二区| 一道本东京热加勒比一区二区三区| 国产一区二区在线播放| 色婷婷综合久久久久中文一区二区 | 中文在线视频| 无套内射性感少妇视频| 人妻激情视频| 日韩欧亚太美不卡| 嫩草一区二区在线观看| 欧美少妇高潮视频| 亚洲AO在线| 亚洲国产成人福利在线观看| 超碰在线综合97| 夜夜爽33333| 伊人精品久久网站| 欧美肥臀在线| 五月天伊人| 黄色一区二区秘书性感| 欧美操逼录像国产黄色国产| av优播| 国产av美女被艹的乱叫| 热热色综合网| 手机久操欧美综合色码| 人妻熟女一区二区三区视频| 99久久com免费视频′| 白嫩国模丰满一二三区| 久久久久久久九九九九九九| 骚日日av| 色色综合97| 大奶啊啊好爽| 日本日逼视频网| 免费精品人妻一区二区三| 性猛交| 亚洲高清色综合| 免费超碰97久久| 国产福利夜| 精品久久99| 大稥蕉免费视频这里只有精品| 91精品国产高清久久久久久,亚洲成人 | 免费视频无码| 亚洲欧洲精品视频发布| 天天色图| 福利视频网站| 97干97色| 色欲av国内精品久久久久久| 人人澡人人澡人人| 91精品久久久久久77777| 免费农村成人少妇人妻Aa一区二区视频 | 国产高清自拍视频| 超碰诱惑| 上床啊啊啊| 青草地一本线一区二区三区| 日本久久久精品电影| 2026国产精品视频| 欧美在线 亚洲| 伊人一区二区三区| 夜夜久久| 吊色| 日韩成人小视频| 亚洲性天堂| 日韩无码人妻| 欧美色女人| 黄色视频60分钟| 欧美麻豆成人同性GⅤ在线| 免费中文在线| 翘臀vidoes| 天天α片| 91国产丝袜美女| 天天做天天爱| 欧美极品性爱天天射| 五月天黄色激情视频| 99热97| 久久伊人青青草| 97久操| 秋霞Av理论一级在线| 黄片免费视频2019| 九九探花视频在线观看| 91neishe| 久久成人网站| 精品蜜乳AV免费观看| 五十路三级片| 欧美性爱一内片一区二区三区| 国产性爱欧美性爱在线| 综合网少妇| 中文日本免费高清| 五月婷婷丁香| 伊人一级免费黄片| 欧美精品日韩一区二区| 九色 人妻 大香蕉| 久九9精品| 麻豆国产97在线| 天天日天天舔天天喷天天射| 夜夜综合| 日本一级特级毛片视频| 国产超碰人人爽人人做| 亚洲精品天天影视综合网| 成年在线视频日本亚洲在线视频区精品江靖宇公司| 熟女熟妇一区二区三四区| 日韩熟女乱伦中出| 九九九久千久久激情蜜桃在线看| 淫淫综合网| 日韩黄色一区二区三区| 嗯嗯,好大,好爽,好骚 | 久久草视频污视频| 天天懆天天日| 性色乱AV一区二区| 久久久久久久久一区二区三区| 免费A V在线| 国偷自 一区二区| 久久精品中文字幕无码l| 亚洲人妻熟妇三十三区| 清纯唯美亚洲| 久久99国产综合精品女同| 97久久超碰日韩精品| 在线国产探花| 国产精品日日摸天天碰| 国产精品无码论坛| 久久精品操| 97久精品| 另类TS人妖一区二区三区|