main.c

来自「SD卡驱动程序。周立功单片机公司开发板提供的标准例程。」· C语言 代码 · 共 155 行

C
155
字号
/****************************************Copyright (c)**************************************************
**                               Guangzou ZLG-MCU Development Co.,LTD.
**                                      graduate school
**                                 http://www.zlgmcu.com
**
**--------------File Info-------------------------------------------------------------------------------
** File name:			main.c
** Last modified Date:  2004-09-16
** Last Version:		1.0
** Descriptions:		The main() function example template
**
**------------------------------------------------------------------------------------------------------
** Created by:			Chenmingji
** Created date:		2004-09-16
** Version:				1.0
** Descriptions:		The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by:			LinEnqiang
** Modified date:		2006-12-1
** Version:				
** Descriptions:		Test
**
********************************************************************************************************/
#include "config.h"

#include "..\ZLGSD_Dri\SDMCC_PDD\sdconfig.h"
#include "..\uart\uart.h"
#include "string.h"


/*************************************************************************

for SmartARM2300 SD/MMC卡

使用说明:

1. 短接SmartARM2300板上JP1中的 WP, CD, D1, D0, CLK, CMD, D3, D2, PWR

2. 短接JP1中的 TXD0 和 RXD0, 并用串口线连接SmartARM2300和PC机.

3. 运行本工程, 并在PC机上运行SDExample.exe
**************************************************************************/

#define CMD_SD_INIT		   0x00				/* 卡初始化卡命令  */
#define CMD_SD_READ    	   0x01				/* 卡读命令        */
#define CMD_SD_WRITE   	   0x02				/* 卡写命令        */
#define CMD_SD_ERASE	   0x03				/* 卡擦除命令      */

#define CMD_DATA_TRANS	   0x04				/* 将sd_buf中的数据发送到PC机 */
#define CMD_DATA_RECV	   0x05				/* 接收来自串口的数据,并放入sd_buf中 */
#define SD_INT             24

/*********************************************************************************************************
;** Function name:           SetISR
;**
;** Descriptions:            Set ISR function for VIC
;**
;** input parameters:        no       : VIC Channel
;**                          pri      : VIC PRI
;**                          isr_func : VIC ISR function
;** Returned value:          None
----------------------------------------------------------------------------------
;********************************************************************************************************/
uint8 SetISR(uint32 no, uint32 pri, uint32 isr_func)
{
    if(no > 31) return 0;
    if(pri > 15) return 0;
    
    *(volatile uint32*)((&VICVectAddr0)+no) = isr_func;        //设置中断服务函数

    *(volatile uint32*)((&VICVectPri0)+no)= pri & 0x0F;          //设置中断优先级
    VICIntSelect &= ~(1<<no);
    VICIntEnable = 1<<no;
    
    return 1;
}

/* SD卡信息结构体变量 */
sd_struct sds;	

/* SD/MMC卡读写缓冲区,比SDMMC卡一个块大8字节 */  
uint8 sd_buf[520];
uint8 ret;

/*
*********************************************************************************************************
** 函数名称 :main()
** 函数功能 :从串口UART0接收字符串"Hello EasyARM2131!",并发送回上位机显示。
** 调试说明 :需要PC串口显示终端软件如EasyARM.exe。
*********************************************************************************************************
*/
int main (void)
{
	uint8 RecBuf[8];
	uint32 bufaddr,blockaddr,blocknum;

    UART0_Init();						// 串口初始化
    SetISR(SD_INT, 2, (uint32)MCI_Handler);   
    IRQEnable();
        
    for (;;)
    {
        UART0_GetStr(RecBuf, 8);				                           /* 从串口接收字符串 */
        switch(RecBuf[0])
    	{
    		case CMD_SD_INIT: 
    		     sds.card_posnum = 0;           
    		     RecBuf[1] = SD_Initialize(&sds);			   /* 初始化卡 */
    		break; 
    		
    		case CMD_SD_READ:
    			 blockaddr = (RecBuf[1] << 24) + (RecBuf[2] << 16) +	   /* 计算块地址 */
    						 (RecBuf[3] << 8) + RecBuf[4];
    			 RecBuf[1] = SD_ReadBlock(&sds, blockaddr, sd_buf);		   /* 卡单块读 */ 			
    		break;
    		 	    		
    		case CMD_SD_WRITE:	 
    			 blockaddr = (RecBuf[1] << 24) + (RecBuf[2] << 16) + 
    						 (RecBuf[3] << 8) + RecBuf[4];
    			 RecBuf[1] = SD_WriteBlock(&sds, blockaddr, sd_buf);	   /* 卡单块写 */
    		break;
    			
    		case CMD_SD_ERASE:	 
    			 blockaddr = (RecBuf[1] << 24) + (RecBuf[2] << 16) + 
    						 (RecBuf[3] << 8) + RecBuf[4];				   /* 擦卡起始地址 */
    			 blocknum  = (RecBuf[5] << 16) + (RecBuf[6] << 8) +	
    				 		 (RecBuf[7]);								   /* 块数 */
    			 RecBuf[1] = SD_EraseBlock(&sds, blockaddr, blocknum);		   /* 擦除操作 */
    		break;
   			
    		case CMD_DATA_RECV:	 
    			 bufaddr = (RecBuf[1] << 8) + RecBuf[2];				   /* 计算缓冲区地址 */
    			 memcpy(sd_buf + bufaddr, &RecBuf[3], 5);				   /* 收到数据放入RecBuf */
    		break;
    			
    		case CMD_DATA_TRANS: 
    			 bufaddr = (RecBuf[1] << 8) + RecBuf[2];				   /* 计算缓冲区地址 */ 
    			 memcpy(&RecBuf[1], sd_buf + bufaddr, 7);				   /* sd_buf数据放入RecBuf */
    		break;  							
    	
    		default: break;
    	}
    	
    	UART0_SendData(RecBuf, 8);		/* 发送响应帧 */
    }
	
    //return 0;
}


/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?