做网站推广费用企业简介模板文字

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

做网站推广费用,企业简介模板文字,上海发布微博,python 交互 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 © 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日于武汉书