最专业的FPGA ZYNQ论坛--黑金动力社区

 找回密码
 注册
查看: 70|回复: 1

求救 spi tf卡读取 数据是00

[复制链接]
wangguangyu1 发表于 2018-12-3 16:27:19 | 显示全部楼层 |阅读模式
各位大神好,小弟初学。目前遇到一个问题,spi读取tf卡的块地址一直是0x0000,已经弄了好几天一直没解决 。希望有大神能帮解决。十分感谢。
目前用的程序是 黑金FPGA开发板里面的 SD卡读取图片显示的程序。

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Module Name:    SD_read
//////////////////////////////////////////////////////////////////////////////////
module SD_read(   input SD_clk,
                                                output reg SD_cs,
                                                output reg SD_datain,
                                                input  SD_dataout,
                                               
                                                output reg [15:0]mydata_o,
                                                output myvalid_o,
                                               
                                                output [3:0] mystate_o,
                                               
                                                output data_come_o,
                                               
                                                input init,
                                               
                                                output reg [7:0] rx
                                               
                                               
    );
         

reg en;
reg rx_valid;
reg [5:0] aa;         
reg [21:0] cnt;

reg data_come;

reg myen;
reg [31:0] sec;            //SD的sec地址

reg [15:0] delay_cnt;

assign data_come_o=data_come;

assign mystate_o=mystate;
assign myvalid_o=myvalid;
//assign mydata_o=mydata;

reg myvalid/*synthesis noprune*/;
reg [15:0] mydata/*synthesis noprune*/;

reg [15:0] sec_size;


(* fsm_encoding = "user",
safe_implementation = "yes",
safe_recovery_state = "recovery_attr_val"*)
reg [3:0] mystate/*synthesis noprune*/;



parameter idle=4'd0;
parameter write=4'd1;
parameter write_wait=4'd2;
parameter read=4'd3;
parameter read_wait=4'd4;
parameter read_data=4'd5;
parameter read_done=4'd6;

parameter sec_length=11'd4500; //11'd1500;                  //total sector size of one picture : 800 * 480 * 2 /512

parameter SADDR=32'd16448;//32'd32832;    //32'd1008; //32'd16448;                     //图片在SD卡的起始sector地址(第一副:16448;第二副:17984, 第二副:17984,第三副:19520)

         
always @(posedge SD_clk)
begin
        rx[0]<=SD_dataout;
        rx[7:1]<=rx[6:0];
end

//接收一个Byte的数据
always @(posedge SD_clk)
begin
        if(!SD_dataout&&!en)begin rx_valid<=1'b0; aa<=1;en<=1'b1;end      //等待SD_dataout为低,SD_dataout为低,开始接收数据
   else if(en)        begin
                if(aa<7) begin
                        aa<=aa+1'b1;
                        rx_valid<=1'b0;
                end
                else begin
                        aa<=0;
                        en<=1'b0;
                        rx_valid<=1'b1;             //接收完第8bit后,rx_valid信号开始有效
                end
        end
        else begin en<=1'b0;aa<=0;rx_valid<=1'b0;end
end

reg [47:0] CMD17; //CMD17的字节序列

//reg [47:0] CMD24={8'h58,8'h00,8'h00,8'h00,8'h00,8'hff};

reg [7:0] CMDX;
reg [7:0] CMDY=8'hff;
reg [3:0] cnta;

reg picture_store;                    

always @(posedge SD_clk)
if(!init)
        begin
                mystate<=idle;
                CMD17<={8'h51,8'h00,8'h00,8'h00,8'h00,8'hff};
                data_come<=1'b0;
                picture_store<=1'b0;
                sec<=SADDR;
                mydata<=0;       
                sec_size<= 16'd0;
                delay_cnt<=0;
        end
else
        begin
        case(mystate)
                idle:        begin
                                data_come<=1'b0;
                                SD_cs<=1'b1;
                                SD_datain<=1'b1;
                                cnt<=22'd0;       
                      mydata<=0;               
                                if((picture_store==1'b0) && (delay_cnt==10000))       //如果还没有把SD卡的图片存放到SDRAM中
                                        begin
                                                mystate<=read;
                                                CMD17<={8'h51,sec[31:24],sec[23:16],sec[15:8],sec[7:0],8'hff};
                                        end
                                else begin
                                   mystate<=idle;
                                        delay_cnt<=delay_cnt+1'b1;       
                 end                               
                end
                read: begin                    //发送CMD17命令 (single Block Read)               
                           data_come<=1'b0;
                           if(CMD17!=48'd0) begin
                                        SD_cs<=1'b0;
                                        SD_datain<=CMD17[47];
                                        CMD17<={CMD17[46:0],1'b0};     //移位输出
                                        myen<=1'b0;
                                        cnt<=22'd0;                                                                       
                                end
                                else begin
                                   if(rx_valid) begin         //等待应答信号               
                                                cnt<=0;
                                                mystate<=read_wait;
                                        end
                                end
                end
                read_wait: begin             //等待接收数据的起始位,低电平
                            myvalid<=1'b0;
                            if(!SD_dataout) begin
                                     mystate<=read_data;
                                          cnta<=0;
                                          data_come<=1'b1;
                                 end
                                 else data_come<=1'b0;
                        end
                read_data: begin             //接收SD数据
                           data_come<=1'b0;
                                if(cnt<256)        begin                         //读取一个block的数据, 512byte
                             if(cnta<15)        begin                      //组成16bit的数据
                                           myvalid<=1'b0;
                                                mydata<={mydata[14:0],SD_dataout};
                                                cnta<=cnta+1'b1;
                                  end
                                  else begin
                                                myvalid<=1'b1;                       //一个16bit数据有效
                                                mydata_o<={mydata[14:0],SD_dataout};
                                                cnta<=0;
                                                cnt<=cnt+1'b1;
                                  end
                                end
                                else begin
                                   cnt<=0;
                                        mystate<=read_done;
                                        myvalid<=1'b0;
                                end
                end
                read_done: begin               //读512个字节完成
                           data_come<=1'b0;
                                if(cnt<22'd15) begin
                                         SD_cs<=1'b1;
                                         SD_datain<=1'b1;
                                         cnt<=cnt+1'b1;
                                 end
                                 else begin
                                    cnt<=0;
                                         mystate<=idle;
                                         if (sec_size<16'd1) begin     //如果整幅图像还未读完
                                            picture_store<=1'b0;
                                                sec <= sec + 1'b1;
                                                 sec_size <= sec_size +16'd1;
                                         end         
                                         else        begin         
                                            sec<=SADDR;
                                                 sec_size<= 16'd0;
                                                   picture_store<=1'b0;
                                           // picture_store<=1'b1;
                                         end         
                                 end
                        end
                default:mystate<=0;
                endcase               
        end                                       
       

endmodule

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
 楼主| wangguangyu1 发表于 2018-12-3 16:29:59 | 显示全部楼层
读取了两个块
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|@2009-2016 芯驿电子科技(上海)有限公司|小黑屋|手机版|Archiver|黑金动力社区 ( 沪ICP备11013590沪公网安备 31011702000003号

GMT+8, 2018-12-15 11:23 , Processed in 0.066807 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表