加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

lpc1768 SD卡基于ucos的fatfs文件系统

发布时间:2020-12-15 06:11:43 所属栏目:百科 来源:网络整理
导读:一、应用程序使用步骤 1、初始化? Init_Temp = disk_initialize( 1 ); // 为二底层驱动初始化 获取mmc信息 ? 2、加载逻辑驱动器 ? Fs_result = f_mount(0,fs);//卸载或挂在一个逻辑驱动器 3.1、打开文件夹 res = f_opendir(dirs,"Music"); 3.2打开文件 ? Fs_

一、应用程序使用步骤

1、初始化?

  Init_Temp = disk_initialize( 1 );   // 为二底层驱动初始化 获取mmc信息

?

2、加载逻辑驱动器

?

	Fs_result = f_mount(0,&fs);//卸载或挂在一个逻辑驱动器


3.1、打开文件夹

	res = f_opendir(&dirs,"Music"); 


3.2打开文件

?

Fs_result = f_open(&fsrc,"ftxt.txt",FA_OPEN_EXISTING | FA_READ);


4读取文件

?

 res = f_read(&fsrc,buffer,sizeof(buffer),&br);


5、关闭文件

f_close(&fsrc);	 //关闭文件

?

6、卸载驱动器

f_mount(1,0); 


二 驱动程序

1、SPI初始化

void  SPIInit(void)
{  
	/* 设置MX25L1602的控制引脚 */
//	PINSEL0 	=	0;		
   	FIO0DIR 	|=  	F016B_CS;
	/* 设置硬件SPI的通讯脚	*/ 
   	PINSEL0	|= 	0xc0000000;				// 设置P0.15脚为SCK脚
   	PINSEL1	=	(0x03 << 2) | (0x03 << 4);	// 设置P0.17、P0.18引脚为SPI引脚
			               
   	S0SPCCR =	0x40;		       		// 设置SPI时钟分频,可按需求配置			
 	/* 设置SPI的工作方式 */ 
 	S0SPCR  = 	(0 << 2) |				// SPI控制器每次传输发送和接收8位数据。
 				(0 << 3) |				// CPHA = 0,数据在SCK 的第一个时钟沿采样
 				(0 << 4) |				// CPOL = 0,SCK 为低有效
 				(1 << 5) |				// MSTR = 1,SPI 处于主模式
 				(0 << 6) |				// LSBF = 0,SPI 数据传输MSB (位7)在先
 				(0 << 7);				// SPIE = 0,SPI 中断被禁止
}


2、MMC初始化

?

int MMC_disk_initialize(void)
{ 
  /* Initialize and enable the Flash Card. */
  U32 i,r1;

  /* Initialize SPI interface and enable Flash Card SPI mode. */
  spi_init ();

  spi_ss (1); spi_send (0xFF);
  spi_hi_speed (__FALSE);

  /* Send SPI Command with card not selected at 400 KBit. */
  for (i = 0; i < 16; i++) {
    spi_send (0xFF);
  }

  /* Reset the card,send CMD0. */
  spi_ss (0);
  r1 = mmc_command (GO_IDLE_STATE,0);
  for (i = 0; i < 100; i++) {
    if (r1 == 0x01) {
      break;
    }
    r1 = spi_send (0xFF);
  }
  spi_ss (1); spi_send (0xFF);

  if (r1 != 0x01) {
    /* Failed to Reset Flash Card. */
    return (__FALSE);
  }
  spi_hi_speed (__TRUE);

  CardType = CARD_NONE;
  /* Check if SD card,send ACMD41 */
  for (i = 0; i < 50000; i++) {
    spi_ss (0);
    r1 = mmc_command (APP_CMD,0);
    spi_ss (1);
    if (r1 & 0x04) {
      /* Illegal Command. */
      break;
    }
    if (r1 == 0x01) {
      spi_ss (0);
      r1 = mmc_command (SD_SEND_OP_COND,0);
      spi_ss (1); spi_send (0xFF);
      if (r1 == 0x00) {
        /* OK,SD card initialized. */
        CardType = CARD_SD;
        break;
      }
    }
  }
  if (CardType == CARD_NONE) {
    /* Initialize MMC Card,send CMD1. */
    for (i = 0; i < 50000; i++) {
      spi_ss (0);
      r1 = mmc_command (SEND_OP_COND,0);
      spi_ss (1);spi_send (0xFF);
      if (r1 != 0x01) {
        break;
      }
    }
    if (r1 != 0x00) {
      /* Failed to Initialize the card. */
      return (__FALSE);
    }
    CardType = CARD_MMC;
  }

  /* Set block length in the Flash Card to 512 bytes. */
  spi_ss (0);
  r1 = mmc_command (SET_BLOCKLEN,512);
  spi_ss (1);	spi_send (0xFF);
  if (r1 != 0x00) {
    return (__FALSE);
  }
  /* Turn Off CRC option. */
  spi_ss (0);
  r1 = mmc_command (CRC_ON_OFF,0);
  spi_ss (1);  spi_send (0xFF);
  if (r1 != 0x00) {
    return (__FALSE);
  }
  /* Success,card initialized. */
  return (__TRUE);
}


3、底层SPI收发函数

?

void Send_Byte(INT8U data)
{
    S0SPDR = data;
    while ( 0 == (S0SPSR & 0x80));			// 等待SPIF置位,即等待数据发送完毕
	data = S0SPSR;								// 清除SPIF标志
}

/************************************************************************
** 函数名称:Get_Byte														
** 函数功能:通过硬件SPI接口接收一个字节到处理器						
** 入口参数:无																
** 出口参数:无																
************************************************************************/
INT8U Get_Byte(void)
{
    INT8U temp;
	S0SPDR = 0xff;							// 发送该数据用以产生时钟,数据本身没有用处
    while ( 0 == (S0SPSR & 0x80));			// 等待SPIF置位,即等待数据发送完毕
    temp = S0SPSR;								// 清除SPIF标志
    temp=temp;
    return (INT8U)(S0SPDR);					// 返回接收到的数据
}

FATFS还是很好用的 速度快 占资源少。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读