主頁 >  其他 > FPAG學習筆記——I2C介面實作

FPAG學習筆記——I2C介面實作

2021-11-11 09:11:26 其他

一、I2C總線介紹

??I2C總線是由Philips公司開發的一種簡單、雙向二線制同步串行總線,它只需要兩根線即可在連接于總線上的器件之間傳送資訊,

??主器件用于啟動總線傳送資料,并產生時鐘以開放傳送的器件,此時任何被尋址的器件均被認為是從器件.在總線上主和從、發和收的關系不是恒定的,而取決于此時資料傳送方向,如果主機要發送資料給從器件,則主機首先尋址從器件,然后主動發送資料至從器件,最后由主機終止資料傳送;如果主機要接收從器件的資料,首先由主器件尋址從器件.然后主機接收從器件發送的資料,最后由主機終止接收程序,在這種情況下.主機負責產生定時時鐘和終止資料傳送,

??I2C總線是公認的世界標準,由50多家公司生產超過1000個不同的地方實施的集成電路,此外,通用的i2c總線用于各種控制體系結構,如系統管理總線(SMBus),電源管理總線(PMBus),智能平臺管理介面(IPMI),顯示幕資料通道(DDC)和高級電信計算架構(ATCA),

??I2C總線的原理和細節參考這篇文章,感謝作者的整理,受益匪淺,

二、I2C總線協議

  1. 串行資料線(SDA)和串行時鐘線(SCL)
    ??SDA和SCL都是雙向的線路,通過電流源或上拉電阻連接到一個正的供應電壓,連接到總線的設備的輸出級必須有一個開路漏極或開路集電極來執行線和功能,I2C-bus上的資料可以在標準模式下以高達100kbit /s的速率傳輸,在快速模式下以高達400kbit /s的速率傳輸,在快速模式+下為1 Mbit/s,在高速模式下最高為3.4 Mbit/s,總線電容限制連接到總線的介面數量,

  2. 資料有效性
    ??SDA線上的資料必須在SCL時鐘線時鐘高電平期間保持穩定,在時鐘低電平期間改變(見下圖),因此我們在設計信號時,最佳情況就是在時鐘線SCL為低電平中間時SDA資料線上的資料改變,在時鐘高電平中間時獲取SDA資料線上的資料,

  3. 起始和終止位
    ??所有資料的傳輸都以START ( S )開始,以STOP ( P )結束(見下圖),
    ??I2C總線空閑:SDA和SCL均為高電平;
    ??I2C協議起始位:SCL為高電平時,SDA出現下降沿;
    ??I2C協議終止位:SCL為高電平時,SDA出現上升沿,
    ??啟動和停止條件總是由主設備生成,在啟動條件后,總線被認為是忙碌的,該總線在停止條件后的某一段時間內再次空閑,如果生成了重復啟動(Sr)而不是停止條件,則總線將保持忙碌狀態,在這方面,啟動(S)和重復啟動(Sr)條件在功能上是相同的,

  4. 傳輸1位元組格式
    ??在SDA資料線上傳輸的每個位元組長度必須是8位,每次傳輸可以傳輸的位元組數是不受限制的,每個位元組后面必須跟著一個應答位(ACK),資料從位元組最高位(MSB)開始傳輸(見下圖),如果一個從設備無法接識訓發送另一個完整的位元組的資料,直到執行一些其他功能,例如服務內部中斷,它可以維持時鐘線scl為低強迫主設備進入等待狀態,當從設備準備好另一個位元組的資料后繼續傳輸資料并釋放時鐘線SCL,

  5. 應答(ACK)與非應答(NACK)
    ??應答發生在每個位元組之后,應答位回應,表明該位元組已成功接收,并且可以發送另一個位元組,主設備產生所有時鐘脈沖,包括確認位第九個時鐘脈沖,應答信號定義如下:在回應時鐘脈沖期間,發射機釋放SDA線,接識訓可以把SDA線拉低,,并且在時鐘高電平期間穩定保持低電平,
    ??當SDA在第9個時鐘脈沖期間保持高時,這被定義為非應答信號,然后,主設備可以生成終止傳輸 的停止條件,或者生成啟動新傳輸的重復啟動條件,NACK的產生有五個條件:

??- 總線上沒有帶有所傳輸地址的接收者,因此沒有設備以應答,
??- 接收器無法接識訓發送,因為它正在執行一些實時功能,并沒有準備好開始與主控通信,
??- 在傳輸程序中,接收方獲取它不理解的資料或命令,
??- 在傳輸程序中,接收器無法接收到更多的資料位元組,
??- 主控接識訓必須將傳輸結束的信號發送給從發射機,

  1. 從設備器件地址和讀寫位
    ??從設備地址是I2C協議在傳輸資料時對總線上設備尋址的依據,資料傳輸遵循下圖所示的格式,在啟動條件之后,發送一個從設備器件地址,這個地址有7位長,后面跟著一個資料方向位(R/W)——“0”表示傳輸(寫),“1”表示對資料的請求(讀)(參見下2圖),資料傳輸總是以主設備產生的停止條件§結束,然而,如果一個主人仍然希望在總線上通信,它可以產生一個重復的開始條件(Sr)和地址而不用再產生一個停止條件,

??從設備器件地址通常是由固定為和可變位組合而成的,所謂固定位就是器件本就確定無法更改的,認為不能讓控制的的,而可變位通常是器件的硬體,可供用戶進行硬體連接,按照用戶的硬體連接確定,例如下圖中7位器件地址中,前四位1010是出廠時就已經固定了的,而后三位是器件硬體引腳可供用戶改變的,

??對不同的器件,I2C傳輸格式略有不同,對于存盤設備,還具有存盤器的地址號,在主設備發送器件地址,從設備存盤器回應后,主設備要再發8或16位存盤器地址資料,來選擇存盤器的地址,等待從設備回應后,主設備在發送資料到存盤器地址或從存盤器地址讀取資料,

三、代碼實作

??I2C介面具有嚴格的讀寫時序,包括寫資料時序讀資料時序連續寫資料以及連續讀時序,本次實驗僅實作寫資料時序讀資料時序,I2C資料傳輸都是高位優先

圖1.寫資料時序

圖2.讀資料時序

??根據I2C的讀寫時序圖,我們可以發現,讀寫時序傳輸順序:

  1. 首先,主設備在SCL為高電平時拉低SDA,產生一個起始信號
  2. 主設備發送從設備地址位(R/W位為0,寫入),在之后的一個時鐘周期,主設備釋放SDA總線的控制,從設備將SDA拉低,產生一個應答位(ACK)
  3. 主設備發送要寫入或讀取的暫存器地址位,在之后的一個時鐘周期,主設備釋放SDA總線的控制,從設備將SDA拉低,產生一個應答位(ACK)
  4. (寫入資料時) 主設備發送要寫入的資料,在之后的一個時鐘周期,主設備釋放SDA總線的控制,從設備將SDA拉低,產生一個應答位(ACK)
  5. (讀取資料時) 主設備再次產生一個起始信號(這里非常重要!),然后再次發送從設備地址位(R/W位為1,讀取),主設備釋放SDA總線控制,從設備產生應答位,然后從設備發送資料,主設備不產生應答位
  6. 最后,主設備在SCL高電平期間,拉高SDA,產生一個結束信號

??所以可以據此畫出狀態機圖

圖3.狀態機

廢話不多說,上代碼:


module IICModule(
    input  CLK,         // 50MHz時鐘頻率
    input reset,
    input start,        // 啟動信號,注意!!!啟動信號高電平持續時間最好在一個scl高/低周期左右,不可以很長
	input WR_OR_RE,		// 讀/寫控制,0=寫,1=讀
    input [6:0]DeviecAddr,   // 從設備器件地址,7bit
	input [7:0] RegisterAddr,  	// 暫存器地址
    input [7:0] WriteData,     // 要寫入的資料
    
	output reg scl,
    inout  sda,
    output reg done,
	output reg [7:0] readData	// 從從設備讀取的8bit資料
);
parameter CLK_FREQ = 50_000_000 , SCL_FREQ = 100_000;   // SCL的頻率設定為100kHz
localparam SCL_CNT = CLK_FREQ/(2*SCL_FREQ);     // 為使signalTap能夠觀察足夠長的視窗時間,我提高了頻率,實際不需要除2

// 狀態機的狀態標識
parameter IDLE =4'd0 ,START =4'd1 ,WR_ADDR =4'd2 ,WR_REGISTER =4'd3 , WR_DATA =4'd4 ,RE_START =4'd5 ,RE_ADDR =4'd6 ,RE_DATA =4'd7 ,STOP =4'd8 ;
reg [7:0] state = IDLE , next_state = IDLE;

// 設備地址
// parameter DeviecAddr = 7'b0011101;
reg [7:0] DeviecAddr_wr;
reg [7:0] DeviecAddr_re;

always@(*)begin
	DeviecAddr_wr = {DeviecAddr , 1'b0};
	DeviecAddr_re = {DeviecAddr , 1'b1};
end

// scl & scl_cnt ---- 50MHz時鐘生成100kHzscl時鐘
reg [7:0] scl_cnt;
always@(posedge CLK)begin
    if(reset)begin
        scl <= 1'b1;
        scl_cnt <= 8'd0;
    end
    else begin
        if(scl_cnt == (SCL_CNT/2-1))begin
            scl <= ~scl;
            scl_cnt <= 8'd0;
        end
        else begin
            scl_cnt <= scl_cnt + 1'b1;
        end
    end
end

// scl_midHigh ---- 當處于scl高電平段的中間時,置1
reg scl_midHigh;
always@(posedge CLK)begin
    if(reset)begin
        scl_midHigh <= 1'b0;
    end
    else begin
        if((scl_cnt == (SCL_CNT/4-1)) & (scl == 1'b1))begin
            scl_midHigh <= 1'b1;
        end
        else begin
            scl_midHigh <= 1'b0;
        end
    end
end


// scl_midLow ---- 當處于scl低電平段的中間時,置1
reg scl_midLow;
always@(posedge CLK)begin
    if(reset)begin
        scl_midLow <= 1'b0;
    end
    else begin
        if((scl_cnt == (SCL_CNT/4-1)) & (scl == 1'b0))begin
            scl_midLow <= 1'b1;
        end
        else begin
            scl_midLow <= 1'b0;
        end
    end
end

// bit_cnt ---- 寫器件地址、暫存器、資料等都是一位元組(8bit)
// 在scl_midLow和scl_midHigh時均計數(8bit資料位 + 1bit應答位,所以計數范圍為0~17)
reg [4:0] bit_cnt;
always@(posedge CLK)begin
    if(reset)begin
        bit_cnt <= 5'd0;
    end
    else begin
        case(state)
        IDLE:               bit_cnt <= 5'd0;
        START:              bit_cnt <= 5'd0;
        WR_ADDR:            begin
                                if(scl_midHigh | scl_midLow)begin
                                    bit_cnt <= (bit_cnt == 5'd17 & scl_midLow)?5'd0:(bit_cnt + 1'b1);
                                end
                                else begin
                                    bit_cnt <= bit_cnt + 1'b0;
                                end
                            end
        WR_REGISTER:        begin
                                if(scl_midHigh | scl_midLow)begin
                                    bit_cnt <= (bit_cnt == 5'd17 & scl_midLow)?5'd0:(bit_cnt + 1'b1);
                                end
                                else begin
                                    bit_cnt <= bit_cnt + 1'b0;
                                end
                            end
        WR_DATA:            begin
                                if(scl_midHigh | scl_midLow)begin
                                    bit_cnt <= (bit_cnt == 5'd17 & scl_midLow)?5'd0:(bit_cnt + 1'b1);
                                end
                                else begin
                                    bit_cnt <= bit_cnt + 1'b0;
                                end
                            end
        RE_START:           bit_cnt <= 5'd0;
        RE_ADDR:            begin
                                if(scl_midHigh | scl_midLow)begin
                                    bit_cnt <= (bit_cnt == 5'd17 & scl_midLow)?5'd0:(bit_cnt + 1'b1);
                                end
                                else begin
                                    bit_cnt <= bit_cnt + 1'b0;
                                end
                            end    
        RE_DATA:            begin
                                if(scl_midHigh | scl_midLow)begin
                                    bit_cnt <= (bit_cnt == 5'd17 & scl_midLow)?5'd0:(bit_cnt + 1'b1);
                                end
                                else begin
                                    bit_cnt <= bit_cnt + 1'b0;
                                end
                            end
        STOP:               bit_cnt <= 5'd0;  
        default:            bit_cnt <= 5'd0;
        endcase
    end
end

// link ---- 控制sda(inout信號)的控制權,link == 0 時從設備控制, link == 1 時主設備控制
reg link;
assign sda = link?sda_reg:1'bz;         //  1'bz表示由從設備控制資料總線
always@(posedge CLK)begin
    if(reset)begin
        link <= 1'b1;
    end
    else begin
        case(state)
        IDLE:               link <= 1'b1;          
        START:              link <= 1'b1;
        WR_ADDR:            begin
                                if(bit_cnt < 5'd16)begin
                                    link <= 1'b1;
                                end
                                else begin
                                    link <= 1'b0;
                                end
                            end
        WR_REGISTER:        begin
                                if(bit_cnt < 5'd16)begin
                                    link <= 1'b1;
                                end
                                else begin
                                    link <= 1'b0;
                                end
                            end
        WR_DATA:            begin
                                if(bit_cnt < 5'd16)begin
                                    link <= 1'b1;
                                end
                                else begin
                                    link <= 1'b0;
                                end
                            end
        RE_START:           link <= 1'b1;
        RE_ADDR:            begin
                                if(bit_cnt < 5'd16)begin
                                    link <= 1'b1;
                                end
                                else begin
                                    link <= 1'b0;
                                end
                            end
        RE_DATA:            begin
                                if(bit_cnt < 5'd16)begin
                                    link <= 1'b0;
                                end
                                else begin
                                    link <= 1'b1;       // 此時主設備不會產生應答信號,但是也要將控制權交給主設備
                                end
                            end
        STOP:               link <= 1'b1; 
        default:            link <= 1'b1; 
        endcase
    end
end

// ack ---- 當主設備發送8bit資料后,將sda控制權釋放,從設備將sda拉低產生應答位
reg ack;
always@(posedge CLK)begin
    if(reset)begin
        ack <= 1'd0;
    end
    else begin
        case(state)
        IDLE:               ack <= 1'd0;          
        START:              ack <= 1'd0;
        WR_ADDR:            begin
                                if(bit_cnt < 5'd16)begin
                                    ack <= 1'b0;
                                end
                                else if(bit_cnt == 5'd16 & scl_midHigh & ~sda)begin
                                    ack <= 1'b1;
                                end
										  else 
												ack <= ack + 1'b0;
                            end
        WR_REGISTER:        begin
                                if(bit_cnt < 5'd16)begin
                                    ack <= 1'b0;
                                end
                                else if(bit_cnt == 5'd16 & scl_midHigh & ~sda)begin
                                    ack <= 1'b1;
                                end
										  else 
												ack <= ack + 1'b0;
                            end
        WR_DATA:            begin
                                if(bit_cnt < 5'd16)begin
                                    ack <= 1'b0;
                                end
                                else if(bit_cnt == 5'd16 & scl_midHigh & ~sda)begin
                                    ack <= 1'b1;
                                end
										  else 
												ack <= ack + 1'b0;
                            end
        RE_START:           ack <= 1'b0;
        RE_ADDR:            begin
                                if(bit_cnt < 5'd16)begin
                                    ack <= 1'b0;
                                end
                                else if(bit_cnt == 5'd16 & scl_midHigh & ~sda)begin
                                    ack <= 1'b1;
                                end
										  else 
												ack <= ack + 1'b0;
                            end
        RE_DATA:            begin
                                if(bit_cnt < 5'd16)begin
                                    ack <= 1'b0;
                                end
                                else if(bit_cnt == 5'd16 & scl_midHigh & ~sda)begin
                                    ack <= 1'b1;
                                end
										  else 
												ack <= ack + 1'b0;
                            end
        STOP:               ack <= 1'b0;
        default:            ack <= 1'b0;
        endcase
    end
end

// sda_reg_cnt ----  8bit資料計數,用作資料陣列索引
reg [3:0] sda_reg_cnt;
always@(posedge CLK)begin
    if(reset)begin
        sda_reg_cnt <= 4'd7;
    end
    else begin
        case(state)
        IDLE:               sda_reg_cnt <= 4'd7;
        START:              sda_reg_cnt <= 4'd7;
        WR_ADDR:            begin
                                if(bit_cnt < 5'd16 & scl_midLow )begin
                                    sda_reg_cnt <= (sda_reg_cnt == 4'd0)?4'd7:(sda_reg_cnt - 1'b1);
                                end
                                else begin
                                    sda_reg_cnt <= sda_reg_cnt + 1'b0;
                                end
                            end
        WR_REGISTER:        begin
                                if(bit_cnt < 5'd16 & scl_midLow )begin
                                    sda_reg_cnt <= (sda_reg_cnt == 4'd0)?4'd7:(sda_reg_cnt - 1'b1);
                                end
                                else begin
                                    sda_reg_cnt <= sda_reg_cnt + 1'b0;
                                end
                            end
        WR_DATA:            begin
                                if(bit_cnt < 5'd16 & scl_midLow )begin
                                    sda_reg_cnt <= (sda_reg_cnt == 4'd0)?4'd7:(sda_reg_cnt - 1'b1);
                                end
                                else begin
                                    sda_reg_cnt <= sda_reg_cnt + 1'b0;
                                end
                            end
        RE_START:           sda_reg_cnt <= 4'd7;
        RE_ADDR:            begin
                                if(bit_cnt < 5'd16 & scl_midLow )begin
                                    sda_reg_cnt <= (sda_reg_cnt == 4'd0)?4'd7:(sda_reg_cnt - 1'b1);
                                end
                                else begin
                                    sda_reg_cnt <= sda_reg_cnt + 1'b0;
                                end
                            end
        RE_DATA:            sda_reg_cnt <= 4'd7;
        STOP:               sda_reg_cnt <= 4'd7;
        default:            sda_reg_cnt <= 4'd7;
        endcase
    end
end

// sda_reg ---- 在不同state時sda輸出不同的值,使用sda_reg來控制
reg sda_reg;
always@(posedge CLK)begin
    if(reset)begin
        sda_reg <= 1'b1;
    end
    else begin
        case(state)
        IDLE:               sda_reg <= 1'b1;
        START:              sda_reg <= 1'b0;
        WR_ADDR:            begin
                                if(bit_cnt < 5'd16)begin
                                    sda_reg <= DeviecAddr_wr[sda_reg_cnt];
                                end
                                else begin
                                    sda_reg <= 1'b1;        
                                end
                            end
        WR_REGISTER:        begin
                                if(bit_cnt < 5'd16)begin
                                    sda_reg <= RegisterAddr[sda_reg_cnt];
                                end
                                else begin
                                    sda_reg <= 1'b1;        //  這里sda_reg <= 1'b1是為了state==RE_START時方便產生start信號
                                end
                            end
									 
        WR_DATA:            begin
                                if(bit_cnt < 5'd16)begin
                                    sda_reg <= WriteData[sda_reg_cnt];
                                end
                                else begin
                                    sda_reg <= 1'b0;        //  這里sda_reg <= 1'b0是為了state==STOP時方便產生stop信號
                                end
                            end
        RE_START:           begin
                                if(scl_midHigh & scl)begin
                                    sda_reg <= 1'b0;
                                end
                                else begin
                                    sda_reg <= sda_reg;
                                end
                            end
        RE_ADDR:            sda_reg <= DeviecAddr_re[sda_reg_cnt];
        RE_DATA:            sda_reg <= 1'b0;        //  這里sda_reg <= 1'b0是為了state==STOP時方便產生stop信號
        STOP:               begin                   //  產生stop信號
                                if(scl_midHigh & scl)
                                    sda_reg <= 1'b1;
                                else
                                    sda_reg <= sda_reg + 1'b0;
                            end
        default:            sda_reg <= 1'b1;
        endcase
    end
end

// readData ---- 存盤從設備發回的資料
always@(posedge CLK)begin
    if(reset)begin
        readData <= 8'd0;
    end
    else begin
        case(state)
            RE_DATA:            begin
                                    if(bit_cnt < 5'd16 & scl_midHigh)begin
                                        readData <= {readData[6:0],sda}; 
													 //readData[sda_reg_cnt] <= sda;
                                    end
                                    else begin
                                        readData <= readData + 1'b0;
                                    end
                                end
            default:            readData <= readData + 1'b0;
        endcase
    end
end

// done ---- 一次讀/寫資料完成后置1
always@(posedge CLK)begin
    if(reset)begin
        done <= 1'b0;
    end
    else begin
        if(state == STOP)
            done <= 1'b1;
        else
            done <= 1'b0;
    end
end




// 狀態機第一段
always@(posedge CLK)begin
    if(reset)begin
        state <= IDLE;
    end
    else begin
        state <= next_state;
    end
end


// 狀態機第二段
always@(*)begin
    case(state)
        IDLE:               next_state = (start&scl)?START:IDLE;
        START:              next_state = (scl_midLow&~scl)?WR_ADDR:START;
        WR_ADDR:            begin
                                if(bit_cnt == 5'd17 && scl_midLow && ack)
                                    next_state = WR_REGISTER;
                                else if(bit_cnt == 5'd17 && scl_midLow && ~ack)
                                    next_state = IDLE;
                                else 
                                    next_state = WR_ADDR;
                            end
        WR_REGISTER:        begin
                                if(bit_cnt == 5'd17 && scl_midLow && ack)begin
                                    next_state = WR_OR_RE?RE_START:WR_DATA;
                                end    
                                else if(bit_cnt == 5'd17 && scl_midLow && ~ack)
                                    next_state = IDLE;
                                else 
                                    next_state = WR_REGISTER;
                            end        
        WR_DATA:            begin
                                if(bit_cnt == 5'd17 && scl_midLow && ack)
                                    next_state = STOP;
                                else if(bit_cnt == 5'd17 && scl_midLow && ~ack)
                                    next_state = IDLE;
                                else 
                                    next_state = WR_DATA;
                            end 
        RE_START:           begin
                                if(scl_midLow & ~scl)begin
                                    next_state = RE_ADDR;
                                end
                                else begin
                                    next_state = RE_START;
                                end
                            end
        RE_ADDR:            begin
                                if(bit_cnt == 5'd17 && scl_midLow && ack)
                                    next_state = RE_DATA;
                                else if(bit_cnt == 5'd17 && scl_midLow && ~ack)
                                    next_state = IDLE;
                                else 
                                    next_state = RE_ADDR;
                            end 
        RE_DATA:            begin
                                if(bit_cnt == 5'd17 && scl_midLow )
                                    next_state = STOP;
                                else 
                                    next_state = RE_DATA;
                            end 
        STOP:               begin
                                if(scl_midLow & ~scl)
                                    next_state = IDLE;
                                else
                                    next_state = STOP;
                            end
        default:            next_state = IDLE;
    endcase
end

endmodule

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/355402.html

標籤:其他

上一篇:Linux——Linux驅動之設備樹編譯環境搭建實踐總結(設備樹、uboot、內核編譯及鏡像燒寫)

下一篇:自己畫一塊ESP32-C3 的開發板(第一次使用立創EDA)(更新中...)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more