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

ARTICLE DETAIL

資訊詳情

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

RT-Thread SPI驅動框架解析:從分層原理到調試實戰(zhàn)

RT-Thread SPI驅動框架解析:從分層原理到調試實戰(zhàn) RT-Thread系列學習筆記寫到第五篇這次踩進了SPI驅動框架。剛開始接觸這套框架時我一度被里面各種結構體和回調函數(shù)繞暈總覺得一個簡單的SPI讀寫為什么要包這么多層。直到在某次項目里需要同時掛載Flash、SD卡和一塊LCD屏才發(fā)現(xiàn)這套框架幫你省掉的不僅是重復造輪子還有大量排查片選沖突、時鐘極性錯誤、DMA緩沖對齊這類頭疼問題的時間。這篇文章不打算貼大段源碼——RT-Thread的源碼注釋已經(jīng)寫得夠清楚了我主要想拆解SPI框架這些層級到底為了什么而存在以及你在實際調驅動、寫應用時該在哪個位置下手哪些是常年踩坑的雷區(qū)。1. SPI驅動整體框架拆解為什么RT-Thread要把SPI分這么多層1.1 從一段最樸素的應用代碼說起先看一個常見的使用場景往一塊SPI NOR Flash里寫入一頁數(shù)據(jù)?;赗T-Thread的SPI設備驅動接口典型代碼如下#include rtthread.h #include rtdevice.h #include spi_flash.h static struct rt_spi_device *flash_dev; static int spi_flash_init(void) { struct rt_spi_device *spi_dev (struct rt_spi_device *)rt_malloc(sizeof(struct rt_spi_device)); rt_hw_spi_device_attach(spi1, spi10, GPIOA, GPIO_PIN_4); flash_dev (struct rt_spi_device *)rt_device_find(spi10); if (!flash_dev) { return -RT_ERROR; } return RT_EOK; } INIT_APP_EXPORT(spi_flash_init);從應用視角看你在“spi1”這個總線上注冊了一個名為“spi10”的設備之后通過rt_device_find(spi10)找到它對它執(zhí)行rt_device_read、rt_device_write、rt_device_control就完成了一次SPI通信。但如果你真的只把rt_device_write當SPI收發(fā)用很快會撞上邏輯分析儀顯示出的詭異波形——為什么有的數(shù)據(jù)命令不對為什么CS片選信號在一條消息里被反復拉低拉高這些都是沒理解框架分層導致的。1.2 RT-Thread SPI框架的三層分工RT-Thread的SPI驅動模型本質是一套“總線驅動 核心調度 會話管理”的抽象架構。它可以按下面三個層次來理解第一層物理SPI控制器驅動BSP層。這類驅動直接面向芯片上的SPI外設寄存器負責處理CR1、CR2、DR、SR這些外設寄存器配置引腳、時鐘極性、分頻系數(shù)。RT-Thread里最典型的實現(xiàn)就是drv_spi.c這種BSP文件它最終要做的事情是填充一個struct rt_spi_ops結構體把這個結構體注冊到總線上。第二層SPI核心層。這是整個框架的“調度中心”代碼路徑在components/drivers/spi/spi_core.c。它不直接操作任何芯片寄存器只處理設備注冊、總線申請、片選管理、消息鏈表遍歷等邏輯。你需要重點理解的就兩個接口rt_spi_transfer_message和rt_spi_take_bus。第三層SPI設備會話層。這一層處理“針對某個具體設備發(fā)一次完整事務”的邏輯典型代表是spi_msd.cSD卡、spi_flash.cNOR Flash、spi_wifi.cESP8266等模塊。它們把協(xié)議解析、命令拼裝、等待響應這些邏輯封裝成可復用的設備驅動。這三層對應到整套框架處理流程上就是下面這種關系應用層調用 rt_device_write(spi_dev, 0, buf, len) - 核心層 rt_spi_transfer_message(...) - 構造 rt_spi_message 鏈表 - 申請總線所有權 - 拉低片選 - 調 ops-transfer 執(zhí)行物理收發(fā) - 釋放片選/釋放總線這套分層模型中你平時直接接觸最多的是第一層和第三層。第一層是移植時需要你動手改的第三層是你拿到一款新外設時通常要自己寫的但二者之間的核心層才是保證SPI不出亂子的關鍵。1.3 這套分層替應用層解決了什么難題有人會問單片機裸機時直接往寄存器里扔數(shù)據(jù)也一樣能用為什么要引入這么多層我給你列一個實際會踩到的場景板子上有一片SPI Flash和一張SPI接口的SD卡兩者掛在同一條SPI總線的不同片選引腳上。裸機開發(fā)時你需要在應用層自己維護“當前總線屬于誰”這個狀態(tài)。讀Flash時要把片選切到Flash讀完切回來再操作SD卡前又得確保上一次會話徹底結束。如果應用層的兩個線程同時操作Flash和SD卡第一個線程讀Flash讀到一半第二個線程把片選切到了SD卡——波形直接亂掉數(shù)據(jù)全錯。RT-Thread核心層引入了一個“虛擬所有權”概念rt_spi_take_bus會先獲得總線所有權其他設備的消息只能排隊等待拿到總線所有權后rt_spi_take_cs只會拉低目標設備的片選。這樣的設計天然保證了總線上同時只存在一個“說話者”?;谶@個機制你在應用層根本不用關心總線沖突上層代碼只需要用標準的rt_device_write把請求丟出去剩下的會話調度由核心層處理。2. 關鍵數(shù)據(jù)結構與接口解析這些結構體背后鎖定了什么資源2.1 struct spi_device一個外設在框架中的存在形態(tài)這個結構體定義在rtdef.h中的struct rt_spi_device但更關鍵的是它內部的配置指針struct rt_spi_device { struct rt_device parent; struct rt_spi_bus *bus; struct rt_spi_configuration *config; void *user_data; };這里最值得關注的是bus和config兩個成員。bus指向這個設備掛在哪條總線上這意味著一個SPI設備的“身份”由它所屬的總線決定而不是由硬件片選引腳決定。這樣的設計讓“總線分離”變得非常簡單——同一條SPI總線上可以掛多個設備它們共用同一套物理外設只是各自維護自己的配置參數(shù)。config則指向一個rt_spi_configuration里面保存了該設備的參數(shù)模式、位寬、最大頻率、保留字節(jié)。這個指針在設備注冊時會被綁定。它解決問題的方式很巧妙同一條總線上掛Flash和SD卡時Flash可能需要Mode 0SD卡可能需要Mode 3兩者頻率也不一樣。每次切換設備時核心層會比較新設備所需的配置與當前總線上實際配置是否一致若不一致則調用ops-configure重新配置硬件。這套機制讓你不需要在切換設備時手動去改寄存器——框架全做了。2.2 struct rt_spi_configuration四個字段四個坑struct rt_spi_configuration { rt_uint8_t mode; rt_uint8_t data_width; rt_uint16_t reserved; rt_uint32_t max_hz; };mode這個字段是最容易看錯、又最隱蔽的。它其實不是只存一個數(shù)字而是把多項參數(shù)按位組合在一起常見的取值包括#define RT_SPI_CPHA (10) /* clock phase */ #define RT_SPI_CPOL (11) /* clock polarity */ #define RT_SPI_MSB (02) /* MSB First */ #define RT_SPI_LSB (12) /* LSB First */ #define RT_SPI_3WIRE (13) /* SI/SO pin shared */ #define RT_SPI_MASTER (04) /* master role */ #define RT_SPI_SLAVE (14) /* slave role */所以一個SPI設備最常用的“模式0”實際上對應RT_SPI_CPHA | RT_SPI_CPOL這一組合也就是讓時鐘空閑時為低、數(shù)據(jù)在第一個上升沿采樣。另一個容易讓人栽跟頭的坑是RT_SPI_MSB和RT_SPI_LSB它的值為0意味著你如果直接把模式變量和0做“或”運算MSB其實是默認選擇不會改變數(shù)值。這可能讓很多人誤以為“我沒有設置MSB/LSB”實際上框架已經(jīng)把MSB作為默認值了。這一點在與某些特殊外設對接時很重要——如果對端期望LSB先傳必須顯式把RT_SPI_LSB寫進mode里。max_hz則是設備的最高通信速率。注意它不是實際頻率而是一個上限值??偩€驅動在初始化時會根據(jù)這個值去計算分頻系數(shù)實際頻率不高于它即可。我曾經(jīng)遇到一個奇怪現(xiàn)象一塊LCD屏明明支持36MHz時鐘但接到某個板子上跑到18MHz就花屏最后定位發(fā)現(xiàn)是PCB走線太長、干擾嚴重。從框架層面看只需調低max_hz就能解決問題——這個字段的設計本身就是給你這種場景做限速用的。data_width一般填88位極少數(shù)設備用16位或32位模式。RT-Thread官方目前對非8位模式的支持在部分BSP里還不夠完善所以如果你要接一個12位或16位并行的屏最好先確認當前BSP的SPI驅動是否支持非8位模式否則就需要在ops-transfer里面自己拼字節(jié)。2.3 struct rt_spi_ops底層驅動的“能力表”struct rt_spi_ops { rt_err_t (*configure)(struct rt_spi_device *device, struct rt_spi_configuration *configuration); rt_uint32_t (*xfer)(struct rt_spi_device *device, struct rt_spi_message *message); };這套回調接口非常簡單只有兩個函數(shù)指針。configure負責根據(jù)配置重新初始化SPI外設設置時鐘極性、數(shù)據(jù)位寬、預分頻。xfer負責真正發(fā)出一幀數(shù)據(jù)返回實際發(fā)送的字節(jié)數(shù)。我見過不少驅動移植者在這兩個函數(shù)上踩坑其中比較典型的情況是只實現(xiàn)了xferconfigure里什么都不做。你在調試時可能發(fā)現(xiàn)第一幀數(shù)據(jù)正常、第二幀數(shù)據(jù)就亂了。原因很簡單——如果configure不生效RT-Thread核心層在比較新舊配置不同后卻得不到硬件層面的真正重新配置。例如總線上掛著Flash和SD卡。Flash要求模式0SD卡要求模式3。程序先操作Flash一切正常再操作SD卡時核心層發(fā)現(xiàn)mode變了于是調ops-configure但你的configure是空函數(shù)底層SPI外設寄存器還保持著模式0的配置。于是SD卡收到波形完全錯誤。這種情況是最難排查的因為單純看代碼邏輯似乎沒有問題只能靠邏輯分析儀抓波形才能發(fā)現(xiàn)。2.4 struct rt_spi_message一次會話中的最小事務單元struct rt_spi_message { const void *send_buf; void *recv_buf; rt_size_t length; struct rt_spi_message *next; unsigned int cs_take : 1; unsigned int cs_release : 1; unsigned int reserved : 30; };這是整個SPI框架中最重要的數(shù)據(jù)結構。它的設計思想是一次rt_spi_transfer_message調用可以攜帶一串消息linked list of messages這串消息作為一個整體被傳輸中途不會釋放片選。send_buf和recv_buf分別指向發(fā)送緩沖區(qū)和接收緩沖區(qū)。當只發(fā)不收時recv_buf可以填RT_NULL驅動程序會自動丟棄讀到的數(shù)據(jù)。當只收不發(fā)時send_buf填RT_NULL驅動會發(fā)送全0或全1的填充字節(jié)具體看BSP實現(xiàn)。最容易被忽略的是cs_take和cs_release這兩個位域。它們控制這次消息是否需要拉低片選和釋放片選。你可能會想為什么不每次都把片選拉低再釋放因為有些外設的操作是一個“復合事務”——例如W25Q系列Flash的讀操作需要先發(fā)命令字節(jié)地址字節(jié)然后連續(xù)讀數(shù)據(jù)。如果每發(fā)一個字節(jié)就拉一次片選Flash根本不會進入讀狀態(tài)讀回來的永遠是亂碼。正確做法是struct rt_spi_message msg1 { .send_buf cmd, .recv_buf RT_NULL, .length 1, .cs_take 1, .cs_release 0 }; struct rt_spi_message msg2 { .send_buf addr, .recv_buf RT_NULL, .length 3, .cs_take 0, .cs_release 0 }; struct rt_spi_message msg3 { .send_buf RT_NULL, .recv_buf buf, .length len, .cs_take 0, .cs_release 1 }; msg1.next msg2; msg2.next msg3; msg3.next RT_NULL; rt_spi_transfer_message(spi_dev, msg1);這樣整個過程片選只拉低一次命令、地址、數(shù)據(jù)作為一個整體被發(fā)出去。理解了這個機制芯片手冊上凡是“CS must stay low during the entire instruction sequence”的約束你都能在框架中找到對應的實現(xiàn)方式。3. 消息傳輸流程與片選控制從線程安全到復合時序的細節(jié)把控3.1 rt_spi_transfer_message 的完整執(zhí)行鏈路rt_spi_transfer_message大概是你在核心層唯一需要仔細讀一遍的函數(shù)我建議你打開源碼把它的邏輯走一遍調用rt_spi_take_bus等待并獲取總線所有權。遍歷消息鏈表中的每一個rt_spi_message。若cs_take為1則調rt_spi_take_cs拉低片選。調用ops-xfer執(zhí)行物理收發(fā)。若cs_release為1則調rt_spi_release_cs釋放片選。全部消息處理完畢后調用rt_spi_release_bus釋放總線。注意核心層不會在消息之間自動拉低或釋放片選它完全依賴cs_take和cs_release兩個標志位。如果你在一個消息鏈表里設置了第一條cs_take1、最后一條cs_release1中間幾條都不設置那么片選在整個鏈表中從頭到尾都是低電平。這套機制還會自動處理配置切換。在遍歷消息鏈表之前核心層會比較當前總線上綁定設備的配置與待處理設備的配置是否一致。如果不一致它會調用ops-configure先重新配置再開始發(fā)送。所以你在同一條總線上交替訪問Flash和SD卡時可以不必擔心模式混用。3.2 為什么先拿總線再拉片選防搶戰(zhàn)的多線程思維這個順序不是拍腦袋定的它解決的是一個非常具體的并發(fā)問題。假設總線上同時掛了兩張SPI Flash分別用PA4和PA5做片選。線程A正在操作Flash1拉了PA4準備發(fā)一長串數(shù)據(jù)。此時線程B被調度它需要操作Flash2它拉了PA5也在發(fā)數(shù)據(jù)。但底層SPI外設只有一個兩個線程的數(shù)據(jù)會交疊混發(fā)雙方的結果全錯。RT-Thread的設計是SPI總線上有一個“所有者”概念bus-owner字段。rt_spi_take_bus會用互斥鎖保護這個字段誰拿到所有權誰才能操作物理外設rt_spi_take_cs則確保只有當前所有者才能拉片選。線程B在拿不到所有權時會被掛起休眠直到線程A發(fā)送完畢、釋放總線。所以我的建議是在應用中永遠不要直接寫片選引腳也不要直接調用底層BSP的xfer函數(shù)。一切訪問都走rt_spi_transfer_message或設備驅動接口不然多線程環(huán)境下的SPI總線一定會在你最忙的時候出亂子。3.3 硬件片選與軟件片選的本質差異及選擇關于SPI片選RT-Thread的BSP通常支持兩種方案硬件片選由芯片SPI外設內部的NSS邏輯自動控制。你只需配置GPIO復用功能發(fā)送數(shù)據(jù)時外設自動拉低片選發(fā)完自動拉高。軟件片選由普通GPIO手動拉高拉低通常在rt_spi_take_cs和rt_spi_release_cs里實現(xiàn)。兩種方案在RT-Thread里差別很明顯對比項硬件片選軟件片選CPU負擔低外設自動控制高每個事務都要GPIO寫入時序精度高由硬件保證時序關系低受中斷和調度影響復合事務較難實現(xiàn)連續(xù)片選往往需要特殊寄存器配置方便CS的拉低和拉高完全由軟件控制多設備支持可能需要多個NSS引腳部分MCU只有一個NSS任意GPIO均可擴展靈活誤操作風險某些時序下可能提前釋放片選完全可控只要代碼沒寫錯實戰(zhàn)中只要不是追求極限速率我通常偏向軟件片選。原因很簡單靈活度高遇到復合事務也好處理。尤其你還要用RT-Thread這類RTOS中斷優(yōu)先級變化可能導致響應稍有波動但軟件片選通過操作GPIO寄存器來控制實際誤差在微秒級以內對絕大多數(shù)外設完全夠用。不過要注意一點用軟件片選時必須確保GPIO配置為推挽輸出且初始狀態(tài)為高電平。這聽起來是基礎常識但很多新人在用STM32CubeMX自動生成初始化代碼后又手動改了引腳復用功能導致初始化順序不對片選腳一直輸出低電平結果總線上所有設備都處于選通狀態(tài)出現(xiàn)兩臺設備同時搶應答的靈異現(xiàn)象。3.4 DMA配合SPI時的消息構造技巧SPI外設加DMA是提升吞吐率的常見組合。RT-Thread消息結構體的send_buf和recv_buf本身不限制緩沖區(qū)來源所以在使用DMA時一個容易忽略的約束是緩沖區(qū)對齊和內存屬性。如果你的MCU帶D-Cache且緩沖區(qū)定義在可緩存內存區(qū)域發(fā)送和接收時可能出現(xiàn)緩存一致性問題CPU往DMA緩沖區(qū)寫了命令字但DMA讀到的還是Cache里的舊數(shù)據(jù)。這是嵌入式開發(fā)中比較隱蔽的坑常見征兆是單獨調試SPI正常加進RT-Thread后第一次讀數(shù)據(jù)正常后續(xù)讀出來的全是上一次的殘影。解決思路有下面幾種為DMA緩沖區(qū)單獨分配在非緩存內存比如STM32的__attribute__((section(.noncached)))。收發(fā)前后手動調用rt_hw_cpu_dcache_ops做cache清理和無效化。使用RT-Thread提供的rt_dma_alloc等接口統(tǒng)一從DMA安全內存池分配緩沖區(qū)。另外DMA模式下recv_buf不能隨便傳RT_NULL。若你只想發(fā)送且不關心接收請把recv_buf指向一個真實的接收緩沖區(qū)哪怕這個緩沖區(qū)不大避免DMA寫空指針導致HardFault。4. 從設備模式SPI Slave驅動要點方向反過來的玩法4.1 RT-Thread如何描述一個SPI從設備SPI這個總線有個特點它天生就是一主多從的結構。但有些應用場景下你的設備需要被別人當外設訪問——比如板子作為某個主控的協(xié)處理器主控通過SPI向你的板子下發(fā)命令。這種場景下你需要使用RT-Thread的SPI從設備框架。RT-Thread提供了一組從設備模式相關接口rt_err_t rt_spi_slave_register(struct rt_spi_bus *bus, const char *name, rt_spi_slave_cb_t cb, void *user_data); rt_err_t rt_spi_slave_config(struct rt_spi_device *device, struct rt_spi_configuration *config); rt_err_t rt_spi_slave_send(struct rt_spi_device *device, const void *buf, rt_size_t len);從設備模式下你不能主動發(fā)起傳輸只能提前準備好接收緩沖區(qū)等待主控來“拉”數(shù)據(jù)。這與主設備模式在編程模型上是完全不同的。RT-Thread的從設備框架用rt_spi_slave_send把數(shù)據(jù)準備好然后等待外部主控發(fā)起SPI時鐘數(shù)據(jù)才被真正移出。4.2 從設備回調機制與數(shù)據(jù)就緒通知當你作為從設備時寄存器層面的收發(fā)邏輯往往依賴硬件中斷。每一個SPI字節(jié)到達都會觸發(fā)一次接收中斷由BSP驅動把數(shù)據(jù)讀入FIFO或DMA緩沖區(qū)。RT-Thread從設備框架提供回調函數(shù)通常是某次完整事務結束時核心層調用回調通知應用層“數(shù)據(jù)已經(jīng)準備好了”。static rt_err_t spi_slave_callback(struct rt_spi_slave_device *device, const void *send_buf, void *recv_buf, rt_size_t len, void *user_data) { /* 在這里處理收到的數(shù)據(jù) */ return RT_EOK; }實際開發(fā)中這個回調函數(shù)里盡量只做“搬運”工作——比如把recv_buf拷貝到應用緩沖區(qū)或者設置一個事件標志喚醒應用線程。不要在這里做耗時處理比如解析JSON或寫Flash這會直接影響下一次SPI事務的響應速度。主控端可能只等了幾個微秒就再次發(fā)起傳輸你回調還沒跑完數(shù)據(jù)就丟了。4.3 主從設備同總線復用時的注意事項如果你在一個芯片上既想當SPI主設備讀外設又想當SPI從設備被外部主控訪問這是可以做到的但要注意引腳模式的切換。例如一個典型的處理方式是平時配置成SPI主模式外部主控通過一個GPIO電平變化觸發(fā)你切換到從模式。你在切換模式時需要重新初始化整個SPI外設并把引腳復用從主設備模式切到從設備模式。這個過程中框架層面的ops-configure就會反復被調用所以你的configure實現(xiàn)必須足夠健壯能處理運行時的反復切換。我在一次產(chǎn)測工具開發(fā)中就是讓板子既能自動掃描總線上兩塊Flash又能把整塊板子虛擬成一個SPI從設備供產(chǎn)測上位機讀寫。當時的實現(xiàn)方式是默認進入從設備模式收到產(chǎn)測上位機的“切換主模式”命令后重新執(zhí)行ops-configure把外設切成主模式之后就可以正常枚舉Flash了。這個功能完全建立在RT-Thread這套可重入的configure機制上——如果你在configure里只做一次性初始化、不做運行時重置那這套方案就完全失效了。5. 常見問題排查與調試技巧用邏輯分析儀和時間線思維抓SPI問題5.1 典型報錯與故障速查表下面整理了幾種我在使用RT-Thread SPI框架時遇到的問題。許多問題都不在框架本身而是外部因素但癥狀往往先從框架層表現(xiàn)出來。癥狀可能原因解決方案rt_spi_take_bus超時返回錯誤另一個線程長時間占用總線或中斷里占用了總線檢查是否在中斷里直接調用了SPI設備接口可臨時增大獲取總線超時時間讀回數(shù)據(jù)全為0xFFSPI模式配置錯誤CPOL/CPHA不匹配設備不在位片選沒拉低先用邏輯分析儀抓波形再核對設備手冊要求的模式讀回數(shù)據(jù)全為0x00極性配置或從設備未準備發(fā)送DMA緩沖區(qū)未正確初始化查看是否有數(shù)據(jù)從MOSI發(fā)出來發(fā)送數(shù)據(jù)對但命令無響應復合事務中片選被反復拉低檢查消息鏈表里cs_take和cs_release是否只在首尾設置第一次讀寫正常之后全錯上電后設備初始化時序未對齊Flash需要等待WIP清除在設備驅動中加狀態(tài)輪詢核對設備上電時序同總線多設備互相干擾軟件片選GPIO初始狀態(tài)為低或某設備發(fā)送時未正確拉高其他設備片選初始化階段把所有片選腳置高確認消息里cs_release確實觸發(fā)DMA模式讀到舊數(shù)據(jù)D-Cache未刷出或未無效化分配非緩存內存收發(fā)前后做cache維護5.2 一次SPI Flash驅動“寫進去讀不出”的完整排查我分享一個真實案例某塊開發(fā)板SPI Flash能讀到JEDEC ID和狀態(tài)寄存器說明讀命令和時序都正常但就是寫入后讀出來全是“0xFF”。排查過程是這樣的第一步檢查Flash是否真的處于寫使能狀態(tài)。用邏輯分析儀抓寫使能0x06命令時序波形顯示片選正常、時鐘正常但命令發(fā)出后沒有等待狀態(tài)寄存器中的WIP位清零。這會導致后續(xù)頁編程命令進來時Flash還在忙于上一次操作直接忽略新命令。第二步修改驅動代碼在寫使能后輪詢狀態(tài)寄存器確保WIP清零后再發(fā)送頁編程命令。這里建議用消息鏈表把“寫命令地址數(shù)據(jù)”串起來保持片選在整個寫周期低位。結果還是失敗。第三步仔細對比波形后發(fā)現(xiàn)頁編程命令后Flash返回的狀態(tài)值一直是0x00但數(shù)據(jù)引腳在讀取狀態(tài)時變成了高阻態(tài)。排查到這一步方向轉向硬件電氣特性板子上Flash的DO引腳與SD卡分線器共用而分線器的上拉電阻選擇了10k——不夠強。SPI速度較高時線路電容導致信號建立不完整。更換更小阻值的上拉電阻后問題徹底解決。這輪排查的經(jīng)驗是SPI問題優(yōu)先抓波形再改代碼。邏輯分析儀能看到片選、時鐘、數(shù)據(jù)三者的相對時序比打日志高效得多。尤其在RT-Thread這類多線程環(huán)境下打日志會引入額外調度延遲可能掩蓋真實時序問題。5.3 調試SPI消息鏈表的有效手段構造測試消息如果你懷疑是RT-Thread核心層在處理消息鏈表時出了問題這兩種情形比較少見但值得確認可以直接在應用層構造一組短消息做最小復現(xiàn)。static struct rt_spi_message test_msg; static rt_uint8_t send_data[4] {0xAA, 0x55, 0xAA, 0x55}; static rt_uint8_t recv_data[4] {0}; void spi_debug_loopback(void) { test_msg.send_buf send_data; test_msg.recv_buf recv_data; test_msg.length sizeof(send_data); test_msg.cs_take 1; test_msg.cs_release 1; test_msg.next RT_NULL; rt_spi_transfer_message(spi_dev, test_msg); }如果數(shù)據(jù)在主控側自發(fā)自收后能正確回讀說明物理鏈路和核心調度基本沒問題。接下來再逐步拆成多條消息驗證cs_take/cs_release的組合是否正確。這種“分而治之”的方式很快能定位到具體是哪一類消息組合導致片選異常。5.4 借助RT-Thread FinSH命令快速驗證SPI設備RT-Thread的FinSH控制臺很適合做SPI驅動基調。比如你已經(jīng)注冊好了“spi10”這個設備可以直接在FinSH里執(zhí)行msh spi loop spi10 0x9F 3這個命令會往spi10發(fā)送一字節(jié)0x9F并讀回3字節(jié)。如果讀回的值符合你預期就說明整條設備鏈路已經(jīng)打通如果讀不到就能排除大量上層邏輯集中精力檢查物理連接和初始化順序。在BSP里往往也提供list_device、list_spi這類命令能快速查看哪些SPI設備注冊成功、當前配置如何。這是我最常用的初始調試手段先確認設備注冊再測回環(huán)再做協(xié)議調試。6. 基于框架寫好自己的設備驅動從零到可復用的實踐路徑6.1 驅動代碼應該放在哪一層很多新手拿到一個SPI外設第一反應是在應用層堆一個讀寫函數(shù)到處調用。這在臨時驗證功能時可行但從可維護性角度不推薦。建議的做法是把設備驅動做成一個獨立文件然后通過設備注冊機制掛到設備框架里。以某個SPI DAC為例正確的組織方式是寫一個spi_dac.c實現(xiàn)dac_write_value(struct rt_spi_device *dev, rt_uint16_t value)這樣的基礎接口。對外暴露rt_device_write風格的讀寫接口讓上層應用不感知SPI的存在。在初始化線程里調用rt_hw_spi_device_attach掛載設備再調用注冊函數(shù)完成設備對象注冊。這樣后續(xù)如果換用I2C版本的DAC只需要替換底層驅動文件應用層代碼一行都不用改。設備框架的意義就在于此。6.2 不自帶SPI控制器的芯片怎么接SPI外設討論一個延伸問題有些MCU沒有硬件SPI外設或用完硬件SPI后仍有多余外設要接這時候可以用GPIO模擬SPI。RT-Thread的框架能不能支持這種答案是能但需要在ops-xfer內部自己翻轉GPIO。這種模擬SPI的驅動實現(xiàn)本質上和硬件SPI驅動的接口形式一致static rt_uint32_t soft_spi_xfer(struct rt_spi_device *device, struct rt_spi_message *message) { /* 在這里用GPIO模擬SCK、MOSI和MISO */ return message-length; } static struct rt_spi_ops soft_spi_ops { .configure RT_NULL, .xfer soft_spi_xfer, };唯一的區(qū)別是configure多半不需要實現(xiàn)因為根本沒有外設寄存器可配置。發(fā)送時自行檢查message-send_buf是否為空決定是否從MOSI移出數(shù)據(jù)檢查message-recv_buf是否為空決定是否從MISO采樣。這里的性能瓶頸在于GPIO翻轉速度比較慢通常只能做到幾百kHz到1MHz左右但接一些不追求高速的外設傳感器、EEPROM、LCD初始化配置完全夠用。6.3 驅動健壯性消息合法性校驗與失敗重試我見過的不少驅動在ops-xfer里基本不做入?yún)⑿r?。偶爾嘴瓢傳了個空指針或者長度算錯整個系統(tǒng)就掛掉了。在RT-Thread消息結構里send_buf和recv_buf同時為RT_NULL時沒有任何數(shù)據(jù)可傳輸應該直接返回錯誤長度為零也同理。if (message-length 0) { return 0; } if (message-send_buf RT_NULL message-recv_buf RT_NULL) { return 0; }這些看似無用的校驗在實際項目中可以省掉很多半夜調bug的痛苦。還要考慮通信失敗后的處理策略。SPI本身沒有ACK機制寫命令發(fā)出后是否成功一般取決于從設備的內部狀態(tài)。所以在設備驅動里加狀態(tài)確認通常很有必要——比如SD卡命令后要讀響應Flash寫命令后要輪詢狀態(tài)寄存器LCD顯存寫完可以讀回驗證。這些協(xié)議級的可靠性措施不能只依賴底層框架。6.4 性能優(yōu)化單次傳輸長度與合并傳輸SPI吞吐率往往取決于事務的拆分粒度。一次rt_spi_transfer_message傳入的消息越少、單條消息越長線程切換和總線占用開銷越小。舉例來說如果要把一個Flash固件分區(qū)全部讀回做校驗最直接的方式是循環(huán)調用rt_spi_read每次讀4KB。這個循環(huán)每執(zhí)行一次都要獲取總線、釋放總線。更好的做法是一次申請一個大緩沖區(qū)用一條長的消息把整個分區(qū)連續(xù)讀回。這樣SPI總線只被占用一次DMA也能把整塊數(shù)據(jù)搬完。但大緩沖區(qū)又涉及內存分配問題——你不可能無限制地申請大塊連續(xù)RAM。此時可以把消息鏈表用起來分配多塊較小的緩沖區(qū)通過next指針串成一個鏈表每塊緩沖區(qū)對應一條消息。它們在核心層可以被連續(xù)傳輸片選保持低位而內存壓力則被簡化到每塊緩沖區(qū)都比較小。這個技巧在讀寫大容量NAND Flash或長時間連續(xù)采樣時非常管用。7. 經(jīng)驗總結與未來擴展RT-Thread的SPI驅動框架最大的價值不是幫你少寫幾行寄存器操作而是幫你建立了一套“總線資源調度”的思維模型。縱觀整個框架核心層像個交通警察負責分配通行權BSP驅動是路口信號燈控制實際信號設備驅動是每輛車的駕駛員按既定路線行駛。應用層只需要說“我要到某個地方去”完全不用關心中間經(jīng)過哪些路口。實際操作中我個人的體會是剛上手時先不要急著看源碼和結構體。拿一塊Flash或傳感器用框架自帶接口先調通一版回環(huán)再回頭讀核心代碼理解會快很多。源碼本身寫得相對直白但如果沒有實際調試經(jīng)驗打底光看代碼容易陷入“每個字都認識整體不知道在講什么”的狀態(tài)。后續(xù)如果你的項目涉及更高性能需求可以留意RT-Thread在SPI框架里的兩部分擴展方向使用RT_SPI_CPHA/CPOL之外的自定義位配合外設的特殊時序要求做精細化控制。將DMA和SPI框架更深地綁定比如為struct rt_spi_message擴展發(fā)送完成回調這樣才能精確掌握DMA完成時機做更高層次的協(xié)議狀態(tài)機。另外如果同一個項目中需要兼容SPI Flash、SPI屏幕、SPI傳感器這幾種不同特性的外設建議在設備驅動的外層再抽象一層統(tǒng)一接口。這樣應用層永遠只面對一個“讀寫寄存器”或“讀一頁數(shù)據(jù)”的操作而底層可能用SPI、I2C甚至UART來實現(xiàn)你會驚喜地發(fā)現(xiàn)代碼復用率可以變得非常高。這算是從“會用SPI框架”邁向“設計良好驅動層”比較有價值的一步。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
亚洲天堂在线怕怕视频| 色综合久| 91久久久老司机| 一本大道久| 人人摸人人添人人操| 欧美国产操逼| 3p国产欧美99热| 欧美另类丝袜熟女| 美女黄色一级A视频| 好爽视频在线观看视频 | 强奸国产精品视频| 久久久久久99999国产精品| 国产一级αv免费看片| 亚洲图片欧美偷拍| 狠狠躁AV| 3P乱轮视频| 日韩无码人妻中字久久三区四区| 日韩中文字幕av在线播放| 日韩av电影成人在线| 日本精品性生活久久久| 国人欧美精品一区二区| 欧美亚洲系列| 女人综合网| 久艹伊人精品综合在线| 亚洲导航深夜福利| 翔田千里AV无码秘 三区| 91jk色拍| 亚洲精品男人的天堂| 欧亚无码视频| 家庭乱伦麻豆| 熟女精品日韩一区二区三区| 国产亚洲人妻综合日韩 久久| 中文字幕视频在线观看| 男人天堂网手机版婷婷| 欧亚日韩三区| 丁香五月激情网| 日本一级婬片试看三分钟| 大色网久久| 99国产精品久久久在线播放| 欧美国产操逼| 国产久久男人天堂| 一牛影视久久久一区二区三区| 国产精品人人爽人人做可爱福利| 欧美亚洲激情| 天天肏夜夜肏| 岛国不卡超碰护士AV在线播放| 一区二区三区日韩欧美 | 玖玖人人爱| 不卡一区二区日本视频| 岛国激情视频软件| 国产精品久久久久久亚洲色欲| 高清不卡 中文 人妻| 精品人妻无码一区二区三区不卡-精品人妻无码一区二区...|精品少妇一区二区三 | 国产日韩欧美三级片| 久久这里只| 老熟女天天操| 国产高清自拍| 怡红院成人视频| 国产在线激情| 久久久久久9| A级片日韩欧美国产欧美视频精选观看| 日韩三级伊人| 免费一级a毛片久久久久久鸭绿欲| 国产精品天干天干综合网麻豆| 日日日啊啊啊| 情色日播放AV| 亚洲自拍欧美国产首页网曝| 九九九九一区| 精品久久久久久中文字幕视频免费| 欧美丝袜美女电影一二三四区| k频道色撸撸| 51一区二区三区| 99国内熟女露脸视频| 国产女主播视频在线观看| 屌妞视频久久久久久久久久久久| 亚欧洲一区二区视频| 91国产美女丝袜足交精品视频| 亚洲日产专区婷婷| 久久免费9| 国产精品99精品视频网站| 园内精品自拍视频在线播放| 婷婷色网| 中文字幕一区 二 区 三 四 五 区日 日 骚 | 亚洲一本色道中文无码aV天美| 无码区蜜乳| 国产欧美精选激情视频| 久久久久久午夜男人的天堂| 99蜜月精品久久| 天天日天天操天天射河南省| HEYZO高无码国产精品227| 亚洲第一页色| 欧洲精品二区| 另类小说综合网| 国产超碰| 深夜激情| 亚洲 国产 精品一区| 青青草日本无码| 亚洲码和欧洲精品激情系列| 97碰碰日本乱偷人妻中文的| 26uuu久久| 涩涩涩综合| 伊人99热| 亚洲综合小视频小说在线观看| 人妻大香蕉| 国产精品一区二区手机看片| 日本人体九九九九九九| 国产天天噜一噜久久久| 大香蕉久久| 国产强奸超碰AV| 91在线视频免费中出| 天天看特黄的免费网站| 丰满人妻aA一区二区三区| 在线性黄高清免费视频| 久久熟女久| 性久久久| 东京热不卡视频| 色欲av一区二区三区蜜芽| 日本在线一二| 亚洲āv网址在线观看| 婷婷操逼| 亚洲免费97免费| 欧美成人精品一区二区男人蜜臀| 中日亚韩免费视频| 国产精品高朝久久久久久久| 97人人模人人爽人人| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 久久日本熟女精品一区| av2014 日韩在线中文字幕| 色哟哟综合| 99碰碰| 91国精产品| 国产一级137片内射麻豆| 日日AV加勒比| 91九九| 在线观看一卡二卡| 亚洲成人性爱网站在线播放| 欧美人妻一区二区| 久久麻豆一区二区| 久久久久免费看少妇A片特黄| 韩日精品福利视频一区不卡在线免| 九月丁香婷婷色| 97免费视频在线观看视频| 插日本熟女视频| 久久久无码精品人妻二区| 天天日天天爽| 欧美人与动性人交a| 欧洲精品在线播放| 男女真人网18| 久久久精选| 五月天成人综合| 国产传媒日韩欧美| 亚洲欧洲无码一区夜| 大香蕉免费乱伦视频| 97少妇人妻中文字幕久久 | 精品少妇一区二区| 91色碰| 男人天堂黄片| 久久日韩肥臀| 热久久九九热| 黄色AV影视| 成人无遮挡毛片免费看| 美女t无毒不卡不卡| 国产亚洲精品无码三区| 人妻精品综合中文字幕在线 | 久久亚洲中文字幕视频| 91色女| 国产日韩精品人妻久久久久色欲网站| 日日嗷| 91女神在线视频| 精品中文字幕一区二区| 欧美色网络| 亚洲男人的天堂AV| 91蜜臀在线久久久久| 国产最火爆久久国产网站网站| 四虎在线播放| 100啪啪视频大全| 射 色综合| 一级@啪啪视频| 伊香蕉综合久久久久久久噜噜噜 | 青久操| 探花精品视频| 亚洲高清无码在线桃色| 久草精品国产99| 人妻丝袜二区| 超碰欧美97资源| 亚洲欧洲色情高清| 亚洲国产综合久久久性感熟妇| 强奸乱伦av电影| 日本国产亚洲一区在线观看| 激情小说亚洲| 亚洲视频精选| 伊人超碰97| 超碰这里有精品| 九九国产| 人人爽人人精品乱人伦AV| 国产精品久久久久久夜夜夜| 思思热在线| 久久婷色| 日本三级日本三级99| 搡老女人老妇女AAA一VU麻豆| 97爱爱爱| 精品一区二区三区国产| 黄色成人网久久久久久| 操逼网站网站| 亚州免费啪啪视频| 亚洲精品日日夜夜52| 女生久久网| 久九干| 爱爱60秒免费视频| 91亚洲精品青草| 人妻嗯啊啊在线播放| 99热只有这里有精品| 乱伦Av网| 色色五月天激情| 无码抄逼网| 91三级理论片播放器| 久久国产精品熟女人妻| 亚洲情色一区二区三区| 91艹| 日韩大香蕉| 亚洲欧美999| 91综合色噜噜| 强奸乱伦亚洲第一页| 精品国产91av一区二区三区| 天天色天天干天天射| 最近2019中文字幕国语免费版| 美国一区二区三区视频| www.激情| 欧美色图偷拍另类| 久久久96精品| 97色碰| 天天看精品动漫视频一区| 国产日韩色综合| av午夜影院在线播放| 无码聚合| 欧美18禁91| 一本一道久久综合久久| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 麻豆天美传媒在线视频天堂| 精品人妻一区二区三区夜夜| 97综合激情| 日韩一级欧美一级国产一级台湾| 国产精品老熟女一区二区| 91美女片在线| 亚洲国产精品久久久久久久久久| 天美国产三级传媒| 青草视频人妻在线观看| 夜夜欢天天干| 人人操人人摸人人看人人干| 国产又爽又黄| 超碰97男人| 人妻美腿丝袜日韩| 尤物视频视频官网| 精品国产乱码久久久久久口爆网站| av天堂5| 人人乐大香蕉| 91超碰丝袜制服| 亚洲欧美综合| 五月天激情影院| 青青草视频在线观看一区二区| 国产AV人人夜夜澡人人爽麻豆| 俞拍久久国应视频| 国产色呦呦| 欧亚乱色熟一区二区三四区| 亚洲精品97久久中文字幕| 人妻夜夜爽天天爽三区麻豆AV网站| 亚洲精品国产熟女| 九九久久一区二区三区| 黄页网站免费高清在线观看| 亚洲国产一区二区三区在线| 久久9精品| 粉嫩不卡一区二区性爱| 精品二999| 久久精品国产Aⅴ| 免费看日本操逼视频| 最新av在线| 精品对白久久不卡| 在线不卡视频| 欧色网址| 国产精品成人无码av| 91天天c| 亚洲欧美日韩制服另类| 97色伦欧美| KK色在线影院| 97啪啪| 中精品一区二区三区| 亚洲?V无码专区在线电影| 欧美日韩超碰在线| 黑人在线91| 在线性黄高清免费视频| 日韩欧美天堂| 综合久久婷婷| 亚洲天天操| 亚洲天堂中文字幕无码男同| 78操B| 婷婷综合五月天| 日韩成人小视频| 影音先锋中文字幕日本好一区二区| 日本97久久久精品| 操迟操逼在巾线Fre看| 天天操人人操骚逼网站| 久久久九九九九| 岛国在线国产| 欧美传媒一区| 色哟哟的毛片| 夜夜操青青草| 丝袜视频网国产90| 五月天婷婷色| 日本成熟少妇A∨网站| 少妇毛片久久| 亚洲性爱无码乱伦av| 日本高清一本二本免费不卡| 少妇高潮99p| 视频国产成人精品日本亚洲18| 久妇网| 国产第12页| 国产情色第一第二页在线观看| 日韩一性一交一A片俄罗斯| 嗯~啊~快点 死我视频免费看网站| 亚洲精品天堂久久A∨51成人漫| 欧美韩国你懂得在线| 两性综合网| 1240青青草一区二区三区视频天爱| 久久久亚洲精品电影免费看| 欧美后入视频| 两性综合网| 大香蕉中文在线| 亚洲网自拍| 日本无码1| 九九九九九九精品| 久久做97| www.yw尤物| 懂色AV网| 久久久久亚洲精品| 91丨九色丨国产打屁股| 一区操逼| 超碰97丝袜| 99久在线精品99re8a| 激情看片网站| 国产一区二区在线播放量| 精品少妇一区二区| 日本淫穴在线| 天天看天天综合成人网| 久久一级无码精品毛片6| 男人天堂2019| 日本天天干天天日一区| 麻豆影音天美视频| 日韩一区二区精品视频| 黄页视频网站野外| 日韩av电影成人在线| 久久激情视频| 91 亚洲情侣偷拍 久久| 91色鬼| 五月婷婷色色| 国产亚洲国产超碰| 强奸乱伦大香蕉| 校园春色五月天| 9九九国产| 久久中文色图| 欧插网站| 另类小说五月天| 福利色色| 黄色小视频日本txt| 国产精品人妻无码久久久互動交流 | 无码一区免费在线不卡| 欧美劲爆第一页| 人人爽夜夜玩视频| 99re这里| 欧美日本天堂| 18岁禁 茉莉成人久久| 中亚精品极乱| 人妻少妇视频在线播放| 丁香久久| 五月丁香六月激情综合| 色色五月天激情| 在线观看国产黄色| 国产精品无码AV网站| 日韩综合成人免费视频| 老熟女乱伦一区| 色综合V| 欧美黄页| 欧美亚洲国内自拍| www..com操老师| 无码区蜜乳| 思思久热在线精品66| 成人怡红院| 日本欧美不卡| 9久久久久| 国产精品一区二区三区四区五区| 欧美黄业| 久久超碰国产一区二区三区| 日韩簧片免费看| 精品成人无码| 久久高清欧美国产| 日本中文字幕在线视频| www.91色综合| 久久精品免费| 亚洲少妇色图自慰直播| 制服丝袜第二页| 久久人人爽av亚洲精品天堂桃色 | 蜜臀久久99精品久久久久久无删减 | 日韩精品一区二区高清| 欧美一区二区日韩三区| 激情网色| 91 手机在线播放 绯色| wwe 天天干.com| 欧美性爱网97| 亚洲 中文 欧美 日韩 在线| 麻豆91熟妇人妻中文字幕茄子| 久久97精品久久久久久久不卡| 中文字幕乱亚洲美女精品一区| 亚洲图片激情小说| 亚洲精品白浆高清久久久久久 | 亚洲日本男人天堂网| 绑缚麻绳人妻寝取完整版| 久久久久921| 噜噜噜噜久久久精品免费| 亚洲成人激情小说视频| 婷婷激情五月天小说网| 天天欧美色| 九九拍拍精品视频在线播放 | 啊啊啊啊啊啊在线| 老司机天天操| 丁香五月天社区| 操一区| 91第一页| 五月天丁香婷婷综合网站| 91黑丝露脚| 国内97干免费看| 夜夜爽夜夜操| A片三级无码| 亚洲色图 欧美热图 清纯唯美 另类自拍 | 国产丝袜高跟美女av免费观看| 自拍六区| 5278欧美一区二区三区| 日本精品性生活久久久| 国产高清自拍| 韩国一级婬片A片AAAAA| 熟女91网站| 国产精品制服丝袜中文字幕日韩一区二区三区 | 天天躁日日躁狠狠狠躁| 亚洲好看强奸乱伦| 黑操B| 久久久久久久久久久久久女过产乱-少妇高潮一区二区三区喷水-成人AV | 日韩免费福利在线观看| 久久九九视频九九视频| 五月天黄色av| 天天综合中文字幕 91| 亚洲成人福利电影免费 | 欧美日韩1234| 噜噜噜无码AV一级一级久久影院| 狠狠色一区二区中文字幕| 麻豆天美91| 九九在线视频| 久久老熟女| 国产精品岛国片在线观看| 97精品国产手机| 国产在线综合福利网站| 国产女人高潮视频| 九热久| 大香蕉手机视频| 中文字幕一二三av| 九色婷婷| 亚洲高清色综合| 高清在线偷拍自拍视频| 麻豆一区二区AV天美| 欧美性爱www免费版| 热久久九九热| 欧美日韩精品一区二区三区高清| 97精品国产手机| 中文字幕国产| 风骚少妇视频中文字幕| 国产精品蜜乳AV| 欧美第二页午夜| 亚洲高清无码在线桃色| 成人开心网在线视频| 欧美劲爆视频一区二区| 亚洲天堂一二| 九九九九久久久| 校园春色 欧美| 熟女丰满人妻一区| 伦激情人妻另类人妻| 最新av在线| 视频国产精品未满十八禁止在线观看| 超碰午夜| www.99热| 色欲Av人妻精品一区二| 天天插夜夜爽| 色爱国产| 日本精品一区二区三区四区的功能| 98色网| 无码直播久久久| 色偷综合| 婷婷久草一区二区三区| 国产91影院| 国产第11页| 女人高潮大叫一级毛片| 人妻天天爽天天爽三区| 色综合20p| · —级AA伦aa坐爱午夜极速ⅴA一区天天噪天天噪天天噪 | 密乳AV免费观看| 本道在线| 97天天爽| 草草网站影院白丝内射| 亚洲欧美日韩不卡人妻| 精品176精品2| 狠狠狠狠狠干| 香蕉久久AⅤ...| 欧美成人贴图| 亚洲国成人情色好看电影| 中文字幕aⅴ在线视频| 久久久久久人体| 中文乱码99| 中文字幕av乱伦| 成人午夜高潮av猛片| 日韩av情韩国爱禁区av一区二区| 日本三级久| 国产亚洲中文不卡二区| 九九九热| 青青草影视蜜久久| 亚洲第一二区另类图| 五月天社区| 欧美另类精品xxxx| 日韩一区二区精彩视频| 日比av无码| 操淫穴亚洲五月丁香| 色五91| 成人乱码一区二区三少妇| 97超碰碰| 丁香五月天视频| 亚洲.欧美.丝袜.中文.综合| 超碰av人人人| 影视综合无码少妇| 南澳成人一级片在线播放| 亚洲射综合网| 96AV精品| 久久久久久国产精品| 久久久久久久亚洲Av无码| 3PAV乱伦视频| 女生看匆91网站| 熟妇激情| 国产亚洲日本| 最新精品久久蜜桃 | 东京热一区二区三区四区五区六区| 妺妺跟我一起洗澡没忍住| av天堂精品久久| JIZZJIZZ亚洲女人被躁| 色臀av| 国产乱码久久久| 精品女同一区| 日韩av电影网站| 色哟哟av网址| 欧美在线|亚洲| 日本顶级天天操狠狠操夜夜操中文字幕| 欧美黑人性猛交91| 97超碰碰碰| 久久99操天天日| 99九九精品| 爱做久久久久久| 黄色片大香蕉| 手机看片1025| 欧美性爱五月天| 色五月亚洲| 偷拍 精品另类 凸凹了四区| 欧美性爱97超碰| 2020视频1区2区3区| 国语人妻精彩刺激| 日韩一区二区熟女| 蜜臀久久久国产| 久久久专区| 人人摸人人舔一区二区| 中文字幕1区2区| 花花AV导航| 五十路熟女人妻一区二区在线观看| 蜜臀久久99精品久久久久久| 亚欧色图在线激情| 成人无遮挡毛片免费看| 在线免费观看日韩一区| 欧美日韩性爱操大逼| 色狠狠色| 动漫片子网站3黄| 亚洲少妇在线影音| 呻吟 欧美 日本 中出| 欧美96在线|欧| av黄图片在线观看| 一起草日韩| 91Chinese在线| 91在线视频免费中出| 日韩精品电影| 少妇天堂| 一线黄色免费性爱片| 欧美丰满熟妇XXXX性ppX人交| 98色网| 久久99草| 国产深夜福利| 中国一区二区亚洲人妻| 久久久一热在线播放| 欧美性爱一区二区三区四区| 国产一区二区精品久久久不卡蜜臀| 亚洲综合九九| 91精品啪在线观看国产城中村| 天天综合精品| 天堂资源站| 精品视频一二三中文| 国产99精品一区二区三区免费| 久久婷婷精品| 欧美精品三区| 国产91福利小视频在线观看| 亚洲无码一区二区三区三州| 精品十三区| 日韩97在线| 国产熟女乱论| 中国黑人三级片网站上区| 啊啊啊水好多| 殴美在线AⅤ| 综合网久久| 精品久9| 久久婷婷综合国际产色怕| 亚洲综合码| 亚洲欧美黄| 极品色www影院| 999 久久久| 亚洲伊人久久综合97| 色五月综合网| 99蜜月精品久久| 免费超碰97在线观看| 啊啊啊好湿国产一二| 人妻91少妇| 亚洲精品精品一区二区| 1.igao73.com 加入收藏 免费专区 国产精品 中文字幕 日韩精品 欧美精品 精彩 | 日韩综合色网| 亚洲精品尤物yw在线影院| 韩国一区二区精品亚洲| 日韩大香蕉AV影片| 97国产成人精品免费视频| 噜噜噜亚洲精品| 人人做天天爱| 亚洲情色在线| 国产精品4p在线观看| 97免费在线视频在线观看| 天天爱天天操| 五月丁香狠狠爱| 国产嫩草精品A88AV| 精品区国产区一区二区三区| 肉丝无码中文高清| 五月婷婷丁香中文字幕| 亚洲女人毛茸茸91| 日韩AV熟女乱伦| 欧美日韩人妻精品一区二区三区| 色噜噜人妻丝袜a∨先锋影 | 夜夜嗨一区二区三区直播内容| 欧美日韩中文亚洲v在线综合| 啊嗯嗯啊好大好爽| 激情综合网五月婷婷五月天| 丝袜色综合| www.色操逼| 国语精品av| 色蜜AV| 边做饭边操逼逼| 亚洲精品国产AV天美传媒| 国产精品探花色| 96久久久精品| 影音先锋国产精品| 欧亚日韩中文在线| 五月天伊人| 欧美经典一区二区三区| 无码人妻毛片丰满熟妇精品区| 手机看av网站在线看| 国产精品夜夜| 图色综合网| 免费αⅴ在线观看| 欧亚 另类 久| 蜜桃久久久久久| 中文精品一区二去| 亚洲日精品| www.97在线| 色官网色综合| 91 综合网| 青青草精玖玖69精品| 久久三| 97免费视频在线| 欧美日韩亚洲天堂网| 欧美日韩岛国大片在线观看| 97超碰久久| 欧美色日本| 婷婷在线精品| 8x福利精品第一福利视频导航 | 日韩性爱高清免费视频| 97爱综合| 日韩性爱毛片操骚逼| 美女让帅哥通她小鸡鸡| 日韩有码一区三区| 国产乱伦亚洲| 久久婷婷成人综合色怡春院| 久久男人网| 五月天大香蕉| 精品久久久久久中文字幕三区 | 亚洲无992tv| 嗯嗯啊啊好大好爽| 婷婷色一区| 亚洲最新a在线观看| 91精品91久久久久77777俄罗斯老妇姓x| 二对二中文字幕。| 色五月综合| 久久久久久69国产一区二区| 精品久9| 天天操天天日天天干| 国产蜜臀精品一区免费尤物| 另类小色呦| 国产高清视频无码在线| 中文字幕视频在线观看| 国产热av| 欧美情色男人的天堂| 欧美成人9797| 九九色精品| 啪啪资源网| 无码区蜜乳| 国产区日韩区在线观看| 91n处女在线观看| 人妻少妇久久中文| 噜噜噜久久亚洲精品色情| 日本熟妇熟色97一本在线观看| 亚洲色图殴美色图激情乱伦| 国产9 9在线 | 亚洲| 日日爱99| 青青青青操国内视频在线| 97综合久第一页| 97超碰中文| 色麻豆AV| 久久99草| 日韩精品9区| 亚洲熟久久| 天天色怡春院| 91挑色欧美| 97er欧美性| 国产小炒后入式| 欧美在线大香蕉| 久久仑合| 97爱b| 日韩精品电影| 中文字幕久久亚州无码| 一区二区视频你懂的| 欧美色日本| 超碰久久草| 久久少妇人妻| 天堂精品| 天天综合,91入口| 久久亚洲天堂| 日日AAvv| 亚洲人妻日日日| 91国产丝袜白虎| 亚洲影视高清三级-草1024榴社区入口-品爱AV | 操b网站亚洲无码| 中文字幕乱码人妻二区三区| 天天干人人乐| 日日爱99| 久久久精品中文字幕爱豆| 国产综合在线视频网站| 一级毛片久久久久久久女人18| 人人操人人干网页| 久久久久国产精品片区无码直播| 自慰白浆在线观看| 亚州精人品大香蕉| 成人熟女视频一区二区三区| 高潮综合网| 公司1区2区3区精产精| 日本欧美不卡| 成人五级久久| 最新日韩黄片| 亚洲情色五月天 | 日本一区二区三区欧美日韩中文字幕| 麻豆天美国美国产| 试看福利| 四虎在线视频| 黄色香蕉视频网站一区| 精品v日韩欧美国产| 欧美一区二区日韩三区| 日韩国产乱子伦App| 丁香九月婷婷| 干B| 久久97视频| 一级一性爱免费视频| 国产专区第一页| 天天干少妇| 91老熟女老女人国产老太| 精品免费囯产一区二区三区| 可以免费看黄片的视频| 插欧洲美女欧美精品| 亚州成人A√| 福利天天都操| 一区二区精品日韩欧美在线观看| 国产成人自拍视频在线| 丝袜性亚洲| 大逼色网站| 视频黄色国产一级| http://qxhbdz.com| 91视频综合在线| 午夜国产综合视频在线观看| 全球成人中文在线| 青青草久久一区网| 大香久久| 黄片www.| 中国小夫妻勾搭露脸淫荡对白| 日韩91网站| 欧美大香蕉专区网| 蜜臀人妻少妇久久在线观看| 色97欧美| 亚洲图片欧洲图片aⅴ| 宅男午夜在线视频| 97手机日韩| 久久性爱城| 亚洲熟女乱色一区二区三区久久久 | caopeng97人妻| 日韩精品午夜操呦呦不卡影院| 岛国片国产成人亚洲播放| 亚洲色图 欧美热图 清纯唯美 另类自拍 | 亚州免费啪啪视频| 久久精品一区| 亚洲熟伦熟妇AV无码春色| 校园春色综合| 9久久精品| 91狠狠综合久久| 97久久国产精品| 日韩 欧美 另类 人妻| 日本东京热大香蕉a片| 国产精品999aaa| 亚洲国产欧美日韩人妻日中文| 大粗鳼巴久久久久| 婷婷天堂站| 色噜噜日韩精品| 亚洲午夜av| 大香蕉性欧美| 亚洲九区| 国产一区在线看| 久久人妻丝袜一区二区三| 十八禁黄色| 国产三级中文字幕粉嫩| 欧美日韩国产三级黄色| 96免费视频在线| 亚洲图片日本AⅤ欧美在线| 国产精品乱码久久久久久久久久久久| 凹凸视频在线一区二区| 亚洲国产综合久久久性感熟妇| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师黑人潮喷一 | 欧美亚洲影视| 黄色大片免费在线| 97精品久久久久久久| 一级人妻性爱视频| 日夜干射色啊| 国产网站在线播放| 亚洲校园激情| 狠狠操狠狠插| 人人操人人摸人人骑| 熟妇亚洲一区二区三区| 丰满人妻一区二区三区性色| 亚洲精品国产av天美传媒| 东北丰满熟女国产一区 | 国产亚洲在线| 亚洲啪啪综合?v一区综合精品区| 九一屌逼| 曰本人妻人人澡人人夹| 精品熟妇视频一区二区| 人人乐大香蕉| 乱伦一区二区三区‘| 久久久天美| 久久国产三区| 日本人妻中文字幕精品| 9997se| 美女黄色一级A视频| 亚洲97成人在线观看| 亚洲涩图欧美| 少妇二级| 性色生活片久久毛片婬片免费放女人一级毛片 | 久久精品无码熟妇一区二区三区视频导航| 97干在线| 欧美偷拍区| 人人操超碰在线| 日本三级日本三级三级人妇四虎| 亚洲成人av电影在线| 91 天天综合| 最新av在线| 台湾佬大香蕉| 啊啊啊不要啊啊受不了了视频在线 | 日本精品一区二区中文字幕| 国产精品香蕉| 黑人粗大V S日韩女优视频| 久久精品一区二区三区不卡| 乱伦一区二区三区‘| 三及片网站| 九九九九精品一区| 天天干一区二区| A 天堂在线观看视频| 91精品老女人| 福利五区| 欧美亚洲美少妇一区二区| 99色色网| 亚洲第一无码播放立川理惠| 秋霞午夜成人福利片片| 淫穴高潮色图| 久久日本熟女精品一区| 天堂av2019| 色香色欲天天综合网天天来吧| 成人性爱免费播放| 91美女在线| 亚洲精品国产熟女久久久| 欧美无圣光在线| 欧美九9 9 9| 日本中文字幕在线视频| 五月婷网站| 国产丝袜欧美在线视频| 天天日夜干| 久肏视频字幕| 亚州欧美综合| 久久久久大香青草精品综合| 国产怡红院| A V少妇特黄三级| 欧洲熟妇xxXx欧美老妇裸体| 日韩欧美综合激情| 少妇人妻太紧太深av| 精品国模无码| 婷婷色综合欧美日韩| 少妇的嫩逼图片| 午夜福利 成人 91| 国产又长又大又粗的视频| 97色涩| 极品少妇99| 蜜桃中文字日产乱幕4区| 九色 人妻 大香蕉| 东京热男人的天堂网| 色婷婷久久| 99视频内射三四| av大香蕉| 婷婷月色| 亚洲综合色男人网| 超碰97起碰| 熟女人妻av在线资源,黄色的资源| 五月天激情四射| 综合激情五月天| 超碰狠狠操| 天天射,天天操,天天爽-国内精品一区二区三区-成人AV | 久久激情视频| 99热在线播放| 发朗少妇买婬全视频中文| 久久九九99| 区日韩亚洲乱码av电影| 99热超碰| 青青草精玖玖69精品| 2017大香蕉国产精品久久| 久久日本熟女精品一区| 搡老女人老91妇女熟女| 国内精品久9| 花花AV导航| 91香蕉国产尤物视频| 亚洲欧美高清无码| 日小BB小视频| 被体育老师抱着c到高潮| 日韩AV熟女乱伦| 99欧美| 日本免费不卡二区| 操学生天天| 久草国产在线视频| 蜜乳AV色欲AVAV无码| 久久久久久午夜男人的天堂| 亚洲一二三四区机械| 亚州中文字幕超碰97| 制服丝袜第二页| 蜜臀99久久国产| 亚洲电影中字一区二区| 操逼不卡中文字幕| 天天日夜夜爽| 五十路熟女工口| 综合熟妇一区二区三区| 国产传媒日韩欧美| 天天操天天射天天日| 999岛国大片| 亚洲欧美中日韩| 99re在线视频国产| 干超碰碰熟女| 亚洲欧综合另类无码一区| 超碰99在线| 久久大线蕉一区| 国产人妻久久精品一区二区三区| www.av家庭乱伦| 久久性爱大全| 日本熟人妻中文字幕在线|...久久国产精品-国产精品_日本一区二区三区中文字幕 | 动漫爆乳3D奶水一区在线观看 | 午夜.DJ高清在线观看免费7| 亚洲AV成人无码一区二区三区在线观看 | 97人人干| 亚洲色图欧美另类在线| 狠狠躁伊人中文字幕| 人人玩人人添人人澡免费| 91人妻Pr| 精品一久久久| 欧美日韩在线小说 | 黄色一区二区秘书性感| 国语人妻精彩刺激| 超碰这里有精品| 免费国产电影一区二区| 欧美一级色| 亚洲色图欧美另类在线| 日日爱99| 亚洲国产日韩欧美熟妇在线| 天天澡天天爽日日av| 国内外内射高清视频| 午夜福利视频在线一区| 97色色国产视频| 亚洲久久久久| 色婷婷亚洲婷婷| 成人免费在线网站| 黄呦呦在线| 日本操逼视频免费| 丁香六月天| 夜夜嗨老熟女AV一区二区三区| 国产男女边吃边摸视频网站| 嗯嗯嗯好爽| 亚洲精品国产拍免费91在线| 91三级理论片播放器| 久久超碰免费的| 日韩电影在线观看网址| 屌色在线97视频| 久久久精品,3| 国产精点久久久成人| 91麻豆一二三区| 97在线观看播放视频| 国产农村妇女精品一| 亚洲一级黄色毛片| 国产精品天美传媒| 97精| 大香蕉97久久| 蜜臀一区二区三区亚洲最新章节在线观看 - 高清蜜臀一区二区三区亚洲全集播放 | 人、人、摸,人、人、草| 91少妇香蕉久久精品| 日韩无码精品综合久久| 中文字幕版| 久热精品在线国产| 99操| 岛国片在线播放| 亚洲美女30b| 亚洲无码成人精品| 久久大线蕉一区| 成人日韩3| 18禁久极品美女久久哦哟呀!| 九九热久久99精品re| laoshunv91| 国产成年免费大片黄在线观看| 日欧毛片久久| 日韩在线观看字幕精品| 日韩中文字幕精品一二三事国产精品| 思思热在线cao| 日韩黄色小说| 97婷婷色| 狠狠干91| 国产精品91ai| 干日本人少妇午夜寂寞影院| 97天天在线| 六月色色| 中文字幕丰满子伦无码专区在线视频最新 | 久久久久国色αv免费观看| 五月婷婷综合网| 日本操逼视频免费| 日韩人妻精品中文字幕| 一级黄色性爱A级片| 夜夜嗨TV| 亚洲AV无码天美传媒一区| 日本羞羞的视频在线播放| 青青草成人视频在线观看二区 | 国产在线激情| 成 人 影视 一区 二区 三区 四区| 大香蕉免费3| 国产欧洲精品亚洲午夜拍精品| 蜜汁欧美| 艳美熟妇先锋一二三区| 波多野结衣一级视频| 国产黑白丝在线| 91大胆欧美| 欧美精品xxxwww| 日韩性爱高清免费视频| 91高潮| 蜜臀久久在线视频| 国产精品亚洲免费| 黄片www视频免费| 日本好吊色视频| 日本大片日本一区二区免费高清 | 久久久婷| 黄视频免费| av2014 日韩在线中文字幕| 日韩99999色| 成人天天看站长推荐| 国内操逼视频二区| 日韩性爱高清免费视频| 国产精品九九九| 日本九九久久99| 精品一区二区三区蜜桃臀赵总 | 亚洲免费成人在线高清无码视频| 亚洲成人在线资源| 久久的网站啊啊啊啊啊| 丁香五月激情综合国产| 一级性爱视频免费在线| 亚州色图欧美色图| 亚洲AV无码久久精品蜜桃小说| 九九热精品| 无码黑人精品一区二区三区三| 久艹日日日| 久久超碰天天| 91激情网| 国产日韩精品一区二区三区| 国产日韩欧美三级片| 人人看人人爰人人操| 东北女人无套内谢视频| 久久亚洲欧美一区二区三区-亚洲国产精品第一区二区 | 91亚洲人| 中文字幕精品三级久久久| 久草精品国产蜜臀| 伊人综合色网| 97在线精品| 国产精品无码AV网站| 九色精品视频导航1| 国产精品不卡av免费在线观看| 欧美热图99| 亚洲图片欧美另类综合免费视频大大香| 黄总AV色图| 67194无码不卡| 一本一道人妻久久一区二区三区 | 久久本道| 人妻少妇久久久| JULIA一区二区三区在线播放| www.av在线视频| 亚洲色图尤物视频| 日日干天天干夜夜爽| 少妇久久久| 欧美日韩中文视频播放| 99热婷婷一区二区三| 91蜜臀人妻中文字幕在线| 天天在线91| 久久久久幕乱码| 久久久久久少妇| 97精品在线| 麻豆黄站| 我想要啊 啊 啊| 哑洲在线| 天天影视综合色| 成人草草视频| 日韩黄色电影网站| 久操视频资源站公开| 欧美日韩国产中文精品字幕自在自线| 国产欧美精选激情视频| 日韩欧美tv一区二区在线观看| 18禁免费视频| 亚洲高清无码在线桃色| 亚洲情色中文字幕一区| 午夜精品探花| 久热9| 色九九九九久| 精品久久久久9999| 久久AV无码1区2区3区| 欧美伦乱爱| 夜夜嗨免费视频| 麻豆av一区二区| 国产精品视频内谢女人|