ZYNQ7000 EMMC/SD硬件测试

vivado生成.bit,导入SDK,分别建硬件测试工程

1.EMMC裸机读写测试

方法:使用了 XILINX SDK 库函数实现读写,先往 EMMC 里面写 1024 个数据,然后读出来对比

#include <stdio.h>
#include "xparameters.h"
#include "xil_exception.h"
#include "xsdps.h"
#include "xil_printf.h"
static XSdPs ps7_EMMC;
XSdPs_Config * EMMC_Config;
u8 WR_Buf[1024];
u8 RD_Buf[1024];
u8 Emmc_ExtCsd[1024];
int main()
{
u32 i;

s32 Status;
u32 Buffer_size=1024;
u8 SD_ERROR=0;
EMMC_Config= XSdPs_LookupConfig(XPAR_PS7_SD_1_DEVICE_ID);
Status = XSdPs_CfgInitialize(&ps7_EMMC, EMMC_Config, EMMC_Config->BaseAddress);
if (Status != XST_SUCCESS)
{
print("EMMC Config failed !\n\r");
return XST_FAILURE;
}
Status=XSdPs_MmcCardInitialize(&ps7_EMMC);
if (Status != XST_SUCCESS)
{
print("EMMC Config failed !\n\r");
return XST_FAILURE;
}
Status=XSdPs_Change_ClkFreq(&ps7_EMMC,50000000);
Status=XSdPs_Select_Card(&ps7_EMMC);
Status=XSdPs_SetBlkSize(&ps7_EMMC,XSDPS_BLK_SIZE_512_MASK);
Status=XSdPs_Get_Mmc_ExtCsd(&ps7_EMMC,Emmc_ExtCsd);
for(i=0;i<Buffer_size;i++)
{
WR_Buf[i]=i;
}
Status = XSdPs_WritePolled(&ps7_EMMC, 0x00, 2, WR_Buf);
Status = XSdPs_ReadPolled(&ps7_EMMC, 0x00, 2, RD_Buf);
//-----------------------check data-----------------------------------------------
for(i=0; i<Buffer_size;i++)
{
if(WR_Buf[i]!=RD_Buf[i])
{
SD_ERROR=1;
break;
}
}
if(SD_ERROR)
xil_printf("EMMC Data checked Error\r\n");
else
xil_printf("EMMC Data checked Successfully\r\n");
return 0;
}

2.SD卡裸机读写测试

实现了创建一个 text.txt 的文件,并且打开,只有往里面写 0~1023~共计 1024 个数据,之后再读这个文件,读出 1024 个数据,最后对比数据内容是否和写入的一致。用户可以可以直接复制以上程序到自己的工程使用。除此之外,要让自己新建的工程可以正常编译,还要设置 BSP 库:菜单栏Xilinx->Board Support Package Setting勾选 xilffs 库,以支持 SD 卡的裸机文件系统支持。

#include <stdio.h>
#include "xparameters.h"
#include "xsdps.h"
#include "xil_printf.h"
#include "ff.h"
static FATFS SD_Dev; // File System instance
char *SD_Path = "0:/"; // string pointer to the logical drive number
static char FileName[32] = "test.txt"; // name of the log
u8 WR_Buf[1024] __attribute__ ((aligned(32))); // Buffer should be word aligned (multiple of 4)
u8 RD_Buf[1024] __attribute__ ((aligned(32))); // Buffer should be word aligned (multiple of 4)
int SD_init()
{
              FRESULT result;
               result = f_mount(&SD_Dev,SD_Path, 0);
              if (result != 0)

            {
                   return XST_FAILURE;
            }
           return XST_SUCCESS;
}
int SD_read(char *FileName,u8 *DestinationAddress,u32 ByteLength)
{
            FIL file;
            FRESULT result;
            UINT BytesRd;
           result = f_open(&file,FileName,FA_READ);
          if(result)

           {
                 return XST_FAILURE;
            }
           result = f_lseek(&file, 0);
         if(result)
        {
          return XST_FAILURE;
        }
        result = f_read(&file, (void*)DestinationAddress,ByteLength,&BytesRd);
       if(result)
     {
           return XST_FAILURE;
      }
     result = f_close(&file);
   if(result)
   {
        return XST_FAILURE;
   }
       return XST_SUCCESS;
}
int SD_write(char *FileName,u8 *SourceAddress,u32 ByteLength)
{
             FIL file;
             FRESULT result;
             UINT BytesWr;
            result = f_open(&file,FileName,FA_CREATE_ALWAYS | FA_WRITE);
            if(result)
             {
                   return XST_FAILURE;
             }
            result = f_lseek(&file, 0);
            if(result)
            {
                   return XST_FAILURE;
            }
           result = f_write(&file,(void*) SourceAddress,ByteLength,&BytesWr);
           if(result)
         {
              return XST_FAILURE;
         }

          result = f_close(&file);
       if(result)

      {
          return XST_FAILURE;
       }
       return XST_SUCCESS;
}
int main()
{
           int i;
           FRESULT result;
          u8 SD_ERROR=0;
          u32 Buffer_size=1024;
          SD_init();
         for(i=0;i<Buffer_size;i++)
         {
              WR_Buf[i]=i;
          }
//-----------------------write test data to file-----------------------------------
         result=SD_write(FileName, WR_Buf, Buffer_size);
        if (result!=0)
       {
             return XST_FAILURE;
       }
        xil_printf("SD CARD written Successfully\r\n");
//-----------------------read test data ------------------------------------------
       result=SD_read(FileName, RD_Buf, Buffer_size);
        if (result!=0)
      {
          return XST_FAILURE;
       }
       xil_printf("SD CARD Data read Successfully\r\n");
//-----------------------check data-----------------------------------------------
for(i=0; i<Buffer_size;i++)
{
           if(WR_Buf[i]!=RD_Buf[i])
          {

           SD_ERROR=1;
            break;
         }
}
if(SD_ERROR)
         xil_printf("SD CARD Data checked Error\r\n");
else
          xil_printf("SD CARD Data checked Successfully\r\n");
return 0;
}

 

 

当然,我可以为您提供一些关于Zynq MP eMMC读写测试代码的介绍。 在Zynq MP SoC中,eMMC(嵌入式多媒体卡)是一种常见的存储设备,用于存储和读取数据。下面是一个简单的eMMC读写测试代码示例: ```c #include <stdio.h> #include "xil_printf.h" #include "xil_io.h" #define EMMC_BASE_ADDR 0xFF180000 // eMMC控制器的基地址 // eMMC控制器寄存器偏移地址 #define EMMC_CMD_REG_OFFSET 0x00 #define EMMC_ARG_REG_OFFSET 0x04 #define EMMC_RESP_REG_OFFSET 0x08 #define EMMC_DATA_REG_OFFSET 0x10 // eMMC命令定义 #define CMD_GO_IDLE_STATE 0x00 #define CMD_SEND_OP_COND 0x01 // 其他命令... // 初始化eMMC控制器 void emmc_init() { // 初始化代码... } // 发送eMMC命令 void emmc_send_command(u32 cmd, u32 arg) { // 发送命令代码... } // 读取eMMC响应 u32 emmc_read_response() { // 读取响应代码... } // 读取eMMC数据 void emmc_read_data(u8* buffer, u32 size) { // 读取数据代码... } // 写入eMMC数据 void emmc_write_data(u8* buffer, u32 size) { // 写入数据代码... } int main() { u8 read_buffer[512]; // 读取缓冲区 u8 write_buffer[512]; // 写入缓冲区 emmc_init(); // 初始化eMMC控制器 // 发送读取命令 emmc_send_command(CMD_READ_SINGLE_BLOCK, 0x00000001); // 读取数据 emmc_read_data(read_buffer, sizeof(read_buffer)); // 打印读取的数据 for (int i = 0; i < sizeof(read_buffer); i++) { xil_printf("%02x ", read_buffer[i]); } xil_printf("\n"); // 发送写入命令 emmc_send_command(CMD_WRITE_SINGLE_BLOCK, 0x00000001); // 写入数据 emmc_write_data(write_buffer, sizeof(write_buffer)); return 0; } ``` 请注意,这只是一个简单的示例代码,实际使用时需要根据具体的硬件平台和eMMC控制器的规格进行适当的修改和配置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值