spi 成功触发主机发送

This commit is contained in:
Ruige Lee
2025-05-13 10:31:35 +08:00
parent 20b94fbe44
commit 51f941a8a6
2 changed files with 23 additions and 16 deletions

View File

@@ -70,9 +70,9 @@ class SpiInterface extends Module{
// spiRegUp.io.enw := isSckPosedgeNext(1) & ~shiftCSn(1+1) & bitSel === 0.U & spiCmd === 1.U // spiRegUp.io.enw := isSckPosedgeNext(1) & ~shiftCSn(1+1) & bitSel === 0.U & spiCmd === 1.U
io.isEnR := isSckPosedgeNext(0) & bitSel === 0.U & byteSel >= 3.U & isSpiRead io.isEnR := isSckPosedge & ~shiftCSn(1+1) & bitSel === 7.U & byteSel >= 3.U & isSpiRead
io.isEnW := isSckPosedgeNext(1) & ~shiftCSn(1+1) & bitSel === 0.U & isSpiWrite & byteSel >= 4.U io.isEnW := isSckPosedgeNext(0) & ~shiftCSn(1+1) & bitSel === 0.U & isSpiWrite & byteSel >= 4.U
io.dataw := exReg io.dataw := RegNext(exReg)
when( shiftCSn(2) & ~shiftCSn(1) ){ when( shiftCSn(2) & ~shiftCSn(1) ){
bitSel := 0.U bitSel := 0.U
@@ -86,9 +86,9 @@ class SpiInterface extends Module{
when( shiftCSn(2) & ~shiftCSn(1) ){ //CS下跳 when( shiftCSn(2) & ~shiftCSn(1) ){ //CS下跳
addrSel := 0.U addrSel := 0.U
} .elsewhen(isSckPosedgeNext(0) & ~shiftCSn(1) & bitSel === 0.U & byteSel === 1.U){ //CS为低且SCK上跳的第0byte } .elsewhen(isSckPosedge & ~shiftCSn(1) & bitSel === 7.U & byteSel === 0.U){ //CS为低且SCK上跳的第0byte
addrSel := exReg addrSel := exReg
} .elsewhen(isSckPosedgeNext(0) & ~shiftCSn(1) & bitSel === 0.U & byteSel === 2.U) {//CS为低且SCK上跳的第0byte } .elsewhen(isSckPosedge & ~shiftCSn(1) & bitSel === 7.U & byteSel === 1.U) {//CS为低且SCK上跳的第0byte
addrSel := Cat(exReg, addrSel(7,0)) addrSel := Cat(exReg, addrSel(7,0))
} .otherwise{ // byteSel > 1.U } .otherwise{ // byteSel > 1.U
when( isSckPosedge & byteSel > 3.U & bitSel === 7.U ){ when( isSckPosedge & byteSel > 3.U & bitSel === 7.U ){

View File

@@ -17,7 +17,7 @@ module ShinTopSpiTb(
wire spi_miso; wire spi_miso;
reg [4:0] spi_csn; reg [4:0] spi_csn;
wire isResp;
ShinTop s_ShinTop_Mst( ShinTop s_ShinTop_Mst(
.clock(clock), .clock(clock),
@@ -34,7 +34,7 @@ ShinTop s_ShinTop_Mst(
.io_ospi_miso(spi_miso), .io_ospi_miso(spi_miso),
.io_ospi_csn (spi_csn[0]), .io_ospi_csn (spi_csn[0]),
.io_rsp_valid(), .io_rsp_valid(isResp),
.io_rsp_bits_isError(), .io_rsp_bits_isError(),
.io_rsp_bits_length() .io_rsp_bits_length()
); );
@@ -218,11 +218,11 @@ end
reg [11:0] transCnt; reg [11:0] transCnt;
reg [11:0] byteCnt; reg [11:0] byteCnt;
reg [3:0] bitCnt; reg [2:0] bitCnt;
always @(posedge sck) begin always @(posedge clock) begin
if( isReq ) begin if( isReq & sck == 0 ) begin
isBusy <= #5 1'b1; isBusy <= #5 1'b1;
transCnt <= #5 0; transCnt <= #5 0;
@@ -232,12 +232,17 @@ always @(posedge sck) begin
spi_csn[idx] <= #5 1'b0; spi_csn[idx] <= #5 1'b0;
exChangeReg <= txBuf[0]; exChangeReg <= txBuf[0];
end end
end
always @(posedge sck) begin
if( isBusy ) begin if( isBusy ) begin
if( transCnt < length ) begin if( transCnt < length ) begin
bitCnt <= bitCnt + 1; bitCnt <= bitCnt + 1;
if( bitCnt == 7 ) begin if( bitCnt == 7 ) begin
byteCnt <= byteCnt +1; byteCnt <= byteCnt +1;
transCnt <= transCnt + 1;
rxBuf[byteCnt] <= exChangeReg; rxBuf[byteCnt] <= exChangeReg;
exChangeReg <= txBuf[byteCnt+1]; exChangeReg <= txBuf[byteCnt+1];
end else begin end else begin
@@ -355,7 +360,7 @@ task spi_trans( input [15:0] saddress, input [7:0] scmd, input [12:0] slength,in
txBuf[1] <= saddress[15:8]; txBuf[1] <= saddress[15:8];
txBuf[2] <= scmd; txBuf[2] <= scmd;
length <= slength; length <= slength + 3;
idx <= sidx; idx <= sidx;
#5 #5
@@ -364,8 +369,8 @@ task spi_trans( input [15:0] saddress, input [7:0] scmd, input [12:0] slength,in
@(posedge sck) #5 @(posedge sck) #5
isReq <= 0; isReq <= 0;
@( negedge isBusy) #1000
begin end
end end
endtask endtask
@@ -420,6 +425,8 @@ initial begin
txBuf[0+3] = 8'h01; txBuf[0+3] = 8'h01;
spi_trans( (16'h20), (`SPI_WRITE), (1), (0) );//发送SM0 接收SM0, 请求发送 spi_trans( (16'h20), (`SPI_WRITE), (1), (0) );//发送SM0 接收SM0, 请求发送
@(posedge isResp) #5 begin end
end end
@@ -471,7 +478,7 @@ initial begin
txBuf[0+3] = 8'h01; txBuf[0+3] = 8'h01;
spi_trans( (16'h20), (`SPI_WRITE), (1), (0) );//发送SM0 接收SM0, 请求发送 spi_trans( (16'h20), (`SPI_WRITE), (1), (0) );//发送SM0 接收SM0, 请求发送
@(posedge isResp) #5 begin end
end end
@@ -575,7 +582,7 @@ initial begin
txBuf[0+3] = 8'h01; txBuf[0+3] = 8'h01;
spi_trans( (16'h20), (`SPI_WRITE), (1), (0) );//发送SM0 接收SM0, 请求发送 spi_trans( (16'h20), (`SPI_WRITE), (1), (0) );//发送SM0 接收SM0, 请求发送
@(posedge isResp) #5 begin end
end end
@@ -646,7 +653,7 @@ initial begin
txBuf[0+3] = 8'h01; txBuf[0+3] = 8'h01;
spi_trans( (16'h20), (`SPI_WRITE), (1), (0) );//发送SM0 接收SM0, 请求发送 spi_trans( (16'h20), (`SPI_WRITE), (1), (0) );//发送SM0 接收SM0, 请求发送
@(posedge isResp) #5 begin end
end end