当前位置: 首页 > news >正文

西安网站建设 玖佰网络网页转发到WordPress

西安网站建设 玖佰网络,网页转发到WordPress,人社局网站建设步骤,青岛市区商场黄页【一】SPI IP核使用#xff1a;传送门 基于qsys通过spi外部总线协议对sd卡进行读写操作 一、实验平台与实验的目的#xff1a; ​ 正点原子开拓者、芯片型号#xff1a;EP4CE10F17C8#xff1b;还需要一张sd卡。 ​ 该实验主要是利用SPI IP核驱动SD卡来实现读写实验传送门 基于qsys通过spi外部总线协议对sd卡进行读写操作 一、实验平台与实验的目的 ​ 正点原子开拓者、芯片型号EP4CE10F17C8还需要一张sd卡。 ​ 该实验主要是利用SPI IP核驱动SD卡来实现读写实验在这个实验中我们要了解spi使用方法核学习sd卡的读写操作方法。 二、系统的搭建 1nios 处理器的设置 nios II/f 其他的默认 2sdram controller配置 3SPI IP核配置 4PIO ip核配置 其他没有展示的ip核配置均采用默认的配置。 三、顶层文件 module Qsys_Spi ( /* 时钟复位端口 */CLK_50M,RST_N,/* SDRAM端口 */SDRAM_ADDR,SDRAM_BA,SDRAM_CAS_N,SDRAM_CLK,SDRAM_CKE,SDRAM_CS_N,SDRAM_DQ,SDRAM_DQM,SDRAM_RAS_N,SDRAM_WE_N,/* LED端口 */SD_MISO,SD_MOSI,SD_SCLK,SD_CS_N );//--------------------------------------------------------------------------- //-- 外部端口声明 //--------------------------------------------------------------------------- /* 时钟复位端口 */ input CLK_50M; input RST_N; /* SDRAM端口 */ output [12:0] SDRAM_ADDR; output [ 1:0] SDRAM_BA; output SDRAM_CAS_N; output SDRAM_CLK; output SDRAM_CKE; output SDRAM_CS_N; inout [15:0] SDRAM_DQ; output [ 1:0] SDRAM_DQM; output SDRAM_RAS_N; output SDRAM_WE_N; /* SD端口 */ output SD_SCLK; output SD_CS_N; output SD_MOSI; input SD_MISO; //--------------------------------------------------------------------------- //-- 内部端口声明 //--------------------------------------------------------------------------- wire clk_100m;//--------------------------------------------------------------------------- //-- 逻辑功能实现 //--------------------------------------------------------------------------- PLL PLL_Init (.inclk0 (CLK_50M ),.c0 (clk_100m ),.c1 (SDRAM_CLK ) );Qsys_system Qsys_system_Init (.clk_clk (clk_100m ), // clk.clk.reset_reset_n (RST_N ), // reset.reset_n.sdram_conduit_addr (SDRAM_ADDR ), // sdram_conduit.addr.sdram_conduit_ba (SDRAM_BA ), // .ba.sdram_conduit_cas_n (SDRAM_CAS_N), // .cas_n.sdram_conduit_cke (SDRAM_CKE ), // .cke.sdram_conduit_cs_n (SDRAM_CS_N ), // .cs_n.sdram_conduit_dq (SDRAM_DQ ), // .dq.sdram_conduit_dqm (SDRAM_DQM ), // .dqm.sdram_conduit_ras_n (SDRAM_RAS_N), // .ras_n.sdram_conduit_we_n (SDRAM_WE_N ), // .we_n.spi_conduit_MISO (SD_MISO ), // spi_conduit.MISO.spi_conduit_MOSI (SD_MOSI ), // .MOSI.spi_conduit_SCLK (SD_SCLK ), // .SCLK.spi_conduit_SS_n (SD_CS_N ) // .SS_n );endmodule PLL IP核的配置 clk c0输出为100Mhz相位偏差为0clk c1输出100MHz相位偏差为-60。 系统的RTL 四、引脚的绑定 # Copyright (C) 2017 Intel Corporation. All rights reserved. # Your use of Intel Corporations design tools, logic functions # and other software and tools, and its AMPP partner logic # functions, and any output files from any of the foregoing # (including device programming or simulation files), and any # associated documentation or information are expressly subject # to the terms and conditions of the Intel Program License # Subscription Agreement, the Intel Quartus Prime License Agreement, # the Intel FPGA IP License Agreement, or other applicable license # agreement, including, without limitation, that your use is for # the sole purpose of programming logic devices manufactured by # Intel and sold by Intel or its authorized distributors. Please # refer to the applicable agreement for further details.# Quartus Prime Version 17.1.0 Build 590 10/25/2017 SJ Standard Edition # File: I:\zhong_hai_da_data\My_task\20230719\gs_qsys_spi\Qsys_Spi\output_files\Qsys_Spi.tcl # Generated on: Mon Aug 07 10:50:43 2023package require ::quartus::projectset_location_assignment PIN_E1 -to CLK_50M set_location_assignment PIN_M1 -to RST_N set_location_assignment PIN_F15 -to SDRAM_ADDR[12] set_location_assignment PIN_D16 -to SDRAM_ADDR[11] set_location_assignment PIN_F14 -to SDRAM_ADDR[10] set_location_assignment PIN_D15 -to SDRAM_ADDR[9] set_location_assignment PIN_C16 -to SDRAM_ADDR[8] set_location_assignment PIN_C15 -to SDRAM_ADDR[7] set_location_assignment PIN_B16 -to SDRAM_ADDR[6] set_location_assignment PIN_A15 -to SDRAM_ADDR[5] set_location_assignment PIN_A14 -to SDRAM_ADDR[4] set_location_assignment PIN_C14 -to SDRAM_ADDR[3] set_location_assignment PIN_D14 -to SDRAM_ADDR[2] set_location_assignment PIN_E11 -to SDRAM_ADDR[1] set_location_assignment PIN_F11 -to SDRAM_ADDR[0] set_location_assignment PIN_F13 -to SDRAM_BA[1] set_location_assignment PIN_G11 -to SDRAM_BA[0] set_location_assignment PIN_J12 -to SDRAM_CAS_N set_location_assignment PIN_F16 -to SDRAM_CKE set_location_assignment PIN_B14 -to SDRAM_CLK set_location_assignment PIN_K10 -to SDRAM_CS_N set_location_assignment PIN_L15 -to SDRAM_DQ[15] set_location_assignment PIN_L16 -to SDRAM_DQ[14] set_location_assignment PIN_K15 -to SDRAM_DQ[13] set_location_assignment PIN_K16 -to SDRAM_DQ[12] set_location_assignment PIN_J15 -to SDRAM_DQ[11] set_location_assignment PIN_J16 -to SDRAM_DQ[10] set_location_assignment PIN_J11 -to SDRAM_DQ[9] set_location_assignment PIN_G16 -to SDRAM_DQ[8] set_location_assignment PIN_K12 -to SDRAM_DQ[7] set_location_assignment PIN_L11 -to SDRAM_DQ[6] set_location_assignment PIN_L14 -to SDRAM_DQ[5] set_location_assignment PIN_L13 -to SDRAM_DQ[4] set_location_assignment PIN_L12 -to SDRAM_DQ[3] set_location_assignment PIN_N14 -to SDRAM_DQ[2] set_location_assignment PIN_M12 -to SDRAM_DQ[1] set_location_assignment PIN_P14 -to SDRAM_DQ[0] set_location_assignment PIN_G15 -to SDRAM_DQM[1] set_location_assignment PIN_J14 -to SDRAM_DQM[0] set_location_assignment PIN_K11 -to SDRAM_RAS_N set_location_assignment PIN_J13 -to SDRAM_WE_N set_location_assignment PIN_C2 -to SD_CS_N set_location_assignment PIN_K1 -to SD_MISO set_location_assignment PIN_D1 -to SD_MOSI set_location_assignment PIN_J2 -to SD_SCLKset_instance_assignment -name IO_STANDARD 2.5 V -to CLK_50M set_instance_assignment -name IO_STANDARD 2.5 V -to RST_N set_instance_assignment -name IO_STANDARD 2.5 V -to SDRAM_ADDR[12] set_instance_assignment -name IO_STANDARD 2.5 V -to SDRAM_ADDR[11] set_instance_assignment -name IO_STANDARD 2.5 V -to SDRAM_ADDR[10] set_instance_assignment -name IO_STANDARD 2.5 V -to SDRAM_ADDR[9] set_instance_assignment -name IO_STANDARD 2.5 V -to SDRAM_ADDR[8] set_instance_assignment -name IO_STANDARD 2.5 V -to SDRAM_ADDR[7] set_instance_assignment -name IO_STANDARD 2.5 V -to SDRAM_ADDR[6] set_instance_assignment -name IO_STANDARD 2.5 V -to SDRAM_ADDR[5] set_instance_assignment -name IO_STANDARD 2.5 V -to SDRAM_ADDR[4] set_instance_assignment -name IO_STANDARD 2.5 V -to SDRAM_ADDR[3] set_instance_assignment -name IO_STANDARD 2.5 V -to SDRAM_ADDR[2] set_instance_assignment -name IO_STANDARD 2.5 V -to SDRAM_ADDR[1] set_instance_assignment -name IO_STANDARD 2.5 V -to SDRAM_ADDR[0] set_instance_assignment -name IO_STANDARD 2.5 V -to SDRAM_BA[1] set_instance_assignment -name IO_STANDARD 2.5 V -to SDRAM_BA[0] set_instance_assignment -name IO_STANDARD 2.5 V -to SDRAM_CAS_N set_instance_assignment -name IO_STANDARD 2.5 V -to SDRAM_CKE set_instance_assignment -name IO_STANDARD 2.5 V -to SDRAM_CLK set_instance_assignment -name IO_STANDARD 2.5 V -to SDRAM_CS_N set_instance_assignment -name IO_STANDARD 2.5 V -to SDRAM_DQ[15] set_instance_assignment -name IO_STANDARD 2.5 V -to SDRAM_DQ[14] set_instance_assignment -name IO_STANDARD 2.5 V -to SDRAM_DQ[13] set_instance_assignment -name IO_STANDARD 2.5 V -to SDRAM_DQ[12] set_instance_assignment -name IO_STANDARD 2.5 V -to SDRAM_DQ[11] set_instance_assignment -name IO_STANDARD 2.5 V -to SDRAM_DQ[10] set_instance_assignment -name IO_STANDARD 2.5 V -to SDRAM_DQ[9] set_instance_assignment -name IO_STANDARD 2.5 V -to SDRAM_DQ[8] set_instance_assignment -name IO_STANDARD 2.5 V -to SDRAM_DQ[7] set_instance_assignment -name IO_STANDARD 2.5 V -to SDRAM_DQ[6] set_instance_assignment -name IO_STANDARD 2.5 V -to SDRAM_DQ[5] set_instance_assignment -name IO_STANDARD 2.5 V -to SDRAM_DQ[4] set_instance_assignment -name IO_STANDARD 2.5 V -to SDRAM_DQ[3] set_instance_assignment -name IO_STANDARD 2.5 V -to SDRAM_DQ[2] set_instance_assignment -name IO_STANDARD 2.5 V -to SDRAM_DQ[1] set_instance_assignment -name IO_STANDARD 2.5 V -to SDRAM_DQ[0] set_instance_assignment -name IO_STANDARD 2.5 V -to SDRAM_DQM[1] set_instance_assignment -name IO_STANDARD 2.5 V -to SDRAM_DQM[0] set_instance_assignment -name IO_STANDARD 2.5 V -to SDRAM_RAS_N set_instance_assignment -name IO_STANDARD 2.5 V -to SDRAM_WE_N set_instance_assignment -name IO_STANDARD 2.5 V -to SD_CS_N set_instance_assignment -name IO_STANDARD 2.5 V -to SD_MISO set_instance_assignment -name IO_STANDARD 2.5 V -to SD_MOSI set_instance_assignment -name IO_STANDARD 2.5 V -to SD_SCLK 引脚绑定的教程 https://www.bilibili.com/video/BV1N14y1x7VZ/?spm_id_from333.999.list.card_archive.clickvd_source044bb9c2f51f99e36e8b7693fa67ba9b传送门 五、eclipse中的软件代码 1实验一将下面的代码编译并run as --3 Nios II Hardware //--------------------------------------------------------------------------- //-- 文件名 : Qsys_Spi.c //-- 描述 : 利用SPI读写SD卡 //-- 修订历史 : 2014-1-1 //-- 作者 : Zircon Opto-Electronic Technology CO.,Ltd. //--------------------------------------------------------------------------- #include system.h //系统头文件 #include stdio.h //标准的输入输出头文件 #include unistd.h //延时函数头文件 #include alt_types.h //数据类型头文件 #include altera_avalon_spi_regs.h //spi寄存器头文件 #include altera_avalon_spi.h //spi底层驱动头文件alt_u8 SDReadBlock_Data[512]; //(读)扇区缓冲数组512字节数据 alt_u8 SDWriteBlock_Data[512]; //(写)扇区缓冲数组512字节数据//--------------------------------------------------------------------------- //-- 名称 : Spi_SDWriteByte() //-- 功能 : 往Spi中写数据函数 //-- 输入参数 : txdata:需要发送的数据 //-- 输出参数 : 无 //--------------------------------------------------------------------------- void Spi_SDWriteByte(alt_u8 txdata) {//往Spi中写一个字节alt_avalon_spi_command(SPI_BASE, 0, 1, txdata, 0, NULL, 0); }//--------------------------------------------------------------------------- //-- 名称 : Spi_SDReadByte() //-- 功能 : 从Spi中读数据函数 //-- 输入参数 : 无 //-- 输出参数 : readbuf:从Spi中读取出来的数据 //--------------------------------------------------------------------------- alt_u8 Spi_SDReadByte() {alt_u8 readbuf;//从Spi中读一个字节alt_avalon_spi_command(SPI_BASE, 0, 0, NULL, 1, readbuf, 0);return(readbuf); }//--------------------------------------------------------------------------- //-- 名称 : Spi_SDReadByte() //-- 功能 : 往SD卡中写命令函数 //-- 输入参数 : cmd:Byte1命令;arg:Byte2~Byte5命令;crc:Byte6命令 //-- 输出参数 : r1:响应变量 //--------------------------------------------------------------------------- alt_u8 Spi_SDSendCmd(alt_u8 cmd,alt_u32 arg,alt_u8 crc) {alt_u8 r1; //响应变量alt_u8 time 0; //超时变量//SD卡的命令格式如下6字节共48位传输时最高位(MSB)先传输Spi_SDWriteByte(cmd | 0x40); //写Byte1Spi_SDWriteByte(arg24); //写Byte2Spi_SDWriteByte(arg16); //写Byte3Spi_SDWriteByte(arg8); //写Byte4Spi_SDWriteByte(arg); //写Byte5Spi_SDWriteByte(crc); //写Byte6//写入命令后附加8个填充时钟等待SD卡回应do{r1 Spi_SDReadByte(); //读数据time;if(time 254) return 1; //超时退出返回1}while(r1 0xff);return r1; //命令写入成功返回响应变量 }//--------------------------------------------------------------------------- //-- 名称 : Spi_SDReset() //-- 功能 : SD卡复位函数 //-- 输入参数 : 无 //-- 输出参数 : 0:成功;1:失败 //--------------------------------------------------------------------------- alt_u8 Spi_SDReset(void) {alt_u8 i; //循环变量alt_u8 r1; //响应变量alt_u8 time 0; //超时变量//发送至少74个clk周期来使SD卡达到正常工作电压和进行同步for(i 0;i 16;i )Spi_SDWriteByte(0xff);//发送CMD0需要收到回应0x01表示成功do{r1 Spi_SDSendCmd(0,0,0x95); //发送CMD0命令time;if(time 254) return 1; //超时退出返回1}while(r1 ! 0x01); //等待返回0x01return 0; //复位成功则返回0 }//--------------------------------------------------------------------------- //-- 名称 : Spi_SDInit() //-- 功能 : SD卡初始化函数 //-- 输入参数 : 无 //-- 输出参数 : 0:成功;1:失败 //--------------------------------------------------------------------------- alt_u8 Spi_SDInit(void) {alt_u8 r1; //响应变量alt_u8 time 0; //超时变量alt_u32 r7 0; //响应变量//发送CMD8检测接口条件若r1返回0x01,r7返回0x000001aa则表示检测成功do{r1 Spi_SDSendCmd(8,0x000001aa,0x87); //发送CMD8命令r7 Spi_SDReadByte(); //读取响应0x00r7 8;r7 Spi_SDReadByte(); //读取响应0x00r7 8;r7 Spi_SDReadByte(); //读取响应0x01r7 8;r7 Spi_SDReadByte(); //读取响应0xaatime;if(time 254) return 1; //超时退出返回1}while((r1 ! 0x01) (r7 ! 0x000001aa)); //等待r1返回0x01,r7返回0x000001aatime 0;//此处省略发送CMD58命令//发送CMD55ACMD41收到0x00表示成功do{r1 Spi_SDSendCmd(55,0,0xff); //发送CMD55命令if(r1 0x01) r1 Spi_SDSendCmd(41,0x40000000,0xff); //发送ACMD41命令time;if(time 254) return 1; //超时退出返回1}while(r1 ! 0x00); //等待返回0x00//此处省略发送CMD58命令return 0; //初始化成功则返回0 }//--------------------------------------------------------------------------- //-- 名称 : Spi_SDReadBlock() //-- 功能 : 读取SD卡一个扇区数据 //-- 输入参数 : address:扇区地址 //-- 输出参数 : 0:成功;1:失败 //--------------------------------------------------------------------------- alt_u8 Spi_SDReadBlock(alt_u32 address) {alt_u8 r1; //响应变量alt_u32 i 0; //循环变量//发送CMD17命令收到0x00表示成功r1 Spi_SDSendCmd(17,address,0xff); //发送CMD17命令if(r1 ! 0x00) return 1;//连续读直到读到开始字节0xFEwhile (Spi_SDReadByte()! 0xfe);//读取一个扇区512字节数据for(i 0; i 512; i)SDReadBlock_Data[i] Spi_SDReadByte();//读取两个字节CRC校验Spi_SDReadByte();Spi_SDReadByte();return 0; //读取成功,则返回0 }//--------------------------------------------------------------------------- //-- 名称 : Spi_SDWriteBlock() //-- 功能 : 写入SD卡一个扇区数据 //-- 输入参数 : sector:扇区地址;buffer:写入SD卡的数据首地址 //-- 输出参数 : 0:成功;1:失败 //--------------------------------------------------------------------------- alt_u8 Spi_SDWriteBlock(alt_u32 sector, alt_u8* buffer) {alt_u8 r1; //响应变量alt_u32 i; //循环变量//发送CMD24命令收到0x00表示成功r1 Spi_SDSendCmd(24, sector9, 0xff); //发送CMD24命令if(r1 ! 0x00) return 1; //写入失败返回1//发送若干时钟for(i 0; i 5; i)Spi_SDWriteByte(0xff); //送8个时钟周期脉冲//发送写扇区开始字节0xFESpi_SDWriteByte(0xfe);//发送512个字节数据for(i 0; i 512; i)Spi_SDWriteByte(*buffer);//发送2字节CRC校验Spi_SDWriteByte(0xff);Spi_SDWriteByte(0xff);//连续读直到读到XXX00101表示数据写入成功r1 Spi_SDReadByte();if((r1 0x1f) ! 0x05) return 1; //写入失败返回1//继续读进行忙碌检测当读到0xff表示写操作完成while(!Spi_SDReadByte());return 0; }//--------------------------------------------------------------------------- //-- 名称 : main() //-- 功能 : 程序入口 //-- 输入参数 : 无 //-- 输出参数 : 无 //--------------------------------------------------------------------------- int main(void) {alt_u32 i;if(Spi_SDReset()) //SD卡复位printf(SD Reset Failed!\n);elseprintf(SD Reset Succeed!\n);if(Spi_SDInit()) //SD卡初始化printf(SD Inint Failed!\n);elseprintf(SD Inint Succeed!\n);for(i 0; i 512; i) //初始化写入数据SDWriteBlock_Data[i] i;if(Spi_SDWriteBlock(0, SDWriteBlock_Data)) //写一个扇区printf(SD Write Failed!\n);elseprintf(SD Write Succeed!\n);// Spi_SDReset(); // Spi_SDInit(); //SD卡复位并初始化 // // if(Spi_SDReadBlock(0)) //读一个扇区 // printf(SD Read Failed!\n); // else // printf(SD Read Succeed!\n); // // for(i 0; i 16; i) //读取16个字节数据 // printf(0x%.2x,,SDReadBlock_Data[i]);return 0; } 实验结果 将在nios II console中输出 将sd卡拔出插入读卡器中打开电脑的WinHex软件打开sd卡 选择对应的磁盘打开会得到下面的界面 2实验二sd卡写操作 将main函数里面的注释掉的代码打开 //--------------------------------------------------------------------------- //-- 文件名 : Qsys_Spi.c //-- 描述 : 利用SPI读写SD卡 //-- 修订历史 : 2014-1-1 //-- 作者 : Zircon Opto-Electronic Technology CO.,Ltd. //--------------------------------------------------------------------------- #include system.h //系统头文件 #include stdio.h //标准的输入输出头文件 #include unistd.h //延时函数头文件 #include alt_types.h //数据类型头文件 #include altera_avalon_spi_regs.h //spi寄存器头文件 #include altera_avalon_spi.h //spi底层驱动头文件alt_u8 SDReadBlock_Data[512]; //(读)扇区缓冲数组512字节数据 alt_u8 SDWriteBlock_Data[512]; //(写)扇区缓冲数组512字节数据//--------------------------------------------------------------------------- //-- 名称 : Spi_SDWriteByte() //-- 功能 : 往Spi中写数据函数 //-- 输入参数 : txdata:需要发送的数据 //-- 输出参数 : 无 //--------------------------------------------------------------------------- void Spi_SDWriteByte(alt_u8 txdata) {//往Spi中写一个字节alt_avalon_spi_command(SPI_BASE, 0, 1, txdata, 0, NULL, 0); }//--------------------------------------------------------------------------- //-- 名称 : Spi_SDReadByte() //-- 功能 : 从Spi中读数据函数 //-- 输入参数 : 无 //-- 输出参数 : readbuf:从Spi中读取出来的数据 //--------------------------------------------------------------------------- alt_u8 Spi_SDReadByte() {alt_u8 readbuf;//从Spi中读一个字节alt_avalon_spi_command(SPI_BASE, 0, 0, NULL, 1, readbuf, 0);return(readbuf); }//--------------------------------------------------------------------------- //-- 名称 : Spi_SDReadByte() //-- 功能 : 往SD卡中写命令函数 //-- 输入参数 : cmd:Byte1命令;arg:Byte2~Byte5命令;crc:Byte6命令 //-- 输出参数 : r1:响应变量 //--------------------------------------------------------------------------- alt_u8 Spi_SDSendCmd(alt_u8 cmd,alt_u32 arg,alt_u8 crc) {alt_u8 r1; //响应变量alt_u8 time 0; //超时变量//SD卡的命令格式如下6字节共48位传输时最高位(MSB)先传输Spi_SDWriteByte(cmd | 0x40); //写Byte1Spi_SDWriteByte(arg24); //写Byte2Spi_SDWriteByte(arg16); //写Byte3Spi_SDWriteByte(arg8); //写Byte4Spi_SDWriteByte(arg); //写Byte5Spi_SDWriteByte(crc); //写Byte6//写入命令后附加8个填充时钟等待SD卡回应do{r1 Spi_SDReadByte(); //读数据time;if(time 254) return 1; //超时退出返回1}while(r1 0xff);return r1; //命令写入成功返回响应变量 }//--------------------------------------------------------------------------- //-- 名称 : Spi_SDReset() //-- 功能 : SD卡复位函数 //-- 输入参数 : 无 //-- 输出参数 : 0:成功;1:失败 //--------------------------------------------------------------------------- alt_u8 Spi_SDReset(void) {alt_u8 i; //循环变量alt_u8 r1; //响应变量alt_u8 time 0; //超时变量//发送至少74个clk周期来使SD卡达到正常工作电压和进行同步for(i 0;i 16;i )Spi_SDWriteByte(0xff);//发送CMD0需要收到回应0x01表示成功do{r1 Spi_SDSendCmd(0,0,0x95); //发送CMD0命令time;if(time 254) return 1; //超时退出返回1}while(r1 ! 0x01); //等待返回0x01return 0; //复位成功则返回0 }//--------------------------------------------------------------------------- //-- 名称 : Spi_SDInit() //-- 功能 : SD卡初始化函数 //-- 输入参数 : 无 //-- 输出参数 : 0:成功;1:失败 //--------------------------------------------------------------------------- alt_u8 Spi_SDInit(void) {alt_u8 r1; //响应变量alt_u8 time 0; //超时变量alt_u32 r7 0; //响应变量//发送CMD8检测接口条件若r1返回0x01,r7返回0x000001aa则表示检测成功do{r1 Spi_SDSendCmd(8,0x000001aa,0x87); //发送CMD8命令r7 Spi_SDReadByte(); //读取响应0x00r7 8;r7 Spi_SDReadByte(); //读取响应0x00r7 8;r7 Spi_SDReadByte(); //读取响应0x01r7 8;r7 Spi_SDReadByte(); //读取响应0xaatime;if(time 254) return 1; //超时退出返回1}while((r1 ! 0x01) (r7 ! 0x000001aa)); //等待r1返回0x01,r7返回0x000001aatime 0;//此处省略发送CMD58命令//发送CMD55ACMD41收到0x00表示成功do{r1 Spi_SDSendCmd(55,0,0xff); //发送CMD55命令if(r1 0x01) r1 Spi_SDSendCmd(41,0x40000000,0xff); //发送ACMD41命令time;if(time 254) return 1; //超时退出返回1}while(r1 ! 0x00); //等待返回0x00//此处省略发送CMD58命令return 0; //初始化成功则返回0 }//--------------------------------------------------------------------------- //-- 名称 : Spi_SDReadBlock() //-- 功能 : 读取SD卡一个扇区数据 //-- 输入参数 : address:扇区地址 //-- 输出参数 : 0:成功;1:失败 //--------------------------------------------------------------------------- alt_u8 Spi_SDReadBlock(alt_u32 address) {alt_u8 r1; //响应变量alt_u32 i 0; //循环变量//发送CMD17命令收到0x00表示成功r1 Spi_SDSendCmd(17,address,0xff); //发送CMD17命令if(r1 ! 0x00) return 1;//连续读直到读到开始字节0xFEwhile (Spi_SDReadByte()! 0xfe);//读取一个扇区512字节数据for(i 0; i 512; i)SDReadBlock_Data[i] Spi_SDReadByte();//读取两个字节CRC校验Spi_SDReadByte();Spi_SDReadByte();return 0; //读取成功,则返回0 }//--------------------------------------------------------------------------- //-- 名称 : Spi_SDWriteBlock() //-- 功能 : 写入SD卡一个扇区数据 //-- 输入参数 : sector:扇区地址;buffer:写入SD卡的数据首地址 //-- 输出参数 : 0:成功;1:失败 //--------------------------------------------------------------------------- alt_u8 Spi_SDWriteBlock(alt_u32 sector, alt_u8* buffer) {alt_u8 r1; //响应变量alt_u32 i; //循环变量//发送CMD24命令收到0x00表示成功r1 Spi_SDSendCmd(24, sector9, 0xff); //发送CMD24命令if(r1 ! 0x00) return 1; //写入失败返回1//发送若干时钟for(i 0; i 5; i)Spi_SDWriteByte(0xff); //送8个时钟周期脉冲//发送写扇区开始字节0xFESpi_SDWriteByte(0xfe);//发送512个字节数据for(i 0; i 512; i)Spi_SDWriteByte(*buffer);//发送2字节CRC校验Spi_SDWriteByte(0xff);Spi_SDWriteByte(0xff);//连续读直到读到XXX00101表示数据写入成功r1 Spi_SDReadByte();if((r1 0x1f) ! 0x05) return 1; //写入失败返回1//继续读进行忙碌检测当读到0xff表示写操作完成while(!Spi_SDReadByte());return 0; }//--------------------------------------------------------------------------- //-- 名称 : main() //-- 功能 : 程序入口 //-- 输入参数 : 无 //-- 输出参数 : 无 //--------------------------------------------------------------------------- int main(void) {alt_u32 i;if(Spi_SDReset()) //SD卡复位printf(SD Reset Failed!\n);elseprintf(SD Reset Succeed!\n);if(Spi_SDInit()) //SD卡初始化printf(SD Inint Failed!\n);elseprintf(SD Inint Succeed!\n);for(i 0; i 512; i) //初始化写入数据SDWriteBlock_Data[i] i;if(Spi_SDWriteBlock(0, SDWriteBlock_Data)) //写一个扇区printf(SD Write Failed!\n);elseprintf(SD Write Succeed!\n);Spi_SDReset();Spi_SDInit(); //SD卡复位并初始化if(Spi_SDReadBlock(0)) //读一个扇区printf(SD Read Failed!\n);elseprintf(SD Read Succeed!\n);for(i 0; i 16; i) //读取16个字节数据printf(0x%.2x,,SDReadBlock_Data[i]);return 0; } 实验结果 从代码中我们可以看出使用的是altera公司提供的API访问程序alt_avalon_spi_command()对从机进行读/写。再要在qsys中设置号spi工作模式然后给spi访问程序alt_avalon_spi_command()输入正确的参数即可以获得用户希望的结果需要注意的是 alt_avalon_spi_command()仅对主机模式有效在从机模式接收数据需要直接访问spi数据寄存器。spi内核不匹配HAL支持的通用设备模种类因此它不能通过HAL API或者ANSI C标准库访问。 ---晓凡 2023年8月7日于武汉书
http://www.w-s-a.com/news/49729/

相关文章:

  • asp.net新建网站市场营销管理是做什么的
  • 南昌网站建设模板服务商建设什么网站挣钱
  • 网站建设实训记录企业网站建设运营
  • 视频网站文案住房和城乡建设部门
  • 汕头网站排名推广新余门户网站开发
  • 湖南智能网站建设哪家好wordpressμ
  • 公司网站备案必须是企业信息么睢宁县凌城做网站的
  • 上海网站建设公司 珍岛宁波免费自助建站模板
  • 南昌知名的网站建设公司南京网站开发选南京乐识赞
  • 外贸网站建设 深圳seo怎么提升关键词的排名
  • 网站推广效果的评价google关键词
  • 模板网站建站哪家好做微信充值网站
  • 抽奖的网站怎么做的广州小程序定制开发
  • 网站的文件夹建设企业网站公积金
  • 做网站的的价位网站建设 考试题目
  • 深圳比邻网站建设北京优化服务
  • 菏泽网站建设哪家好电子商务网络安全
  • 仿一个网站广州网站建设正规公司
  • 网站建设 目的seo网站关键词排名快速
  • 什么叫做响应式网站自媒体全平台发布
  • 企业网站 案例哪里需要人做钓鱼网站
  • 厚街东莞网站建设网站开发者调试模式
  • 网站推广营销联系方式wordpress adminlte
  • 哪些网站可以做文字链广告卖水果网站建设的策划书
  • 雕刻业务网站怎么做企业qq官网
  • 新华书店的做的数字阅读网站wordpress编辑器格式
  • jq做6个网站做什么好广西临桂建设局网站
  • 网站新闻图片尺寸南京网站设计公司
  • 重庆seo建站网站服务器 安全
  • 咸宁做网站的公司桂林网站建设兼职