亚洲有码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
返回資訊列表
懂色AV一区二区三区| 中文字幕在线免费观看视频| 丁香五月天啪啪| 久久9精品视频| 久久老熟女| 91粉嫩萝控精品福利网站_精品影音先锋国 | 色小视频蜜乳| 九一国产精品| 久久五月丁香| 欧美色图 人妻| 久久久久久无码人妻中文字幕| 大香蕉视频一二三区| 91色伦| 男女啪啪啪18禁网站| 超碰在线974| 亚欧视频在线| 亚洲精品乱码线路中文字幕| 天堂精品小草| 亚洲免费人妻在| 九九九国产| 大香蕉专区| 久久美国毛片| 99热色这里只有精品| 久久亚洲中文字幕视频| 久久日本熟女精品一区| 日韩性爱人人爱人人操| 另类图片五月天| 日本一线产区和二线产区伦理片| 九九精品热| 涩亚洲欧洲| www熟女乱伦com| 青青草玖玖爱| 九九九九九九九九九九九蜜桃| 欧美日韩性爱视屏免费看了| 在线v中文字幕一区二区三区| 欧美瑟综合| 五月天精品| 影视综合无码少妇| 日语五十路和六十路亚洲国产精品 | 91 偷| 无码heyzo高清一区| 91午夜无码| 91热热色| 狠狠爱AV| 天天舔天天日天天射| 99在线精品观看99| 国产精品3| 色香色欲天天综合网天天来吧| 青娱乐欧美激情一区二区| 午夜舔阴达高潮视频免费看| 日产精品久久久一区二区| 狠狠操狠狠燥| 快灬快灬 一下爽蜜桃在线观看| 亚洲欧美国产精品久久久久久久| 亚洲欧洲国产综合av| 天天色黄色影院天天操| 精品人妻中文字幕高清| 九九精品网| 亚洲青青草| 中文字幕超碰CAO| 粉嫩国产精品久久粉嫩| 啊…啊…操我用力操我| a在线观看| 日本一本道A级黄色毛片试看60分钟| 久婷婷一区| 大香蕉www.超碰| 国产美女高潮视频| 密臀在线视频| 极品欧美一区二区三区| 亚洲综合激情五月久久| 亚av顶级裸体一区二区三区四区五区 | 亚洲欧美清纯| 欧美综合自拍| 黑人在线91| 91久久婷婷| …亚洲黄色厕厕女女在线播…| 黑人干亚洲| 欧美日韩97在线| 成人三级片一区二区三区视频| 东京热av男人的天堂| 色狠狠综合噜一二三区| 久久五月份| 国产精品白丝| 久久婷婷五月天| 欧洲亚洲人人爽爽视频| 欧美黑人精品在线播放| 首页亚洲国产高跟丝袜诱惑视频| juliaann精品熟女一区| 免费a v| 男男H黄动漫啪啪无遮挡网站| 日韩中文字幕在线视频观看| 亚洲少妇色| 午夜精品一区二区三区三上悠亚| 亚洲骚女一区二区三区| 人妻色情天天操| 国产剧情在线| 日韩欧美经典在线观看| 精品久久久中文字幕不| 欧姜老司机| 加勒比av中文| 男啪女色黄无遮挡免费观看| 性色A∨91| 殴美,日韩国产伦精品| 国产高清午夜成人在线观看| 婷婷五月天无码| 26uuu国产免费观看| 色欲天香天天综合网-成年人三级片网站-欧美乱妇狂野-日韩国产专区-久久久久久 | 久久国产精品熟女人妻| A片大香蕉在线| 精品网站99999| 亚州操逼网| 欧美一二三| 亚洲综合影片| av优播| 精品亚洲黄色片 国产精品导航一区二区 | 99热综合| 亚洲综合在线91| 亚洲一卡2卡3卡4卡乱码网站 | 超碰成人最新最好看| 人妻熟女一区在| 深爱伊人影院| 人人摸.人人色| 男人天堂2017| 啊啊啊啊啊在线观看网址 | 国产精品久久久久久久毛片1| 久久久久密| 欧美96精品在线| 久久久性爱视频| 人妻 丝袜美腿 中文字幕| 无人区高清电影免费观看一区二区三 www.qmcai2.com | 色九九九综合| av情色影音| 天天淫人人妻日日色| 一本色道久久天天射天天干| 亚洲欧美另类小说| 欧美激情一| 经典丝袜一区| av东京热男人的天堂| 图色综合网| 色综合五月天| 久久久久久久久久久久久久久性生活视频 | 台湾佬中文娱乐自偷自拍| 中文字幕免费在线观看| av在线免费一区二区| 欧洲精品网| 欧美极品女人的天堂| 婷婷久久大香蕉| 日本 情色 1区2区3区| 好舒服视频| 97 国产一区| 色香91| 日韩在线观看中文字幕视频| 久久久99999久网站| 人妻少妇被猛烈进入中| 精品欧美А∨无码黑人大荫蒂| 黄片免费视频2019| 日韩欧美中文日韩欧美色| 亚州伊人色综台| 草草网站影院白丝内射| 淫淫总合网| www.yeyecao| 岛国视频免费在线观看| 久久精品综合| 欧美色图91| 国产亚洲精品美女久久久m| 嫩草美女久久| 99热精品在线观看| 欧美综合 站| 久久人| 国产Av超碰| 立川理惠无码一区二区| 天堂精品小草| 老司机香蕉| 秋霞网—男女啪啪亚洲免费体验区 | 亚洲日韩狠狠撸视频| 亚洲图片第一页| 强奸乱伦亚洲第一页| 性爱动态120秒| 日日夜夜草草草| 一级免费精品| 天天干天天狼在线视频| 日韩精品9区| 亚洲春色一区二区三区| 人妻少妇久久久| 久久草视频污视频| 中文字幕精品一区欧美| 色欲人妻一区二区在线| yaouchengrenav| 91视频国品一二三区| 国产精品69久久久久孕妇欧美| 欧美真人抽搐一进一出gif| 美女被艹尤物视频| 97久操| 亚洲欧洲日本精品中文a∨| 看日韩美女二区三区免费操逼视频| 久久久久9999精品九九九| 亚洲高清视频在线免费观看| 亚洲色欲天天人妻无码系列专区| 久久久男人的天堂| 人人看人人摸人人色| 国产性爱欧美性爱在线| www.99在线| 九一精品牛牛一区二区| 免费试看60秒| 这里有精品| 玖玖大干人妻| 曰韩欧美国产传媒麻豆第一区| 久久少妇人妻| 婷婷色色网| 欧美性夜| 国产精品久久久久久久久久久久久久久久| 九月激情婷婷| 久久久新亚洲AV| 伊人亚洲综合| 久久精品国产欧美日韩亚洲欧美日韩中文久久国产一区 | 青春草A| 欧美日韩性爱电影在线| 97视频900| 国产精品99久久久www| 亚洲欧洲激情卡通另类文学四射小说网站| 精品97精品97| 成人婷婷丁香| 另类一区| 91九色蝌蚪在线观看| 亚洲熟女av中文字幕| 欧美熟妇乱码在线一区| 俄罗斯一区二区视频在线观看| 超碰这里有精品| 人妻夜夜爽天天爽麻豆三区网站| 免费在线黄片视频| 国产女性无套 免费观看| 五月天久久人妻| 夜夜爽妓女| 色情五月综合婷婷| 久久鲁干| 中文字幕性感少妇av| 国产精品久久久久久久电影渣男| 欧美碰碰综合色| 日本中文字幕熟妇| 亚洲限制级| 亚州性9| 嗯嗯啊啊视频一区二区三区| 日韩在线一区二区| 69精品久久久久中文字幕| 免费男人的天堂| 欧美日韩人妻婷婷一区| 亚州中文字幕超碰97| 操逼网站视频漫画国产| 97视频免费播放| 青青操视频在线| 国产精品久久久久久久久久久久久久久久久久 | 男人天堂婷婷五月天校园春色| 国产精品久久久无码AV网站| 日本一区二区不卡精品| av凤凰久久久| 玖玖97综合| 天操天操夜操夜月操月年年操| 日日夜夜干| 草b在线| 日韩午夜国产| 超碰地址久久| 蜜乳AV一区| 五月婷婷色| 久久99视频| 国产白嫩精品久久| 日本一卡二区在线| 制度丝袜99| 久久国产性爱| 青青11操操操操操操操操| 色 亚洲 91| Julia Annxxxxx| 人妻三级在线中文字幕| 国产www色在线观看| 天天综合AV| 亚洲伊人青青草| 免费的黄片有限公司| 亚洲人妻色图| 看大黄色大片原件| 激情婷婷综合久久| 久久九九综合| 97视频播放| 欧美性五月| 日本操逼无码| 嫩草 人人网精品| 伊人97超碰| 亚洲不卡一| 亚洲精品亚洲人成人网| 嗯啊抽插大香蕉网页| 偷拍欧美激情| 亚洲最新Av| 内射中出日韩在线观看视频| 欧美东京热青青草| 亚洲少妇色| 老女人老91妇女老热女| 日韩乱伦影音先锋| 97在线播放| 九九香蕉网| 精品日日人妻| 色鬼在线综合| 久久精品国产亚洲AV嘿嘿| 性色国产东北露脸精品视频| 男女日B国产| 久久精品国产久精国产| www网站黄| 精品高清牛人盗摄一区二区三区中文字幕A片免费在线观看 | 美日韩一二三区| 日韩人妻播放| 玖玖久久久| 人妻碰碰碰碰碰碰| 欧美成人黄网色网站| 婷婷五月天色网| 天天狠| 日韩成人精品| 亚洲成成熟女人综合一区二区| 韩国一级AAA| 香蕉国产97| 91 在线亚洲| 欧洲欧美视频一区二区| www.久久超碰| 天天色怡春院| 日韩少妇丰满亚洲| 成年人性爱日韩| 9丨久久九九九| 试看60秒| 97公开久久| 99久久9| 国产成人亚洲精品无码古代早漏男| 男人的天堂日韩| 久久精品一区二区三区不卡| 中国人高清www色视频免费| 九九热免费在线国产视频伊人五月| 另类图片欧美激情综合| 激情内射| 伊人久久久日韩一区| 午夜福利成人免费视频| а√天堂资源官网在线资源| 色天天野狼综合社区| 美女人妻色网站| 国模不卡| 国产日逼视频| 中文字幕第9页萱萱影音先锋| 亚洲Av噜噜一区二区三区妖精| 精品人妻一区二区三区夜夜| 国产激情综合五月久久| 无码黑人精品一区二区三区三| 亚洲丝袜二区在线| 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | 日本色色色网站免费看不卡| 久久久久久少妇| 日本999精品视频| renqi久久久久久久久久久久| 国产精品干干干| 88xx成人精品视频| 国产精品九九九| 精品国产综合久久福利,热99这里有精品综合久久,99热这里只有免费国产精品,精 | 伊人操操| 久草精品一区| 伊人嫩草| 91网站18禁| 男人的天堂99| 水滴偷拍| 永久免费av无码网站国产app| 久艹99| 少妇专区一二三四五| 九九人妻| 成人羞羞视频国产| 日本性爰一道本| 精品一二三区久久AAA片| 日本中文字幕熟妇| 丁香婷婷五月| 九九九九97| 久久精品人妻一区二区三区| 97色伦欧美| 日本人妻最新在线中| 亚洲欧美另类激情小说| 国产粉嫩蜜臀av一区二区三区 | 欧美精品三级黄片| 91chinese在线| 麻豆三极片| jizzjizz欧美| 91色艳| 屌妞视频久久久久久久久久久久| 日本三级韩国三级美三级91| 久久精品区| 国产乱伦亚洲色图高清无码| 欧美国产伊人久久久久| 亚洲中文字幕乱码无码一区二区| 爱妻综合网| 日韩成人无码| 人人色97| 亚洲女人91| av网页一区二区三区| 怡红院视频在线| 热久久无毒不卡| 成人午夜高潮av猛片| 人人扣人人操| 国产精品午夜福利| 99久久精品无码一区二区| 台湾佬激情综合| 精品国产乱码久久久久久蜜臀| 免费伦费视频在线观看| 欧美传媒一区| 亚洲乱伦图片视频| 色吧5亚洲| 欧美色图91| 亚洲91av| 人人玩人人添人人澡免费| 国产精品美女久久久久久网站| 91殴美大片| 超碰97人妻在线| 操操碰| 久久久免费高清中文视频| 国产亚洲精品美女久久久| 综合国产97| 日韩啊V| 亚洲影院小综合| Sekablack无码一区| 亚洲熟女国产综合另类| 亚洲激情在线观看一区| 日韩电影天堂视频一区二区| av天堂天堂av日韩| 日韩成人人妻网站| 夜夜一区二区| 久久中文字幕一区不卡| 国产和美国毛片| 不卡啪啪视频| 国产一国产一级毛片古装| 蜜臀AV一区二区三区激情综合| 亚洲 国产 精品一区| 91操熟女视频| 国产天美欧美| 人人摸人人添人人操 | 岛国成人av在线播放网址| 97久久久久久久久久| 一起草av| 国产隔壁老王影院在线| 青青草久草AV| 超碰在线综合97| 无码一区免费在线不卡| 伊人久久亚洲色欲综合网站 | 2024人人操人人摸| 白丝av| Aa东京男人的天堂| av操操不卡| 久久女婷| 免费一级视频特黄色大片| 另类天堂| 国色综合天| 91老熟女老女人国产老太| 大香蕉乱伦视频网| 日韩精品黄片免费观看| 日韩成人精品| 美女操逼A A| av影片在线观看不卡| 日本不卡中文| 精品熟妇视频一区二区| 亚洲在钱| 欧美丝袜亚洲| 9久久久久久| 久久久一二三四区| 国产天天噜一噜久久久| 春色综合免费| 久久久性爱| 欧美综合综合| 欧美日韩资源| 国产高清自拍视频| 超碰在线人妻中文字幕| 国内毛片无遮挡国产| 飘花国产午夜精品不卡| 天天欲望网| 天天日天天干天天操| 青娱乐日韩无码| 久久av无码| a'v在线资源| 青娱乐淫乱1314| 91精品国产91久久福利| 八戒无码国产午夜福利| 美中日韩无码| 亚洲青青青视频在线| 尤物av网站| 欧洲自拍色图gif在线| 亚洲精品97中文字幕| 国内一区二区三区| 国产乱子伦一区二区三区在线观看| 日韩一卡二卡三卡| 9色国产精品一区粉嫩| 18禁免费视频| 亚洲黄色网址视频| 91麻豆天美国产欧美| 欧美五区| 射综合网| 久久男女激情视频网站| 久久的网站啊啊啊啊啊| 亚洲第一男人天堂| 久久久精品中文字幕爱豆| 国产黄色 A 片免费看| 99热这里只有精品9| 久久亚洲熟妇在线视频| 清纯唯美激情| 不卡免费av在线播放| 亚洲一二三四区机械| 99re在线视频这里只有精品| 欧美高清无码免费视频高清版| 国岛片视频| 国产亚洲色婷婷99精品91| 中文三一区| 日本一区二区成人在线| 91欧美成人色站| 亚洲色图欧美| 吻戏激情性巴克| 99热这里只有精品1| 无码WWW免费视频网站| 澳门成人网站久国产日韩| 欧美日韩狠狠爱| 日本日皮视频逼| 少妇精品久久久八区九区| 婷婷色播婷婷| 9999久久久| 午夜福利合集| 欧美强奸一区二区诱惑| 超碰在线97国产| 国产成久久综合片| 91亚州欧美| 曰韩中文人妻视频| 老鸭窝亚洲毛片| 伊人久久AV诱惑悠悠| 欧美v亚洲v日韩v最新在线二区| 色综合久久夜色精品国产天堂| 久久性爱精品一区| 综合 青草 伊久久 影院 综合| 日日操夜夜操天天操免费观看麻豆| 免费A V在线播放| 中文字幕av一区二区三区人妻少妇| 久久综合国产精品国产| 91超碰碰在线| 成人av免费观看| 人妻久久一区二区三区| 99超碰色| 333kkkk·亚洲com久久| 91 综合网| 亚洲天堂另类小说男人| 国产不卡免费在线视频| 久操免费观看| 久久色一区二区| 九九热在线精品视频| 伊人国产成人av网站| 18岁禁 茉莉成人久久| 久久一级无码精品毛片6| 亚洲午夜精品久久久中文影院| 欧美夜夜狠| 国产日逼视频| 亚洲精品97| 日日日日做夜夜夜夜做无码97| 91狠狠综合久久久久久| 一线黄色免费性爱片| 97亚洲色图| 欧美91网站| 亚洲天堂东京热| 亚洲欧美国产其他二区| 欧美夜夜草视频| 南澳成人一级片在线播放| 大香蕉在线视频重口味毛片在线| 亚洲精品亚洲人成人网| A V视频日本| 欧美亚洲国产91在线| 91综合天天| 一中国女人毛片水真多| 日本不卡免费二区| 亚洲欧美日韩国产丝袜自拍中文| 亚洲AV乱码专区国产噜噜亚洲| 人人摸人人摸人人干| 色色网91| 涩涩这里只有精品视频| 91露脸熟女专区| 九九九免费视频| 熟女一区二区三区四区| 动漫av中文| 熟女一区二区三区| 裸体美女久久久| 荡小穴在线观看| 啊啊啊操一区| 亚洲色图加勒比| 秋霞男人网| 97超级欧美| 欧美国产一区二区三区麻豆传媒 | 免费成人在线熟妇网| 天天摸夜夜操视频| 美女91网址| 插入粉嫩少妇视频| julia ann久久| 黑人粗大V S日韩女优视频| 亚洲污污网站| 99热免费| 色爱亚洲| 日本曲间由美性生活片| 大香蕉中文网| 嗯啊不要在线| 国产精品不卡高清在线观看| 校园春色 亚洲| 起碰97| 国产欧美日韩女同性恋ww喷水精品| 香蕉大久久久| 日本三级中国三级99人妇网站| 久9爱精品| 婷婷激情五月| 性暴力欧美猛交在线直播| 免費人妻夜夜爽天天爽爽一区| AVE乱伦| 久久久噜噜噜久久人妻| 99热伊人| 啊啊啊97视频| 久久久久久久久久久人妻| 欧美日韩小说| 久久只有精品| AV在线资源| 99精品成人免费看| 91黑人狂躁丰满熟妇| 男人天堂综合| 婷婷中文字幕| 国产亚洲精品美女久久久| 欧美啪啪天堂| 欧美页片| 激情第四色| 色就色综合| 麻豆熟妇乱妇熟色A片在线看| 九九九九九九九九九九九免费国产| 亚洲国产尤物yw在线观看| 欧美日韩亚洲少妇寂寞影院正在播放| 伊人97色天使| 性爱av在线免费观看| A级在线视频| 香蕉大久久久| 国产AV天美| 91人妻爽爽人人做人人澡| 久久美女国产| 国产精品内射婷婷一级二| 欧美淫乱视频| 午夜福利在线视频1000| 99re9在线| 精品区国产区一区二区三区| 国产无马在线| 人妻少妇精品| 亚洲不卡一| 啊啊啊不要好爽日韩无码一区| www.色五月| 肉嘟嘟www视频在线观看高清| 中文久久| 丰满人妻一区二区三区四区| 成人欧美日超碰| 日韩av三四区| 伊人影院中文字幕| 超碰99在线观看| 成人福利视频网| 女同女同恋久久级三级| 精品国产Av无码久久久伦古装| 亚洲天堂久久| 国产91丝袜在线播放蜜月| www.高清无码诱惑一区.com | 偷拍 欧美 日韩| www国产精品| 伊人欧美大香蕉视频| 日本顶级天天操狠狠操夜夜操中文字幕| 亚洲另类久操网| 天天射,天天操,天天爽-国内精品一区二区三区-成人AV | 老熟女区| 欧美黄色大片在线观看 | 2019天天干天天操| 欧美性爱第一区| 自拍偷拍国产欧美日韩韩| 久久久九九九| 在线视频 亚洲精品| 91精片| 600国产精品视频| 亚洲黄色电影| 伊人九九九| 97免费在线观看视频| 欧美 亚洲 第一页| 97精品网| 日韩av无码网站| 日韩免费在线观看不卡| 欧美日韩啪啪电影| 看免费的黄片| 欧美综合娱乐久久| 性在久久久久久| 中国一区二区亚洲人妻| 欧美性爱视频免费一区一A| 国产区性爱在线视频秋霞豆| 欧美黄片欧美黄片xxx| 久久精品老司| 亚洲男人的天堂网| 精品中文一区二区| 啊啊啊轻点在线观看| 久久97视频| 97视频免费播放| 1769一区| 手机在线播放国产福利| 美中日韩无码| 91狠狠色丁香婷婷综合久久| 97超碰碰碰| 久操 高清| 天天热精品| 蜜臀久久久99久久久久 | 国产捆绑一区| 免费观看国产不卡av| 色噜噜人妻丝袜a∨先锋影| 天天色播| 第45页一区二区| av 模特一区了| suv精产一二三区| 国产精品第一区第一页| 欧美日本国产日韩激情视频| 色婷婷影院| 亚洲五区熟女| 极品少妇久久久久| 亚洲最新Av| 午夜理论片在线观看免费| 激情综合色| 欧美日韩精品国产91| 亚洲自拍青操视频| 天天影视色香欲综合网小说| 色呦呦呦在线观看视频| 婷婷久草一区二区三区| 60秒免费小视频| 伦理第一页| 亚洲三区视频| 精品国产乱码久久久久A| 国产九区| 欧美日韩中文视频播放| 午夜精品五区| 青青草吊丝| 夫妻日逼| 国产一级内射无挡观看| 欧美78p| 久久久天美| 操操逼视频| 好淫网一二三视区| 人妻天堂网| 色五月综合| 久久久三区二区一区| 黄色AAAAA欧美| 国产欧美黑人丰满在线| 日本伦乱九九九综合| 26uuu欧美日韩| 欧美成va视频网站| 一区超碰一区| 白丝AV网站| 超碰综合色| 欧美丰满少妇xx高潮| 久久久国产av美女私房| 精品176精品2| 国产 日韩 欧美高清| 美腿丝袜高跟网免费视频免费视频| 91色人妻| 韩国久久97| 欧美一区二区传媒| 天美av在线观看| 天天干夜夜操一区二区| 色操逼网| 顶级少妇BT天堂| 91亚洲图片| 久草视频分类在线| 狠狠操狠狠燥| 国产精品探花视频| 97超碰久久色| 国产精品女生av| 天天综和| 激情黄色片在线观看| 亚洲欧美大香蕉| 午夜亚洲| 国产福利精品最新在线| 狠狠操狠狠燥| 日韩不卡a级视频专区| 久久人妇| 国产欧美岛国精品一区| 很很很很操| 欧美色视频在线| 欧美91精彩| 日日摸夜夜夜夜爽| 国产精品老熟女一区二区| 国产精品久久久777| 综合色99| 国产A v无码专区| 久久久久少妇| 白丝一区| 91网站18+| 色999人与兽| 欧美日韩另类激情图片| 欧美高潮| 亚洲色鬼| 久久亚洲色图中文字幕| 国产精品一二三区18| 在线洲亚线| 强奸乱亚洲| 久久久涩| 91ise欧美| 一级AV性爱| 亚洲第91页 | 久久噜| 玖玖爱免费观看视频| 国产欧美日产一区二区三区 - 国产欧美日| 大色综合网| 亚洲人妻色图| 素人美腿视频网站| 久久受www免费人成| 熟女高潮合集-永久久久-成人AV | 26uuu性| 亚洲国产福利视频| 日日夜夜天天| www.亚洲黄色| 97国产综合欧美| 99re视频在线观看这里只有精品| 啊啊啊啊啊啊在线观看| 久久內射| 激情专区综合| 欧美性爽xyxOOOO| 综合九九| 久久久一热在线播放| 色综合天天| 夜夜欧美 | 超碰亚洲97| 国产91啪| 婷婷色香伊人| 欧美猛交黑寡妇中文字幕| 欧美刺激色黄片免费看| 黄色无码高清黄色无码网站| 伊人亚洲综合| 天天操女人| www.av在线观看| 日本孕妇一区二区视频操逼免费看| 啊啊啊啊啊,啊啊啊啊好舒服,操我舒服啊啊啊| 天美麻花大全视频| 欧美一区二区日韩三区| 97人人夜| 天天综合网AV91| 91蜜臀在线久久久久| 黄色网址在线免费观看| 亚洲不卡三级手机播放| 精品制服美女中文一区二区三区| 日本天天人人狠狠在线日美女 | 蜜色网色哟哟| 色色色色综合网| 国产日韩欧美中文在线播放 | 色偷偷超碰亚洲| 操人妻少妇中文 | 日B操| 外国91| 欧美精品亚洲精品日韩传电影| 玖玖爱综合| 久久一二三四五六七八九区区区| 天天操天天干一区二区 | 18精品一二区| 欧美日韩天堂| 91性生活久久久| 欧美|91色综合| 高清国产av无码| 超碰精品国产无码| 久久久久久久久久久久97| 天美传媒AV国产在线| 日本午夜久久电影| 久96热在线观看视频| 999色欧美中文字幕| 青青草玖玖爱| 蜜桃久久久久久久久久久久| 夜夜爽妓女| 天天欧美色| 99国产人成精品| 97久久久| www.激情| 静品嫩模一区二区| 久久精品国产72国产精品福利| 久久久久久久久久久免费精品| 91美女在线观看| 久久东京热久久| 東南亚性呦成人伦理资源在线视频 | 尤物一级在线免费观看| 综合五月婷婷亚洲一区| 国产精品亚洲无码| 收看日本人日bb| 亚洲AV成人精品网站在AV| 99久久99久久免费精品蜜臀| 91热| 精品人妻一区二区三区视频在线| 情色五月天就去干| 97超碰国产亚洲精品| 色婷婷一区二区三区久久午夜成人不| 少妇精品久久久| 亚州男人的天堂| 成人久久久精品| 亚洲啪啪啪啪视香蕉| 色偷偷超碰亚洲| 加勒比性爱成人在线| 久久久久久久综合,国产| 国产精品毛片| 亚洲色图8| 俞拍久久国应视频| 中文久久久| 九九九久久久| 精品国产无码中文| 日本熟女中文字幕一区| 人人操人人uiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii | 无码一区二区精品视频久久久春药| 国产无吗在线播放| 国产一区二区三区免费视频在性观看| 久久伊人亚洲AV无码网站| 女人被男人桶爽视频网站| 加勒比在线视频一区二区三区| 人妻日日干| 亚洲色五月| 热天堂一区二区| 91挑色欧美| 精品妇女一区二区三区| 久久激情网| 97亚洲精品| 欧洲特黄毛片免费看欧洲毛片| 欧美色91| 欧洲人妻视频| 亚洲色图图片| 日本1区2区不卡视频| 精品国产无码中文| 亚州欧美在线| 青青草日逼视频| 性性久久| 殴美色网| 蜜乳视频网站| 久干9操| 色色热| 国厂麻豆77q4| 欧美综合1性辶| 9国产超碰| 亚洲九月丁香| 青青操97| 亚洲在钱| 欧洲在线性爱视频| 成人免费在线网站| 91国产精品熟女| 精品国产久久乱码| 91精品人妻| 国产网红精品| 天天综合网~69| 欧美亚洲se91| 偷拍 亚洲 欧美| AV污污污污| 亚洲天堂女优在线 | 欧美强奸一区二区诱惑| 精品夜夜澡人妻无码| 欧美亚洲厕所精品偷拍91| 青青五月天| 尤物黄色在线观看网站| 吻戏激情性巴克| 夜夜免费视频| 日韩免费高清大片在线| 色吧五月| 啊啊啊啊好疼视频| 成人免费视瓶| 色婷婷综合久久久久中文国产精品一区中文字幕,国产福利电影一区二区三区 | 韩国一级AAA| 亚洲婷婷五月天| 操老熟女AV| 久久无码一区二区二三区性色| 欧美日韩999| 99日免费视频中文字幕| 一级性爱视频免费观看 | 91狠| 加勒比色99999| 亚洲国产成人福利在线观看| 99国内精品| 91N综合网| 精品国产乱码久久久久久口爆网站| 天操天操夜操夜月操月年年操 | 日韩丝袜高跟制服在线观看| 欧美懂色综合网| 中文字幕jul-617人妻熟女| 情色五月天网| 精品无码一区二区三区| 小少妇| 亚洲黄色电影| 日本午夜久久电影| 天天干1区2区在线| 日韩操逼HD| 伊人青青草久久| 美国日韩黄片| 国产精品久久久视频| 97se亚洲综合自| 狠狠爱综合| 男人的天堂kva| 五月丁香社区婷婷日韩欧美精品影院 | 少妇高潮对白在线观看| 97一区二区三区视频| 国产av激情无码久久天堂| 亚洲aw毛茸茸在线| 欧美极品美女aaaaaa级黄片| 99国内精品| 超碰色综合| 欧美男女午夜啪啪| 国产精品久久久久久久久久久久| 六月婷婷综合| 亚洲美女精品九九视频| 99热综合| 69麻豆天美| 97网址www| 操国产逼| 色大师网站www永久网站视频| 美女操逼A A| 日韩欧美偷拍美女视频| 综合免费无码中文| 天天操狠狠日夜夜干超大胆开放com大香蕉视频在线观看 | 欧美人妻少妇| 99久久这里只有精品| 国产在线视频午夜精华在| 啊啊啊啊啊啊啊国| 国产精品直播在线观看直播| 桃色六月天| 岛国色情视频在线观看| 97久久天天综合色天天综合色电影| 亚洲成人美女无吗| 成人区人妻精品一| 夜夜嗨一区二区| 中文操逼字幕| 中文字幕超碰CAO| 精品国产www久久| 九九九不卡| 97亚洲性爱| 无码 黑人一区二区三区| 超碰人人操97碰| 婷婷综合五月天| av亚欧| 2000亚洲男人天堂| 国产无码一二三区| 亚洲不雅视频1区二区| 亚洲国产一区二区三区在线| 国产一区二区三区免费视频在性观看 | 狠狠操综合| 91人妻少妇| 使劲用力艹少妇视频一区二区| 人妻aa| 91人人| 九九九九九精品十六| 国产精品老师| 色综合一本| 欧美日韩中国x| 99超碰色| 免费A V在线播放| 人妻铁牛TV| 天天激色| 精品少妇后入一区二区三区四区人妻巨乳| 日韩免费av片高清无码| 亚洲熟女少妇免费视频| 色香阁在线| 在线v中文字幕一区二区三区| 欧美黄业| 探花视频免费观看国产专区| 少妇久久久久久| 久久久久成人蜜桃精品| 激情小说亚洲色图| 亚洲高清自拍| av天堂电影网| 色官网在线| 色网站导航大全| 天天天操天天天爱| 欧美熟妇人体| 婷婷五月成人| 精品一区二区综合熟妇| 亚洲色图欧美色图另类图片| 亚洲资源网| 四虎影视在线| www色色色com| 东北丰满熟女国产一区 | 青青草视频久久久久| 99ri在线视频| 精品高清一区二区三区三州| 91亚洲电影| 蜜桃午夜视频一区二区| 成人热久久精品| 另类图片五月| 午夜男人一级A片7777| 三级色综合| 黄色免费一级在线毛片| 友优传媒精品在线一区二区| 欧洲性人爱视频| 性生活无遮挡纯毛片在线看| 91人妻人人妻| 婷婷六月天| 欧美综合区| 老司机射| 手机在线A片| 国产一区二区三区免费视频在性观看| 欧美激情精品| 日韩久射综合| 精品少妇高潮久久| 一区二三区四区视频大全套| 伊人国产视频| 久久夜夜夜夜| 人人操天天爽| 英伦大奶子熟妇吊带| 精品国产乱码久久久久久久久1 | 亚洲一区二区三区AV无码| 99久国产精品午夜性色福利| 日本在线观看网址| 精品视频在线观看| 国产精品久久久 | 女人天堂av在线播放| 一起草视频在线| 欧美偷拍| 麻豆91熟妇人妻中文字幕茄子| 国产蜜臀精品一区二区尤物| 国产精品夜夜夜| 日本一二三免费久久| 欧美淫乱视频| 久久久久九九九九九| 久久久久久免费电影| 高清孕妇孕交 交孕妇| 夜夜爽夜夜摸夜夜操免费视频| 夜夜夜夜爽| 久久超碰天天| 国产精品久久久午夜夜伦鲁鲁| 欧美肥臀在线| 精品日日人妻| 97日韩| 色欲久久久久综合网| 欧州一区二区三区四区| AA级电影三区| 操操操日本的逼| 视频分类 国内精品| 色999五月色| 久久婷婷色综合一区二区三区| 任我爽视频在线观看| 玖玖爱综合| 亚洲日韩东京热一区| 激情久久日韩精品中文字幕麻豆| 亚洲日韩97| 熟妇色99| 在线人成亚洲视频免费观看| 成人无码电影在线观看网| 操操逼操操逼操操逼逼| 国产精品免费日韩| 狼人综合婷婷激情四射 | 强奸乱伦AV一天堂网| 国产丝袜欧美在线视频| 午夜福利无毒不卡| 把腿张开老子CAO烂你| 亚洲av无码成人精品国产| 九色97| 日韩精品99久久久久久中文字幕 | 97色涩| 人妖欧美一区二区| 97免费视频在线观看| 中国一级操逼视频| 日本 欧美 国产一区| 台欧久久精品视频| 天综合网欧美| 伊色久人大在线| 另类小说综合网| 狠狠综合网| 精品久久久久黄少妇| 亚洲 综合 第一页| 老熟女网站| 欧美经典一区二区三区 | 男人的天堂一区三区| av优播| 99精品丰满人妻无码|