99精品久久精品一区二区-亚洲熟妇无码?v在线播放-日本国产精品无码字幕在线观看-久久久亚洲永夜AV-亚洲一级无码一区二区一-免费国产成高清人在线视频-中文字幕乱码免费观看-国产毛片精品妇女久久久

ARTICLE DETAIL

資訊詳情

深耕商務建站與企業(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ā)給主機。需求一提出來很多人第一反應是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 波形自然也就沒法啟動一次完整傳輸。我們要做的是在應用層解決“從機有數(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)里處理不要在中斷服務函數(shù)里直接跑阻塞式 HAL_SPI_Receive否則主機整個中斷會被拉得很長其他實時任務可能被餓死。/* 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)從機端要做的事就是應用層準備好了數(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é)預裝載到 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 來保證從機應用層能知道當前是否被選中這樣在調(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 時鐘太快導致 TXE 中斷沒來得及填充下一字節(jié)從而出現(xiàn)丟數(shù)據(jù)。3. 方式二主機輪詢命令應答省一根請求線3.1 兩階段讀命令協(xié)議設(shè)計方式二適合不想多拉線的場景主機只要定時發(fā)命令從機在命令的驅(qū)動下返回數(shù)據(jù)。很多人寫到這里會忽略一個問題SPI 是全雙工通信主機發(fā)命令字節(jié)的同時從機的 MISO 線上其實也在輸出數(shù)據(jù)。從機在收到命令之后才準備數(shù)據(jù)那就晚了因為這個字節(jié)已經(jīng)隨著時鐘移出去了。所以需要把一次“讀取操作”拆成兩個階段。第一階段主機發(fā)送一字節(jié)命令從機接收命令的同時MISO 上送出的是上一次預留的應答字節(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ù)時能及時通過命令應答帶出去”。3.4 延遲與總線效率分析方式二最怕的是主機輪詢周期和數(shù)據(jù)到達時機不對齊。比如傳感器每 10ms 更新一次主機若 5ms 輪詢一次那讀取到的數(shù)據(jù)平均會有 2.5ms 左右的陳舊延遲。主機若在數(shù)據(jù)更新前讀拿到的就是上一周期的舊值如果業(yè)務要求拿到“最新值”可以給協(xié)議加一個狀態(tài)字段從機在應答數(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ū)就會導致 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]; /* 應用層數(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é)預裝載 */ 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è)置不一致或者主頻不同就可能導致采樣點偏移。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é)錯誤。前面反復強調(diào)過從機要先啟動 DMA 再拉高 REQ。但還有一個細節(jié)是 DMA 配置里 Data Width 要和 SPI 數(shù)據(jù)寬度一致。STM32 的 SPI 通常配置 8 位數(shù)據(jù)DMA 的 Peripheral Data Size 和 Memory Data Size 都應該是 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è)會強制停止當前傳輸導致 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 線實時性高從機一拉線主機馬上響應中取決于輪詢周期高請求后 DMA 批量讀取從機數(shù)據(jù)量小到中幾十字節(jié)合適小以單字節(jié)或短數(shù)據(jù)為主大幾百字節(jié)到幾 KB 最合適CPU 占用主機接收時消耗 CPU主機持續(xù)輪詢占用高主機和從機 CPU 占用都很低總線效率高一次傳輸全是有用數(shù)據(jù)低需要命令啞字節(jié)兩階段高批量數(shù)據(jù)一次傳完實現(xiàn)復雜度簡單簡單但協(xié)議要設(shè)計好較復雜需要處理 DMA 和乒乓典型場景按鍵、告警、小包數(shù)據(jù)傳感器周期上報、狀態(tài)查詢音頻、波形、高速數(shù)據(jù)采集5.2 實際項目選型經(jīng)驗如果從機只是偶發(fā)地報一下狀態(tài)比如按鍵按下、溫度越限、設(shè)備故障我一般選方式一。請求線加中斷代碼量小實時性高主機不需要一直跑輪詢功耗也低。如果是周期性的傳感器數(shù)據(jù)比如溫度、濕度、轉(zhuǎn)速這些數(shù)據(jù)本身量不大而且業(yè)務上允許幾百微秒到幾毫秒的延遲方式二最合適。它省了請求線主機按固定周期讀一次從機端只需要維護一個很簡單的狀態(tài)機。缺點就是主機輪詢必須一直跑不能停太久如果主機本身還在做其他實時任務要考慮輪詢周期是否影響整體調(diào)度。如果是做雙機間的高速數(shù)據(jù)交換比如從機采集 ADC 波形、音頻數(shù)據(jù)或者 IMU 九軸數(shù)據(jù)用方式三。請求線負責通知DMA 負責搬運乒乓緩沖負責把采集和發(fā)送流水線化。這種方式開發(fā)周期長一點但一旦調(diào)通效果非常穩(wěn)定主機側(cè)的 CPU 幾乎不用管數(shù)據(jù)搬運留給應用層做算法和顯示。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 線一直是低電平說明從機應用層可能沒走到發(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)拉低了。比如主機響應得很快CS 拉低、SCK 開始、DMA/中斷發(fā)送完成后從機立刻拉低 REQ。如果這個拉低發(fā)生在主機 EXTI 上升沿還沒被正確鎖存之前某些單片機可能會丟中斷。解決辦法是 REQ 拉低的時機不要放在從機發(fā)送完成回調(diào)里而是放到主機讀取完成后由主機主動拉低或者從機發(fā)送完成后再等一小段時間再拉低。實際項目里我習慣用從機發(fā)送完成回調(diào)拉低 REQ只要主機 EXTI 是上升沿觸發(fā)且中斷正常基本都能鎖住但如果性能測試發(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導致上一次 DMA 還沒完成就被新的 DMA 請求覆蓋HAL 庫內(nèi)部狀態(tài)錯亂。解決辦法是加一個 g_dma_busy 標志DMA 接收完成回調(diào)里清除下次請求到來時如果 busy 還在就直接忽略或者排隊處理。第二個是從機 DMA 發(fā)送緩沖區(qū)在發(fā)送過程中被應用層覆蓋了。我在做乒乓緩沖時遇到過從機正在 DMA 發(fā)送 buffer A采集任務卻把新數(shù)據(jù)寫到 buffer A導致發(fā)送數(shù)據(jù)被新數(shù)據(jù)污染。加乒乓緩沖后這個問題就消失了核心原則是DMA 正在用的緩沖區(qū)應用層絕對不能寫。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è)務上確實需要更高的實時性可以把 SPI 中斷優(yōu)先級設(shè)為 4但代價是不能在中斷回調(diào)里調(diào)用任何 FreeRTOS API只能通過信號量或標志位通知任務不能直接在回調(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 線只作為應用層判斷。這樣 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
返回資訊列表
亚洲a色| 日日噜狠狠色综合久| 五月天激情网图片| 五月丁香久久网| 日本在线免费中文com.| 99热主页日本| 超碰在线综合| 婷婷碰碰| 婷婷五月丁香五月| 日本欧美在线| 亚洲无码yw| 婷婷六月综合在线| 天天干,天天舔| CHINESE熟女老女人HD视频| 国产无套精品一区二区| 夜夜爽日日躁| 色婷五月婷婷| 人妻精品在线| 五月丁香六月婷婷久久肏| 这里有精品| 欧美美美女性色视频| 婷婷六月丁香开心深深爱| 综合五月丁香97| 国产AV国片偷人妻麻豆| 久久五月天婷婷| 久久精品这里只有精品免费首页| 国产三级秋霞| 骚。com| 五月天天堂久久| 九九九九操逼| 91久久久久久久久久18| 婷婷精品| 国自产拍偷拍精品啪啪一区二区| 九九热视频这里只有精品| 99视频激情四射| 天天干天天操| 99re思思热久久| 26UUU亚洲欧美| 欧美久久婷婷| 婷婷成人网五月天| 人人爱干人人爱草| 欧洲亚洲免费视频区| 久久激情五月天| 色色影院黄大片| 韩国中文字幕91| 五月天综合| 久久精品五月天| 色99在线视频| www.minyis.com【JT】实力收量可预付QQ2101460746 | 999热在线视频| 激情婷婷人妻| www婷婷亚洲| 99色干| 日本天堂网站99| 曰韩五月丁香色婷婷无码| 99久久国产宗和精品1上映| www.99在线| 日日夜夜天天| 亚洲最大视频| 99国产精品白浆在线观看免费| 深爱激情六月天| 婷婷五月天黄色| 天天插综合网| 婷婷五月激情五月激情| 五月婷婷在线视频| 任你艹| 九九99在线免费在线观看视频| 五月久久婷婷丁香| 99啪啪| 久久草大香蕉| www.99操.com| 免费亚洲婷婷中文字幕| 五月激情网五月综合网| 激情色情五月天| 日本在线噜噜| 天天综合色| A在线观看| 婷婷五月天综合久久| 99九九玖玖| 另类激情五月| 青青久在线视频免费观看| 亚洲经典三级| 99久久.www| 全高清无码视頻| 婷婷丁香九月| 激情亚洲五月| 天天操夜夜操| 亚洲无码色| 大战熟女丰满人妻AV| www色色com| 欧美精品XXXXBBBB| 日韩大片艹艹| 久久五月天大美女| 五月婷婷69| 色噜噜97视频在线观看| 亚洲综合五月天婷婷丁香| 亚洲深喉aV| 99九九99九九九视频精品| 日本久久9| 国产精品操| 99色色热热| 青草视频在线蜜臀| 丁香五月91| 亚洲超碰在线| 国产九九一区二区三区| 99热这里只有精品8| http:色情日本com| 久久五月网| 五月天婷亚洲综合在线嫩草网| 五月丁香好婷婷A片网| 久久婷婷成人综合色怡春院| 色偷偷综合| 最近中文字幕2019视频1| 99操不停| 激情网狠狠干| 亚洲精品无码久久| 久久五月天精品视频| 香焦网五月天| 欧美综合五月丁香五月天| 另类激情中文| 亚洲综合色成丁香五月色| 日逼影音先锋AV男人资源站| 色色婷五月天| 一起草性爱不卡视频| 久久综合婷婷激情| 色热久资源| 婷婷丁香五月高清| av免费在线看不卡无毒| 婷婷五月天av网| 五月婷网站| 综合激情伊人影视在线| 五月丁香综合中文| 九月色婷婷综合亚洲| 欧美99热| 97干视频在线| 九九婷| www99久久| 九九这里精品| 国产毛多水多女人A片| 亚洲无aV在线中文字幕 | ztEJj| 丁香婷婷五月激情| 久久在线人妻| 国产精品久久久久9999小说| 亚洲精品va| 婷婷五月天激情免费在线观看| 日日杆天天| 天天综合五月| 99视频久久| 色 五月俺去也| 九九色热| 色情五月丁香| 91一起操| 色v综合网| 色五月在线观看| 免费黄色片子| 亚洲乱码在线观看| 伊人久久大香线蕉av一区| 色婷婷很很丝袜| 免费视频舔| 五月天久久综合| 精品自拍97| 99热这里只有精品国产免费| 久久激情视频| 日日爽日日操| 天天日天天久久青青| 99久久亚洲精品视频| 丁香五月天啪啪| 激情五月婷婷老师| 亚洲另类久久| 色色色五月| 九九热这里只有精品31| 色黄啪啪| 成人在线日韩欧美| 五月婷在线观看| 2016日日夜夜操| 婷婷五月六月丁香综合| 五六月婷婷久久| 欧洲综合色| 国精产品一区一区三区免费视频| 婷婷中文字幕版| 五月天激情网图片| 婷婷五月婷婷五月天| 99激情| 五月丁了香蕉综合| 欧美成人猛片AAAAAAA| 99在线观看这里都是精品| 天天激情站| 久久久久久欧美精品se一二三四| 五月天激情四射| 丁香五月天激情网址| 色墦五月丁香| 色97综合婷婷天天色| 福利视频在线播放| 69婷婷丁香午夜| 国产成人精品亚洲线观看| 精品综合久久久久久五月天| a级毛片一区二区免费视频| 丁香婷婷成人在线播放| 超碰成人AV| 色婷久| 丁香婷婷91在线观看视频| 五月婷激情影院| 五月丁香激情四射综合| 国产欧美日韩综合精品一区二区| 橾逼网| 亚洲啪| 丁香婷婷影院| 九九色精品| 天天做天天爱| 五月婷导航| 亚洲色基地| 激情四射婷婷| 五月激情偷拍婷婷| 色五月天激情| 丁香五月天欧美| 国产99久9在线+|+传媒| 婷色五月| 天天色综合网吨吧| 婷婷五月丁香综合| 婷婷丁香精品视频在线观看| 精品色色| 79成人网| 五月婷婷激情| 婷婷五月天久草在线| 开心婷婷五月天激情网| 91啪啪视频| 欧美成人精品A片免费一区99| 亚洲色综合性| 日本99色| 日本黄色三级片内射| 激情五月天在线视频| 九九热大香蕉| 婷婷九月久久| 五月香婷婷| 色五月在线视频观看| 91色操| 国产做爰视频免费播放| 97色97干| 中文字幕乱轮| 26uuu四色| 热婷婷久| 国产成人精品一区二三区熟女在线| 另类五月激情| 天天爽—爽| 丁香六月激情国产| BBWCUCKOLD精品熟妇| 婷婷色五天| caopeng超碰| 在线成人av播放| www.久久99| 天天色图| 五月丁香六月婷婷综合| 在线成人va| 久久婷婷五月丁香网| 日日肏夜夜干| 五月天 综合 在线| 99re热视频这里只有综合亚洲| 久草婷妨| 婷婷丁香五月天综合激情| 99ri在线观看视频| 五月丁香亭亭| 五月激情婷婷在线| 婷婷五月骚厕所| 综合婷婷六月| 丁香色五月直播| 99人人操| 日日噜噜久久婷婷五月天| 色色丁香婷婷综合| 丁香五月天欧洲在线| 婷婷丁香五月基地| 91干视频| 激情宗合哪里能看| 激情综合婷婷| 夜夜夜夜撸夜夜操| 九九精品综合| 操操啪| 120分钟婬片免费看| 一起草无码| 久久丁香综合| AV九九| 色婷婷99| 婷婷丁香九色| 另类激情码| 五月婷婷啪啪啪| 另类亚洲2| 亚洲无码成人网| 青青草a在线| 婷婷激情鹿城五月天| 天天成人综合| 丁香桃色网| 色爱99| 五月天成人小说| 色五月 五月婷婷| 五月丁香成人网| AV在线不卡播放| 九九精品碰| 伊人久久大香蕉网| 色香五月天| 涩涩涩五月天| 9久久精品| 亚洲V国产V欧美V久久久久久| 久久婷婷九月国产精品| 亚洲免费99| 思思视频久久| 亚洲激情婷婷| 国外亚洲成AV人片在线观看| 久久久久久久久久久44| 色色色在线免费视频| 99热777| 六月婷婷色色色| 超碰在线中文字幕| 久久99热网| 性爱网六月丁香| 色~性~乱~伦~噜| 亚洲精品操一操、噜一噜、摸一摸、爽 | 色五月天丁香| 久草婷妨| 九九爱这里只有精品| 亚州性爱99| 五月天丁香成人| 日本三级日本三级99| 成人视频网| 日本3级片一区2区| 激情五月天色婷婷| 久久女婷| 色色五月天丁香| 五月激情久久综合| 五月叮香啪| 去色色五月天| 婷婷六月激情丁香| 五月婷婷综合网| 一级七香蕉| 五月天第四色开心色播| 五月天国产| 天天日天天色| 天天搞夜夜爽夜夜爽| 五月婷婷香| 双性美人被调教到喷水A片| 精品自拍99| 夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂夂亚洲亚洲亚洲亚洲亚洲亚洲亚洲亚洲色 | 六月综合婷婷开心伊人| 国产婷婷色综合AV蜜臀AV | 91人人澡人人爽人人看| www.色婷婷。com| 婷婷五月天亚洲综合网| 99热最新网址| 五月丁花色综合网| 五月天婷婷av| 热99久久这里只有精品| 天天色中文字幕女优AV| www.日本91| 久久色在线视频| 激情播丁香| 精品九九在线观看视频| 婷婷五月色播| 色青青视频| 九色亚洲| 天天操婷婷| 欧美顶级少妇做爰HD| 玖玖九九9999在线观看视频精品| 婷婷丁香六月| 婷婷噜噜| 久草热8精品视频在线观看| 丁香五月激情综合婷综| 美女100%露全身无挡网站| 亚洲av无码影院| 婷婷综合网| 岛国av电影网站| 日本高清久| 麻豆AV一区二区三区| 色爱99| 婷婷五月综合婷婷| 激情综合色图| 久久国产AV| 夜夜操夜夜爽| 国产成人+综合亚洲+天堂| 久久久国产精品黄毛片 | 五月亭亭直播| 欧美色一级色| 、激情六月天| 丁香五月天BBw| 综合色情网| 亞洲自怕| 99热精这里只有精品| 热99精品视频五月| 欧美婷婷丁香五月| 99热的无码| 97色色婷婷| www.henhenl| 美女100%露全身无挡网站| 欧美色色色色色色色| 五月天啪啪网| 婷婷五月丁香基| 婷婷久久五月天| 99资源在线| 亚洲婷婷六月天| 天天狠狠夜夜狠狠2023| 99九九99九九九视频精彩| 丁香六月色婷婷| 亚洲乱码日产精品BD| 99在线观看| 五月天天综合| 97干综合网| 婷婷综合五月天亚洲综合| 久9视频| 国产99热| A在线观看| 亚洲激情五月| 色五月亚洲| 亚洲区1| 婷婷激情五月综合丁香社| 久久激情网| 天天综合色| av在线激情| 五月天成人综合| 久色精品| 丁香婷婷色五月合集| 嫩草AV久久伊人妇女超级A | 色五月婷婷av| 久久色天堂| 99视频在线观看网址| 操逼亚洲天堂| 婷婷五月激情在线视频| 激情婷| 综合一本道| 9久热视频| 久机视频这只有精品| 97超喷视频在线观看| 色5月婷婷| 亚洲AV成人无码精品| 五月丁香六月停停| 婷婷五月天性爱视频| 啄木鸟丝袜美女福利视频| 久热精彩视频98| 婷婷情色激情| 99碰视频| 久久色五月| 午夜成人av在线| 无码se| se99视频| 婷婷天天舔| 激情www| 99热色无码| 热久久这里只有精品| 开心深爱五月天| 色婷婷丁香五月| 丁香六月天色婷婷| 久久9RE热视频精品98| 99精品在线观看视频| 9久9久| 丁香五月婷婷基地| 激情婷婷亚洲五月| 91丨人妻丨国产丨丝袜| 丁香五月电影| 色视五月天婷婷| www.婷婷com| 五月丁香综合激情网| 色噜噜狠狠色综合成人网| 色婷婷影院| 操操操av| www.AV在线| 97人妻碰碰中文无码久热丝袜| 五月丁香怕啪啪| 日韩精品一区二区三区,四区,五区视频| 国产阿姨日皮艹逼内射视频| 激情碰碰碰| 色色五月天婷婷| 色情五月综合婷婷| 97热这里只有精品| 華人性愛AV在線| 欧美69久成人做爰视频| 天天插天天干| 无码G高清天| 任我肏视频精品| 色婷婷狠| 五月婷婷色情| 激情综合网址| 日本在线观看aaa 99| 五月久久婷婷| 综合伊人狠狠| 99九九综合久久九九| 中文字幕日产A片在线看| 色色色.COM| 国产亚洲99久久精品| 久99婷婷色综合| 天堂综合久| 66久久视频在线| 丁香五月婷婷图片综合| 色色色婷婷五月天| 五月天停停成人网| 99re这里只有精品国产99| 婷婷五月另类网站| 色九月婷婷| 九九视频在线观看| 99秘 在线| 另类激情五月| 免费成片在线观看| 婷婷丁香无码专区| 大香蕉手机视频| 九九热视频在线观看| 婷婷五月 丁香六月| 色婷成人狠干| 日本二级毛片二级毛片| 五月丁香成人网| 情情五月天色| .操區COm| 91操人视频| 亚洲天堂九九九| 亚洲五月天婷婷| 99热这里全是精品| 激情五月丁香激情综合网| 91啪啪视频| 欧美啪啪五月天| j五月香在线| 天天综合网站| 人人草公开操| 色综合久久88色综合天天看| 日韩激情网站| 色九月综合| 337p大胆噜噜噜噜噜91Av| 五月久久婷婷天堂视频| 五月婷综合| 色婷五月天亚洲| 亚洲AV免费在线| 综合激情肏逼网| 北条麻妃伊人 | 亚洲色五月天是什么| 无码九九九九| AV在线二十六页| 欧美性生交XXXXX无码小说| 色偷偷五月天| 激情综合网激情五月天| 99在线观看精品视频| 婷婷99中文字幕| 丁香婷婷综合激情五月色| 亚洲色情一区二区三区四区| 婷婷五月丁香在线观看| 色综合婷婷| 五月天婷婷网站888| 丁香五月天堂亚洲社区| 欧美久久久中文字幕| 色情终和网| 国产无遮挡又黄又爽免费网站| 色婷婷五月综合| 五月丁香综合网| 丁香婷婷五月综合色情| 久久99操| 激情99| 激情综合网激情五月天| se99视频| 激情五月天网| 在线中文AV| 99精品丁香五月| 九月丁香很很色| 91嫩草国产线观看亚洲一区二区| 久久涩视频| 99热99日天天干| 玖玖色综合色| 超碰在线94| 丁香五月综合无码趴趴| 五月天婷婷免费| 欧美人人操| 人妻久久久久久久久妻久久久久久久久| 色色色色欧洲| 五月综合在线婷婷图片| 丁香五月激情图片| 九九视屏| 天天综合色| 国产成人精品一区二三区熟女在线| 无码免费人妻A片AAA毛片西瓜| 香蕉97碰碰碰欧美| 超碰色人妾| 综合久久五月天| 久操大香蕉| 中文字幕按摩做爰| 亚洲AV电影av| 丁香五月手机在线| 五月婷六月综合在线观看| 五月婷婷和六月| 五月久久丁香| 美欧日韩国产成人在战| 色综合久久888| 日本www免费九九| 婷婷亚洲久久| 丁香色六月婷婷| 欧美日本一区二区三区| 色婷婷五月天在线观看| 亚洲五月天婷婷| 日本人人超碰| AV操逼网| Va另类视频| 久婷五月| 国产乱人偷精品人妻A片| 草了bav视频在线观看| 久久99免费视频| 丁香五月婷婷啪啪| 丁香六月无码播放| 一级性爱视频| 色五月色开心开心五月| 操日本三片99| 激情婷婷综合| 97婷婷丁香| 国产肥白大熟妇BBBB视频| 潮汕成人AV片在线| 日韩欧美一级大黄网站| 五月天基地| 日韩成人av在线| www婷婷色| 操B五月天| 狠狠干总合| 亚洲综合另类| 精品久久99| 亚洲成人AV在线| 亚州激情网| 婷婷六月天亚州| 久操大香蕉| 超级碰 久久9| 九九九九中文字幕| 色五月丁香五月激情五月激情| 深爱激情婷| 丁香婷婷久久| 综合激情五月丁香| 九月婷婷激情久久| 99热国产国产| 黄色五月婷婷| 99性视频| 久久久久久激情| 色五月丁香六月欧美综合| www狠狠| 成人五月天丁香婷| 婷婷五月天激情诱惑| 久久综合五月天| 婷婷久久免费| 狠狠五月激情婷婷直播片| 日日夜夜婷婷| 美女黄频aⅴ视频| 婷婷干五月综合在线播放| 精品一二三区久久AAA片| 超碰com| 丁香六月高清视频| 五月丁香影院| 成人噜噜网| 少妇搡BBBB搡BBB搡毛茸茸 | 99久久婷婷国产综合亚洲| 天天草天天爱| 丁香五月自拍| 五月天激情综合网俺也去| 婷婷五月天国产在线播放| 久9久视频精品| 日本va欧美va精品发布视频| 色播播五月天| WWW,激情五月天,COM| 五月丁香六月激情综合| 丁乡久久| 丁香月六月| 67194中文在线| 六月色五月天天婷婷| 99无码| 天天拍夜夜撸| 拍真实国产伦偷精品| 婷婷丁香五月天婷婷| 综合色99| 激情网站五月| 五月天激情国产综合婷婷婷| 婷婷亚洲五| 色色色色综合网| 婷婷五月天AV网| 综合色色色| 五月丁香六月色婷| 色三级色三级| www.久久久.com| 色欲婷婷五月天| 欧美综合五月丁香六月婷| 96精品久久久久久久久| 另类图片色五月| 性欧美日本| 色婷婷五月影视| 久久99视频| 大香蕉久久伊人婷婷五月丁香| 影音先锋四区| 成人五月天婷婷| 婷婷色综合| 五月www| 国产偷人爽久久久久久老妇APP| 天天爽,天天操。| 影音先锋91在线资源站| 丁香五月第九色| 丁香五月婷婷社区| 青青草激情网| www.婷婷五月天.com| 六月天婷婷| 五月天三级| 亚洲传媒在线观看| 伊人五月天| 婷婷五月丁香啪啪| 天天插天天插| 深夜A片| 久操干| 色五月亚洲| 中文网AV| 潘金莲AAAAAAAAAA| 在线观看亚洲AV| 久久天天天| 丁香婷婷天堂| 天天干天天拍| 五月丁香综合网色欲| 日韩成人精品中文字幕电影| 久久婷婷综合五月天| 91操片| 色伦专区97中文字幕| 婷婷丁香五月天小说| 99久久.www| 五月丁香婷婷欧美| 亭亭五月天成人| 另类伊人婷婷| 天天射影院| 亚洲亚洲永久无码777777| 国产成人av在线播放| 国产美女无遮挡裸体毛片A片| 色色色免费视频| 丁香五月婷婷偷拍| 一点色成人网| 丁香久月| 日日干天天射| 成人中文网| 97人人做| 天天色官网| 人人综合91网| 国产精品美女久久久久AV超清| 99精品福利视频| 激情久久综合网| 91色久| 色天五月天在线观看视频| 五月丁香综合激情在线观看| 五月花激情网| 久久AAAA片一区二区| 超碰国产AV| 五月丁香av在线| 婷婷欧美激情综合| Www.sesese丁香| 久久婷婷六月综合| 欧美丁香婷婷五月| 俺也去在线久久精品23欧美综合视频网站,丰满人妻一区二区三区在线视频53,丰满 | 91亚洲视频| www.久久综合| 色人妻五月| 人人爱干人人爱草| 97热在线精品| 丁香激情综合| 婷婷五月天久久久| 久超超碰| 色播五月丁香婷婷| 丁香六月婷婷开心| www.99免费视频| 久九男女天堂| 黄色五月婷婷| 狠狠干天天日| 99热这里只有的精品视| 婷婷五月天视| 91操人视频| 停停五月色宗合| 99热最新国内| 婷婷丁香五月亚洲| 激情五月天综合网| 色五月天婷婷| 久热网站| 影音先锋人妻出差| 乱抡小BB| 丁香婷婷六月激情| 黄网在线免费观看| 欧美天堂久久| 五月婷婷色啪| 色欧美日| 婷婷丁香黄色| 极品嫩草| 西西4r午夜剧场| 成人国产欧美大片一区| 综合色99| 丁香五月激情网| 日韩视频99| 五月大香蕉| 爱操人妻| 亚洲AV人人操| 4399在线日本A片| 99无码视频| 天天操天天操天天操天天操天天操天天操天天操天天操天天操 | 综合色播| 色五月综合激情| 精品九九网| 丝雨一区二区| 99爱在线| WwW色婷婷| 婷婷五月深爱五月| 日日操天天| 玖玖福利视频资源| 五月丁香婷婷激激激综合网色播| 色婷婷在线视频综合| 国产精品蜜臀99| 亚洲VA在线| 伊人五月成人| 五月婷婷色五月| 人人操av| 久综合色| 久久综合人妻| 91九色首页| 五月丁香啪啪网| 亚洲色热| 这里只有精彩视频| 久久精品A片777777| 日韩AV在线影片| 超碰婷婷色| 伊人成综合五月婷婷| 亚洲99一级无嗎特制在线| 9 1 A v久久久| 亚洲AV日韩在线观看| 日韩无码亚欧无码| 日本女人久久| 久热精品视频在线观| 五月婷婷播| 亚洲人妻一区二区| 五月婷婷六月丁香在线| 丁香激情网| 91日本在线观看| 五月天婷婷色播综合在线| 色色色色色日韩午夜激情| 欧美色偷拍| 精品思思久久| 五月丁香伊人网| 久久婷婷综合五月趴| 婷婷丁香九月| 丁香五月综合| AV网在线观看| 久久婷婷五月综合伊人| 久久在这里有精品| 婷婷爱五月天人人爱| 久久99热在线观看| 天天做夜夜爽| 色域五月丁香| 大香蕉懂9| 99精品自拍视频| 五月社区婷婷激情| 99热色精品| 久久久18| 奇米四色五月天| 色色五月天激情| 五月天久久www| 日本天堂免费99| 五月婷婷综合网| 超碰97色| 欧日韩AV| 激情综合五| 天天插天天射| 成人网丁香五月| 丁香五月色播中文在线播放| 色婷婷五月天综合网| 97干欧美| 丁香五月激情综合久久| 色丁香五月婷婷| 激情综合色五月丁香六月亚洲| 亚洲六月色婷婷| 变态 另类 在线 | 91丨九色熟女丨首页| 色色丁香五月天| 亚洲中文乱字字幕线在永久| 欧美在线操| 丁香五月亚洲综合丝袜| 综合色播| 五月婷婷片| 亚洲另类在线观看| 艹色18p| 久鲁鲁色网 | 9九九久久精品无码专区| 婷婷综合日本| 我爱婷婷五月天综合88| 久久久久9| 精品视频网| 久色视频首页| 五月丁香免费视频| 日本久久极品| 久久这里只有精品无码| 人妻操逼视频| 七七色色综合| 婷婷五点亚洲| 强辱丰满人妻HD中文字幕| 婷婷综合在线播放| 激情五月丁香激情综合网 | 婷婷色五月激情| 99视频精品在线| 国产成人+综合亚洲+天堂| 亚洲性爱电影| 激情五月天婷婷丁香 | 九九色婷| W色综合| 亚洲国产精品VA在线看黑人| www狠狠| 99爱视频免费| 日本色五月| 午夜丁香婷婷| 天天天天天天操| 五月丁香免费看| 五月天丁香成人| 伊人久久大香线蕉av一区| 五月丁香综合网| 五月婷婷中文字幕AV| 婷婷性色| 色五月五月婷婷| 天天色天天日| 99热只有| 亚洲Va成人| 亚洲99综合| 9精品视频在线观看| 五月久久婷婷成人网| 97男人天堂| 欧美草久久五月天91| 婷婷99综合| WWW色综合| 丁香六月啪| 日韩在线99| 超碰资源在线| 亚洲韩国日产综合AV| 五月丁香在线国产 | 国产超碰在线| 另类小说五月天| 涩五月婷婷| 亚洲精品永久久久久久| 激情五月天之六月婷婷| 超碰在线91| 五月婷婷五月天天| 五月天艹天天| 欧美日韩国产成人在线| 欧美伊人9| 精品亚洲国产成AV人片传媒| 大香蕉久久伊人网| 怡春院久操| 成人在线观看一区| 九九久久高清| 婷婷五月天综合网| 亚洲激情丁香五月基地| 免费人人操| 九月丁香婷婷综合激情| 丁香六月婷婷| 久久成人天| www.minyis.com【JT】实力收量可预付QQ2101460746 | 亚洲综合视频一下| 婷婷视频在线| 亚洲成人在线五月天| 久久全色| w婷婷五月婷婷w| 91一起操| 国产毛片欧美毛片久久久| 天天操天天谢| 丁香五夜激情四射夜夜夜| 日本色五月婷婷| 五月婷精品| 9色视频在线| 99热精品在线播放观看| 日本eVa一区=区视频| 婷婷丁香激情综合色情| 久久婷婷五月综合啪| 久久99综合| 婷婷5月天激情综合| 婷婷丁香成人色综合| 狠狠操狠狠操| 激情综合网五月婷婷| 国产免费一区二区三区三州老师F1F1.CC| AV在线免费播放| xxxx五月激情| 九九热在线视频观看| 色婷婷五月天天天天天天天天天| 国产黄大片在线观看画质优化| 婷婷的五月天另类视频| 丰满少妇乱A片无码| 婷婷久久综合久色| 丁香六月色婷婷| 午夜69成人做爰视频| 色色色色色色网| 久久婷婷亚洲| 丁香五月开心七月| a久久| 婷婷五月综合色中文字幕| 西西4r午夜剧场| 亚洲综合色色| 亚洲激情色色| 99碰网站| 色婷婷网大全在线| 亚洲婷婷91丁香| 2015好吊操| 亚洲天堂青草| 婷婷久久综合| 久久99成人性爱高清视频| 狼人婷婷久久| 黄色中文字目| 久久作爱| 婷婷五月天com| 超碰操网| 狠狠狠狠狠狠草| 色色五月婷婷| 99综合网| 日撸夜撸日操| 九九人人看| 超碰国产在线播放| 99色色网| 免费观看大片视频 丁香婷婷 六月欧美| 五月丁六月香av| 99精品久久久久| 久久久久久婷| 99久热| 天天干 夜夜爽| 99精品色| 人妻VideOssS人妻高清| 天天爱天天做综合| 日本三级日本三级三级人妇四虎| 一级性爱大片| 国外亚洲成AV人片在线观看| 五月天婷婷在线AN| 亚洲激情五月天| 日韩av网址大全| 日本色噜| 五月天婷婷免费| 97人人看一| 久久99最新地址| 五月婷婷丁香| 97人人操人人干| 六月婷婷五月丁香| 天天谢天天操| 五月婷婷综合潮喷| 五月丁香六月色婷婷| 丁香丁婷五月激情| 九九精品99| 九九热在线99| 天堂网色色| 99热午夜精品| 激情性爱五月天网页| 亚洲欧美在线观看| 激情五月丁香婷婷| 五月天精品视频| 欧美激情综合色综合啪啪五月| 26uuu欧美日本| 婷婷五月天人妻| 深爱五月天天| 久久机只有这里精品| 婷婷五月天成人娱乐| 青草网在线观看| 操操人人| 午夜丁香婷婷| 超碰在线视屏| 婷色五月| 亚洲综合视频天天精品| 99re热视频这里只有综合亚洲| 婷婷丁香熟妇综合网| 亚州操操| 在线不卡视频| 丁香五月天社区| 亚洲激情网| 欧洲色| 天天拍天天操| 亚洲亚洲人成综合网络| 无码AV免费精品一区二区三区| 少妇性BBB搡BBB爽爽爽电影| 亚洲第一成人无码A片| 欧美成人精品三区综合A片| 国产精品VIDEOSSEX久久发布| 亚洲黄色影视| 在线观看免费观看在线9久| 无码AV久久久久久久久| 婷婷丁香综合网| 伦乱人妻| 亚洲综合欧美色丁香婷婷888月图片| 国产亚洲成AV人片在线| 色97啪啪| 久久久久久9| 97超碰欧美中文字幕| 亚洲久久日| 任你草| 日本女va| 日日夜夜天天爽| 伊人在线婷婷草| 久久一热| ww久久| 亚洲色在线观看| 成人综合网站| 亚洲综合五月天婷婷| 成人VAV视频在线观看| 色婷久九| 色色色五月婷婷| 色婷婷丁香五月丁香| 26uuu亚洲欧美另类| 五月六月丁香激情| 日韩啪啪视频| 五月丁香综合啪啪| 三年高清大片免费观看国语| 亚洲激情六月丁香| 久久婷婷色| va中文资源在线观看| 婷婷干五月综合在线播放| 色婷婷电影网| 色丁香五月婷婷| AV亚洲在线| 琪琪狠狠干| 91久久九久久九久久九久久九久久| 婷婷五月天丁香| 色五月丁香一区在线| 思思精品视频| 99精品在线观看| 五月天综合在线网| 七七九色| 台湾综合丁香五月蜜桃| 天天久综合| 26uuu成人网| 九七色色六月丁香| 久久婷狠狠色| 五月天婷婷午夜丁香| 另类五月激情| 天天综合网在线| 色婷婷激情Av久久久| 五月丁香福利| 天天爽天天日人人爱 | 99re热视频这里只精品| 91在线观看www| 激情五月天婷婷免费观看| 婷婷五月天BBw| 九月色婷婷| 丁香狠狠色婷婷久久无码视频| 91综合网| 九九免费精品在线视频| 99热这里只有精品9| 丁香五月在线播放| 亚州激情九月| 男人综合网| 超碰人人干| 韩国中文字幕91| 中文资源在线a | 少妇性按摩无码中文A片| 五月婷婷色色爱| 另类小说五月天| 婷婷五月情| 五月婷婷影院| 天天色丁香| 丁香色综合| 狠狠干综合| 久久久婷婷五月亚洲97号色| 亭亭五月天黑人2014| 久久婷婷伊人| www.99热这里精品| 五月婷婷少妇之| 97精品综合| 人人插9| 另类国产综合| 五月丁香综合| 97碰碰在线看视频免费| A A色色| 99欧美| 久久9精品| 亚洲视频图片婷婷五月| 成人无码髙潮喷水A片| 婷婷九色| 色一情一乱一乱91Av| 色高清无码视频| 五月丁香大香蕉| enecarbon-materials.comWu染请涟系Bao护@wip1688 | 在线成人视频免费| 婷婷激情四射| 伊人久久婷婷| 色五月欧美| 色婷婷yy久| 26UUU精品一区二区c〇m| 99色热| 天天搡日日搡aaaaⅩ| 丁香五月激情五月| 丁香六月婷婷久久亚洲天堂| 五月天小说激情| 99无码| 久久久久久久五月婷婷六月丁香综合,开心激情综合网 | 99视频精品视频| 六月丁香五月天| 丁香五月激情棕合| 99精品在线观看视频| 激情五月婷婷色色| 噜噜色com| 成人婷婷色综合| 五月花婷婷最新| 五月激情啪啪| 九九热黄色| 日韩啪啪视频| 字母不卡码人逼| 九九久热| 婷婷五月天首页激情| 第二色AⅤ| 久青草影院| 99热精品在线播放观看| 大地9中文在线观看免费高清| 99免费热视频在线| 日本精品九九九| 日日夜夜天天| HD久久精品视频| 夜夜干夜夜操| 4399伦理午夜| 丁香五月第四色88| 久久综合五月情| 亚洲亚洲永久无码777777| 五月婷婷六月激情| 五月天婷婷网站| 五月天色色无码| 操逼福利视频| 黄色片avv| 深爱婷婷丁香五月激情| 日操夜操天天操不卡| 色色网五月激情| 9 1在线视频| 五月天色裸体视频| 久热爱大香蕉在线蜜臀悦色 | 五月婷婷综合潮喷| 国洲夜色亚热在线久久| 五月天久久网站| 六月丁香停| 综合色播| 在线观看996精品| 国产激情综合五月久久| 台湾综合丁香五月蜜桃| 狠狠干综合| 亚洲欧洲自拍图片专区五月天| 老师高潮流白浆喷水的A片| 婷婷五月中文在线| 激情内射人妻1区2区3区| 巴基斯坦粉嫩无码视频| 久久丁香婷| 成年人丁香五月| 九九色婷婷| 国产真实乱了老女人视频| 开心五月婷婷在线视频免费观看| 97干在线免费| 美女网黄| 五月丁香婷婷无码中文| 日本二级毛片二级毛片| 99免费在线| 偷拍91九色| 日本一级一级一级一级| 丁香五月天激情网| 亚卅毛片| 激情五月丁香五月| 热99这里只有精品视频| 亚洲天堂无码| 伊人干综合| 五月天成人网婷婷| 综合网狠狠| 亚洲九区| 婷婷射图五月天| 亚洲天99| 丰满少妇猛烈A片免费看观看| 五月六月激情| 91热爆在线| 婷婷狠狠综合网入口| 婷婷五月天电影网| WWW.激情| 性爱五月婷婷| 色色丁香| 久久久久久五月天| 91干| 欧美97超碰| 超碰97免费在线| 激情五月丁香在线观看直播| 啪啪黄页网| 婷婷综合视频| 激情久久久久久久久| 九九热在线视频,|