fpga的spi的编程_UASP协议
寫在前面
SPI協(xié)議系列文章:
FPGA實現(xiàn)的SPI協(xié)議(一)—-SPI驅(qū)動
FPGA實現(xiàn)的SPI協(xié)議(二)—-基于SPI接口的FLASH芯片M25P16的使用
1、什么是SPI協(xié)議
SPI(Serial Peripheral Interface,串行外圍設(shè)備接口)通訊協(xié)議,是 Motorola 公司提出的一種同步串行接口技術(shù),是一種高速、全雙工、同步通信總線,在芯片中只占用四根管腳用來控制及數(shù)據(jù)傳輸,廣泛用于 EEPROM、Flash、RTC(實時時鐘)、ADC(數(shù)模轉(zhuǎn)換 器)、DSP(數(shù)字信號處理器)以及數(shù)字信號解碼器上,是常用的、重要的低速通訊協(xié)議之一。
SPI 通訊協(xié)議的優(yōu)點是支持全雙工通信,通訊方式較為簡單,且相對數(shù)據(jù)傳輸速率較快;缺點是沒有指定的流控制,沒有應(yīng)答機(jī)制,在數(shù)據(jù)可靠性上有一定缺陷。
2、SPI協(xié)議詳述
2.1、SPI協(xié)議物理層
SPI 通訊設(shè)備的通訊模式是主從通訊模式,通訊雙方有主從之分,根據(jù)從機(jī)設(shè)備的數(shù)量,SPI 通訊設(shè)備之間的連接方式可分為一主一從和一主多從。
SPI總線傳輸只需要4根線就能完成,這四根線的作用分別如下:
- SCK (Serial Clock):時鐘信號線,用于同步通訊數(shù)據(jù)。由通訊主機(jī)產(chǎn)生,決定了通訊的速率,不同的設(shè)備支持的最高時鐘頻率不同
- MOSI (Master Output, Slave Input):主設(shè)備輸出/從設(shè)備輸入引腳。主機(jī)的數(shù)據(jù)從這條信號線輸出,從機(jī)由這條信號線讀入主機(jī)發(fā)送的數(shù)據(jù),數(shù)據(jù)方向由主機(jī)到從機(jī)
- MISO (Master Input,Slave Output):主設(shè)備輸入/從設(shè)備輸出引腳。主機(jī)從這條信號線讀入數(shù)據(jù),從機(jī)的數(shù)據(jù)由這條信號線輸出到主機(jī),數(shù)據(jù)方向由從機(jī)到主機(jī)
- CS(Chip Select):片選信號線。當(dāng)有多個 SPI 從 設(shè)備與 SPI 主機(jī)相連時,設(shè)備的其它信號線 SCK、MOSI 及 MISO 同時并聯(lián)到相同的 SPI 總線上,即無論有多少個從設(shè)備,都共同使用這 3 條總線;而每個從設(shè)備都有獨立的片選信號線,即有多少個從設(shè)備,就有多少條片選信號線。相當(dāng)于由SPI構(gòu)成的通信系統(tǒng)中,通過CS片選信號來決定通信的從機(jī)設(shè)備是哪一臺。通信期間低電平有效,表示對應(yīng)從機(jī)被選中
2.2、SPI 協(xié)議層
SPI總線傳輸一共有4種模式,這4種模式分別由時鐘極性(CPOL,Clock Polarity)和時鐘相位(CPHA,Clock Phase)來定義,其中CPOL參數(shù)規(guī)定了SCK時鐘信號空閑狀態(tài)的電平,CPHA規(guī)定了數(shù)據(jù)是在SCK時鐘的上升沿被采樣還是下降沿被采樣。
SPI總線的極性–時鐘極性
時鐘極性決定SPI總線空閑時的時鐘信號是高電平還是低電平。CPOL = 1:表示空閑時是高電平;CPOL = 0:表示空閑時是低電平。
SPI總線的相位–時鐘相位
時鐘相位決定SPI總線從哪個跳變沿開始采樣數(shù)據(jù)。CPHA = 0:在時鐘信號SCK的第1個跳變沿采樣;CPHA = 1:在時鐘信號SCK的第2個跳變沿采樣。
這四種模式的時序圖如下圖所示:
- 模式0:CPOL= 0,CPHA=0。SCK串行時鐘線空閑是為低電平,數(shù)據(jù)在SCK時鐘的上升沿被采樣,數(shù)據(jù)在SCK時鐘的下降沿切換
- 模式1:CPOL= 0,CPHA=1。SCK串行時鐘線空閑是為低電平,數(shù)據(jù)在SCK時鐘的下降沿被采樣,數(shù)據(jù)在SCK時鐘的上升沿切換
- 模式2:CPOL= 1,CPHA=0。SCK串行時鐘線空閑是為高電平,數(shù)據(jù)在SCK時鐘的下降沿被采樣,數(shù)據(jù)在SCK時鐘的上升沿切換
- 模式3:CPOL= 1,CPHA=1。SCK串行時鐘線空閑是為高電平,數(shù)據(jù)在SCK時鐘的上升沿被采樣,數(shù)據(jù)在SCK時鐘的下降沿切換
經(jīng)常用到的是模式0和模式3(畢竟在下降沿采集數(shù)據(jù)的還是少)。下圖描述了4種模式數(shù)據(jù)線MOSI和MISO的數(shù)據(jù)切換(Toggling)位置和數(shù)據(jù)采樣位置的關(guān)系。
2.3、SPI協(xié)議通信過程
下面以模式 0 為例,講解一下 SPI 基本的通訊過程:
SCK、MOSI、CS_N 信號均由主機(jī)控制產(chǎn)生, SCK 是時鐘信號,用以同步數(shù)據(jù),MOSI 是主機(jī)輸出從機(jī)輸入信號,主機(jī)通過此信號線傳輸數(shù)據(jù)給從機(jī),CS_N 為片選信號,用以選定從機(jī)設(shè)備,低電平有效;而 MISO 的信號由 從機(jī)產(chǎn)生,主機(jī)通過該信號線讀取從機(jī)的數(shù)據(jù)。MOSI 與 MISO 的信號只在 CS_N 為低電平的時候才有效,在 SCK 的每個時鐘周期 MOSI 和 MISO 傳輸一位數(shù)據(jù)。
在圖中的標(biāo)號1處,CS_N 信號線由高變低,是 SPI 通訊的起始信號。CS_N 是每 個從機(jī)各自獨占的信號線,當(dāng)從機(jī)在自己的 CS_N 線檢測到起始信號后,就知道自己被主 機(jī)選中了,開始準(zhǔn)備與主機(jī)通訊。在圖中的標(biāo)號6處,CS_N 信號由低變高,是 SPI 通訊的停止信號,表示本次通訊結(jié)束,從機(jī)的選中狀態(tài)被取消。
SPI 使用 MOSI 及 MISO 信號線來傳輸數(shù)據(jù),使用 SCK 信號線進(jìn)行數(shù)據(jù)同步。MOSI 及 MISO 數(shù)據(jù)線在 SCK 的每個時鐘周期傳輸一位數(shù)據(jù),且數(shù)據(jù)輸入輸出是同時進(jìn)行的。數(shù)據(jù)傳輸時,MSB 先行或 LSB 先行并沒有作硬性規(guī)定,但要保證兩個 SPI 通訊設(shè)備之間使用同樣的協(xié)定,一般都會采用MSB 先行模式。 MOSI 及 MISO 的數(shù)據(jù)在 SCK 的下降沿期間變化輸出, 在 SCK 的上升沿時被采樣。即在 SCK 的上升沿時刻,MOSI 及 MISO 的數(shù)據(jù)有效,高電平時表示數(shù)據(jù)“1”,為低電平時表示數(shù)據(jù)“0”。在其它時刻,數(shù)據(jù)無效,MOSI 及 MISO 為下一次表示數(shù)據(jù)做準(zhǔn)備。
SPI 每次數(shù)據(jù)傳輸可以 8 位或 16 位為單位,每次傳輸?shù)膯挝粩?shù)不受限制。
2.4、SPI協(xié)議的特性
- SPI協(xié)議是一主多從的架構(gòu),通過片選信號CS來區(qū)分不同的從機(jī)(尋址方式)
- SPI協(xié)議是一種同步(Synchronous)傳輸協(xié)議,通信雙方通過主機(jī)生成的時鐘信號SCK來作為數(shù)據(jù)交換的基準(zhǔn)信號
- SPI協(xié)議是一種全雙工的串行通信協(xié)議,通信過程中主從雙方均可進(jìn)行數(shù)據(jù)交換
- SPI協(xié)議具有4中通信模式,依據(jù)雙方約定好的模式進(jìn)行通信
2.5、SPI協(xié)議的優(yōu)勢、劣勢
優(yōu)勢:
- 全雙工串行通信
- 簡單的硬件結(jié)構(gòu)
- 高速數(shù)據(jù)傳輸速率(相比UART、IIC)
- 靈活的數(shù)據(jù)傳輸方式,不限于8位,可以是任意大小的字
劣勢:
- 僅支持一個主設(shè)備
- 引腳略多(相比UART、IIC)
- 沒有硬件從機(jī)應(yīng)答信號(主機(jī)可能在不知情的情況下無處發(fā)送)
3、驅(qū)動代碼的設(shè)計實現(xiàn)
接下來實現(xiàn)的SPI驅(qū)動代碼特性如下:MSB 先行;僅限模式0;每次傳輸8位(1個BYTE)。
3.1、接口定義與整體設(shè)計
SPI驅(qū)動的整體框圖、輸入輸出信號如下所示:
其中信號描述如下:
該模塊的使用方法如下:
- 拉高SPI傳輸開始信號spi_start一個周期,同時發(fā)送要傳輸?shù)臄?shù)據(jù)給data_send,等待數(shù)據(jù)發(fā)送完成后,該模塊會將發(fā)送完成標(biāo)志信號send_done拉高一個周期,標(biāo)志一個BYTE的數(shù)據(jù)通過SPI總線發(fā)送給了從機(jī)
- 同樣的,當(dāng)接收完成標(biāo)志信號rec_done被該模塊拉高后,則意味著,主機(jī)成功接收了一個BTYE從機(jī)發(fā)送過來的數(shù)據(jù)
- 當(dāng)主機(jī)希望結(jié)束這次傳輸時,可將SPI結(jié)束信號spi_end拉高一個周期,則該模塊會在發(fā)送最后一個模塊后結(jié)束SPI傳輸,這也意味著,如果沒有結(jié)束到SPI結(jié)束信號,則SPI傳輸會一直進(jìn)行,以便實現(xiàn)多個BYTE的SPI傳輸
3.2、Verilog代碼
Verilog代碼并不復(fù)雜,結(jié)合下圖的SPI通信過程,可以發(fā)現(xiàn)以下要點:
- SCK很適合使用系統(tǒng)時鐘的4分頻時鐘,因為在一個SCK內(nèi)需要對其進(jìn)行4次操作
- 分別使用生成的SCK的上升沿、下降沿對其移位發(fā)送數(shù)據(jù)、接收數(shù)據(jù)即可
- 此外從下圖可知,SPI的驅(qū)動非常適合使用狀態(tài)機(jī)編寫,有興趣可以自己嘗試一下
`timescale 1ns/1ns //時間單位/精度
// 模式0
module spi_drive
(
// 系統(tǒng)接口
input sys_clk , // 全局時鐘50MHz
input sys_rst_n , // 復(fù)位信號,低電平有效
// 用戶接口
input spi_start , // 發(fā)送傳輸開始信號,一個高電平
input spi_end , // 發(fā)送傳輸結(jié)束信號,一個高電平
input [7:0] data_send , // 要發(fā)送的數(shù)據(jù)
output reg [7:0] data_rec , // 接收到的數(shù)據(jù)
output reg send_done , // 主機(jī)發(fā)送一個字節(jié)完畢標(biāo)志位
output reg rec_done , // 主機(jī)接收一個字節(jié)完畢標(biāo)志位
// SPI物理接口
input spi_miso , // SPI串行輸入,用來接收從機(jī)的數(shù)據(jù)
output reg spi_sclk , // SPI時鐘
output reg spi_cs , // SPI片選信號,低電平有效
output reg spi_mosi // SPI輸出,用來給從機(jī)發(fā)送數(shù)據(jù)
);
reg [1:0] cnt; //4分頻計數(shù)器
reg [3:0] bit_cnt_send; //發(fā)送計數(shù)器
reg [3:0] bit_cnt_rec; //接收計數(shù)器
reg spi_end_req; //結(jié)束請求
//4分頻計數(shù)器
always @(posedge sys_clk or negedge sys_rst_n)begin
if(!sys_rst_n)
cnt <= 2'd0;
else if(!spi_cs)begin
if(cnt == 2'd3)
cnt <= 2'd0;
else
cnt <= cnt + 1'b1;
end
else
cnt <= 2'd0;
end
// 生成spi_sclk時鐘
always @(posedge sys_clk or negedge sys_rst_n)begin
if(!sys_rst_n)
spi_sclk <= 1'b0; //模式0默認(rèn)為低電平
else if(!spi_cs)begin //在SPI傳輸過程中
if(cnt == 2'd0 )
spi_sclk <= 1'b0;
else if (cnt == 2'd2)
spi_sclk <= 1'b1;
else
spi_sclk <= spi_sclk;
end
else
spi_sclk <= 1'b0; //模式0默認(rèn)為低電平
end
// 生成片選信號spi_cs
always @(posedge sys_clk or negedge sys_rst_n)begin
if(!sys_rst_n)
spi_cs <= 1'b1; //默認(rèn)為高電平
else if(spi_start) //開始SPI準(zhǔn)備傳輸,拉低片選信號
spi_cs <= 1'b0;
//收到了SPI結(jié)束信號,且結(jié)束了最近的一個BYTE
else if(spi_end_req && (cnt == 2'd1 && bit_cnt_rec == 4'd0))
spi_cs <= 1'b1; //拉高片選信號,結(jié)束SPI傳輸
end
// 生成結(jié)束請求信號(捕捉spi_end信號)
always @(posedge sys_clk or negedge sys_rst_n)begin
if(!sys_rst_n)
spi_end_req <= 1'b0; //默認(rèn)不使能
else if(spi_cs)
spi_end_req <= 1'b0; //結(jié)束SPI傳輸后拉低請求
else if(spi_end)
spi_end_req <= 1'b1; //接收到SPI結(jié)束信號后就把結(jié)束請求拉高
end
// 發(fā)送數(shù)據(jù)過程--------------------------------------------------------------------
// 發(fā)送數(shù)據(jù)
always @(posedge sys_clk or negedge sys_rst_n)begin
if(!sys_rst_n)begin
spi_mosi <= 1'b0; //模式0空閑
bit_cnt_send <= 4'd0;
end
else if(cnt == 2'd0 && !spi_cs)begin //模式0的上升沿
spi_mosi <= data_send[7-bit_cnt_send]; //發(fā)送數(shù)據(jù)移位
if(bit_cnt_send == 4'd7) //發(fā)送完8bit
bit_cnt_send <= 4'd0;
else
bit_cnt_send <= bit_cnt_send + 1'b1;
end
else if(spi_cs)begin //非傳輸時間段
spi_mosi <= 1'b0; //模式0空閑
bit_cnt_send <= 4'd0;
end
else begin
spi_mosi <= spi_mosi;
bit_cnt_send <= bit_cnt_send;
end
end
// 發(fā)送數(shù)據(jù)標(biāo)志
always @(posedge sys_clk or negedge sys_rst_n)begin
if(!sys_rst_n)
send_done <= 1'b0;
else if(cnt == 2'd0 && bit_cnt_send == 4'd7) //發(fā)送完了8bit數(shù)據(jù)
send_done <= 1'b1; //拉高一個周期,表示發(fā)送完成
else
send_done <= 1'b0;
end
// 接收數(shù)據(jù)過程--------------------------------------------------------------------
// 接收數(shù)據(jù)spi_miso
always @(posedge sys_clk or negedge sys_rst_n)begin
if(!sys_rst_n)begin
data_rec <= 8'd0;
bit_cnt_rec <= 4'd0;
end
else if(cnt == 2'd2 && !spi_cs)begin //模式0的上升沿
data_rec[7-bit_cnt_rec] <= spi_miso; //移位接收
if(bit_cnt_rec == 4'd7) //接收完了8bit
bit_cnt_rec <= 4'd0;
else
bit_cnt_rec <= bit_cnt_rec + 1'b1;
end
else if(spi_cs)begin
bit_cnt_rec <= 4'd0;
end
else begin
data_rec <= data_rec;
bit_cnt_rec <= bit_cnt_rec;
end
end
// 接收數(shù)據(jù)標(biāo)志
always @(posedge sys_clk or negedge sys_rst_n)begin
if(!sys_rst_n)
rec_done <= 1'b0;
else if(cnt == 2'd2 && bit_cnt_rec == 4'd7) //接收完了8bit
rec_done <= 1'b1; //拉高一個周期,表示接收完成
else
rec_done <= 1'b0;
end
endmodule
4、Testbench及仿真結(jié)果
4.1、單個BYTE的仿真
使用該SPI驅(qū)動,向從機(jī)發(fā)送單個BYTE數(shù)據(jù)8‘b01010101,觀察其仿真時序是否正確:
//------------------------------------------------
//--SPI驅(qū)動仿真(模式0,1個BYTE)
//------------------------------------------------
`timescale 1ns/1ns //時間單位/精度
//------------<模塊及端口聲明>----------------------------------------
module tb_spi_drive();
//系統(tǒng)接口
reg sys_clk ; // 全局時鐘50MHz
reg sys_rst_n ; // 復(fù)位信號,低電平有效
//用戶接口
reg spi_start ; // 發(fā)送傳輸開始信號,一個高電平
reg spi_end ; // 發(fā)送傳輸結(jié)束信號,一個高電平
reg [7:0] data_send ; // 要發(fā)送的數(shù)據(jù)
wire [7:0] data_rec ; // 接收到的數(shù)據(jù)
wire send_done ; // 主機(jī)發(fā)送一個字節(jié)完畢標(biāo)志位
wire rec_done ; // 主機(jī)接收一個字節(jié)完畢標(biāo)志位
//SPI物理接口
reg spi_miso ; // SPI串行輸入,用來接收從機(jī)的數(shù)據(jù)
wire spi_sclk ; // SPI時鐘
wire spi_cs ; // SPI片選信號
wire spi_mosi ; // SPI輸出,用來給從機(jī)發(fā)送數(shù)據(jù)
//仿真用
reg [3:0] cnt_send ; //發(fā)送數(shù)據(jù)計數(shù)器,0-15
//------------<例化SPI驅(qū)動模塊(模式0)>----------------------------------------
spi_drive spi_drive_inst(
.sys_clk (sys_clk ),
.sys_rst_n (sys_rst_n ),
.spi_start (spi_start ),
.spi_end (spi_end ),
.data_send (data_send ),
.data_rec (data_rec ),
.send_done (send_done ),
.rec_done (rec_done ),
.spi_miso (spi_miso ),
.spi_sclk (spi_sclk ),
.spi_cs (spi_cs ),
.spi_mosi (spi_mosi )
);
//------------<設(shè)置初始測試條件>----------------------------------------
initial begin
sys_clk = 1'b0; //初始時鐘為0
sys_rst_n <= 1'b0; //初始復(fù)位
spi_start <= 1'b0;
data_send <= 8'd0;
spi_miso <= 1'bz;
spi_end <= 1'b0;
#80 //80個時鐘周期后
sys_rst_n <= 1'b1; //拉高復(fù)位,系統(tǒng)進(jìn)入工作狀態(tài)
#30 //30個時鐘周期后拉高SPI開始信號,開始SPI傳輸
spi_start <= 1'b1;data_send <= 8'b01010101;
#20
spi_start <= 1'b0;
@(posedge send_done) //一個BYTE發(fā)送完成
spi_end <= 1'b1; #20 spi_end <= 1'b0; //拉高一個周期結(jié)束信號
end
//------------<設(shè)置時鐘>----------------------------------------------
always #10 sys_clk = ~sys_clk; //系統(tǒng)時鐘周期20ns
endmodule
仿真結(jié)果如下:
可以看到,在拉高了spi_start開始傳輸信號后,主機(jī)開始發(fā)送數(shù)據(jù),MOSI上的數(shù)據(jù)分別是01010101,發(fā)送完一個BYTE的數(shù)據(jù)后,send_done拉高。此時拉高結(jié)束信號spi_end,就終結(jié)了這次SPI傳輸,完成了單個BYTE的SPI傳輸。
4.2、多個BYTE的仿真
使用該SPI驅(qū)動,依次向從機(jī)發(fā)送數(shù)據(jù)8‘d0~8‘d10,觀察其仿真時序是否正確:
//------------------------------------------------
//--SPI驅(qū)動仿真(模式0)
//------------------------------------------------
`timescale 1ns/1ns //時間單位/精度
//------------<模塊及端口聲明>----------------------------------------
module tb_spi_drive();
//系統(tǒng)接口
reg sys_clk ; // 全局時鐘50MHz
reg sys_rst_n ; // 復(fù)位信號,低電平有效
//用戶接口
reg spi_start ; // 發(fā)送傳輸開始信號,一個高電平
reg spi_end ; // 發(fā)送傳輸結(jié)束信號,一個高電平
reg [7:0] data_send ; // 要發(fā)送的數(shù)據(jù)
wire [7:0] data_rec ; // 接收到的數(shù)據(jù)
wire send_done ; // 主機(jī)發(fā)送一個字節(jié)完畢標(biāo)志位
wire rec_done ; // 主機(jī)接收一個字節(jié)完畢標(biāo)志位
//SPI物理接口
reg spi_miso ; // SPI串行輸入,用來接收從機(jī)的數(shù)據(jù)
wire spi_sclk ; // SPI時鐘
wire spi_cs ; // SPI片選信號
wire spi_mosi ; // SPI輸出,用來給從機(jī)發(fā)送數(shù)據(jù)
//仿真用
reg [3:0] cnt_send ; //發(fā)送數(shù)據(jù)計數(shù)器,0-15
//------------<例化SPI驅(qū)動模塊(模式0)>----------------------------------------
spi_drive spi_drive_inst(
.sys_clk (sys_clk ),
.sys_rst_n (sys_rst_n ),
.spi_start (spi_start ),
.spi_end (spi_end ),
.data_send (data_send ),
.data_rec (data_rec ),
.send_done (send_done ),
.rec_done (rec_done ),
.spi_miso (spi_miso ),
.spi_sclk (spi_sclk ),
.spi_cs (spi_cs ),
.spi_mosi (spi_mosi )
);
//------------<設(shè)置初始測試條件>----------------------------------------
initial begin
sys_clk = 1'b0; //初始時鐘為0
sys_rst_n <= 1'b0; //初始復(fù)位
spi_start <= 1'b0;
data_send <= 8'd0;
spi_miso <= 1'bz;
spi_end <= 1'b0;
#80 //80個時鐘周期后
sys_rst_n <= 1'b1; //拉高復(fù)位,系統(tǒng)進(jìn)入工作狀態(tài)
#30 //30個時鐘周期后拉高SPI開始信號,開始SPI傳輸
spi_start <= 1'b1; #20 spi_start <= 1'b0;
end
always@(posedge sys_clk or negedge sys_rst_n)begin
if(!sys_rst_n)begin
data_send <= 8'd0;
spi_end <= 1'b0;
cnt_send <= 4'd0;
end
else if(send_done)begin //數(shù)據(jù)發(fā)送完成
if(cnt_send == 4'd10)begin
cnt_send <= 4'd0;
spi_end <= 1'b1; //拉高結(jié)束標(biāo)志,結(jié)束SPI傳輸過程
data_send <= 8'd0;
end
else begin
cnt_send <= cnt_send + 4'd1;
spi_end <= 1'b0;
data_send <= data_send + 4'd1; //發(fā)送數(shù)據(jù)累加
end
end
else begin
data_send <= data_send;
spi_end <= 1'b0; //其他時候保持SPI傳輸(不結(jié)束)
end
end
//------------<設(shè)置時鐘>----------------------------------------------
always #10 sys_clk = ~sys_clk; //系統(tǒng)時鐘周期20ns
endmodule
仿真結(jié)果如下:
可以看到,在拉高了spi_start開始傳輸信號后,主機(jī)一直在發(fā)送數(shù)據(jù),MOSI上的數(shù)據(jù)分別是8‘d0~8‘d10,每次發(fā)送一個BYTE的數(shù)據(jù)后,send_done即拉高一次。當(dāng)結(jié)束信號spi_end被拉高后,就終結(jié)了這次SPI傳輸。
5、其他
- 需要注意的是,由于沒有從機(jī)響應(yīng),所以MISO都是高阻態(tài)(藍(lán)色)
- 下篇文章再結(jié)合從機(jī)(FLASH芯片)進(jìn)行仿真驗證接收數(shù)據(jù)功能
- 想要整個工程的朋友可以在評論區(qū)留下郵箱
總結(jié)
以上是生活随笔為你收集整理的fpga的spi的编程_UASP协议的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SAP CRM get_children
- 下一篇: How to download BOM