OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7367|回复: 5

FPGA驱动EMMC数据写入读出问题

[复制链接]

6

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
121
金钱
121
注册时间
2019-5-23
在线时间
44 小时
发表于 2019-5-23 11:41:52 | 显示全部楼层 |阅读模式
3金钱
       最近在使用Altera的FPGA驱动镁光的16G内存的EMMC。初始化已经完成,当要进行写数据进去的时候先发命令CMD16设置块大小为512bit,再发送命令CMD24进行单块写。
数据写完后,经逻辑分析仪发现,DAT0线上始终保持高电平。正确写入的话DAT0线应发送010的数据到主机,最后会一直拉低。
我不知道我的数据写入的时序对不对,发现网上很多资料都千篇一律,总是讲不到重点上。有几个问题:
1、8线单块写,那除去开始位、CRC16校验位、结束位,是不是我的数据只能是368bit=512bit-1*8(开始位)-1*16*8(CRC16校验位)-1*8(结束位)。
2、8线单块写,我写的数据可以占的位数不多吗?比如只写16bit的数据。
下面是我写部分的verilog程序,希望有做过EMMC的大神指正。
module emmc_data(
                        input    EMMC_CLK,//
                        input    rst_n,//复位
                       
                        inout    [7:0] emmc_data,
                        input read_write,//读写标志,1为写,0为读
                        input  fx3_flaga,//usb3.0给的标志位,拉高可读
                        output reg   write_over//写结束标志

);

reg [7:0] EMMC_OUT;
reg [ 9:0] data_count;//数据写入计数
reg [367:0] data;
assign emmc_data = read_write?EMMC_OUT:1'dz;
always@(posedge EMMC_CLK)
begin
        if(!rst_n)
                begin
                        data<=368'h55;
                        write_over<=0;
                end
        else
                begin
                        if(read_write)//可写
                                begin
                                if((data_count>0)&&(data_count<2))//发送一次
                                        begin
                                                EMMC_OUT<=8'b0;//发送起始位
                                        end
                                else if((data_count>=2)&&(data_count<=47))//连续发送46次
                                        begin
                                                EMMC_OUT<=data[7:0];
                                                data<=data>>8;
                                        end
                                else if((data_count>=48)&&((data_count<=63)))//连续发送16次
                                                begin
                                                        EMMC_OUT[0]<=crc16_out[0][63-data_count];
                                                        EMMC_OUT[1]<=crc16_out[1][63-data_count];
                                                        EMMC_OUT[2]<=crc16_out[2][63-data_count];
                                                        EMMC_OUT[3]<=crc16_out[3][63-data_count];
                                                        EMMC_OUT[4]<=crc16_out[4][63-data_count];
                                                        EMMC_OUT[5]<=crc16_out[5][63-data_count];
                                                        EMMC_OUT[6]<=crc16_out[6][63-data_count];
                                                        EMMC_OUT[7]<=crc16_out[7][63-data_count];
                                                end
                                        else if(data_count==64)
                                                begin
                                                EMMC_OUT<=8'hff;
                                                write_over<=1;
                                                end
                                end
                                else //可读
                                        begin
                                               
                                        end
                end
end

always@(posedge EMMC_CLK)
begin
    if(!rst_n)
        data_count <= 10'd0;
    else
    if(read_write)
        data_count <= data_count + 1'd1;
    else
        data_count <= 10'd0;
end

wire crc_en;
wire [7:0] crc16_out[15:0];
assign crc_en = (data_count>0) && (data_count<=47);
genvar i,y;

generate
for(i=0; i<8; i=i+1) begin:CRC_16_gen
  SD_CRC_16_ori CRC_16_i (EMMC_OUT,crc_en, EMMC_CLK,!read_write, crc16_out);
end
endgenerate

endmodule

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165186
金钱
165186
注册时间
2010-12-1
在线时间
2106 小时
发表于 2019-5-24 02:47:51 | 显示全部楼层
回复

使用道具 举报

6

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
121
金钱
121
注册时间
2019-5-23
在线时间
44 小时
 楼主| 发表于 2019-5-24 08:30:01 | 显示全部楼层
这里更正我认知上的几点错误,一个快的大小是512字节,也就是512*8bit。
     假如不算起始位0、不算CRC16校验位、不算结束位1,就单纯的数据占了512个字节,那么我写入的数据没有这么多,只占了16bit,该怎么写入呢?
是写入(起始位0-----16bit数据------16bit检验位-----结束位1)这样吗?
还是写入(起始位0----510*8bit数据0+16bit数据------16bit校验位-----结束位)?
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2020-7-30
在线时间
1 小时
发表于 2021-4-15 21:11:16 | 显示全部楼层
您好,我也准备学习emmc,但是程序编写一直不知道怎么写,不知道能学习一下您的源码吗?
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2020-7-30
在线时间
1 小时
发表于 2021-4-15 21:20:07 | 显示全部楼层
能请教程序编写的问题吗?
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2020-7-30
在线时间
1 小时
发表于 2021-4-15 21:24:38 | 显示全部楼层
请教源码问题
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-10-3 18:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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