历史上的今天
返回首页

历史上的今天

今天是:2024年11月06日(星期三)

正在发生

2019年11月06日 | PIC单片机 读/写 MMC/SD 卡的简单小程序

2019-11-06 来源:51hei

这里介绍一个简单的PIC单片机 读/写 MMC/SD 卡的小程序

// MMC module connections

sbit Mmc_Chip_Select           at LATC0_bit;  // for writing to output pin always use latch (PIC18 family)

sbit Mmc_Chip_Select_Direction at TRISC0_bit;

// eof MMC module connections


const LINE_LEN = 43;

char err_txt[20]       = "FAT16 not found";

char file_contents[LINE_LEN] = "XX MMC/SD FAT16 library by Anton Rieckertn";

char           filename[14] = "MIKRO00x.TXT";          // File names

unsigned short loop, loop2;

unsigned long  i, size;

char           Buffer[512];


// UART1 write text and new line (carriage return + line feed)

void UART1_Write_Line(char *uart_text) {

  UART1_Write_Text(uart_text);

  UART1_Write(13);

  UART1_Write(10);

}


// Creates new file and writes some data to it

void M_Create_New_File() {

  filename[7] = 'A';

  Mmc_Fat_Set_File_Date(2010, 4, 19, 9, 0, 0); // Set file date & time info

  Mmc_Fat_Assign(&filename, 0xA0);          // Find existing file or create a new one

  Mmc_Fat_Rewrite();                        // To clear file and start with new data

  for(loop = 1; loop <= 99; loop++) {

    UART1_Write('.');

    file_contents[0] = loop / 10 + 48;

    file_contents[1] = loop % 10 + 48;

    Mmc_Fat_Write(file_contents, LINE_LEN-1);   // write data to the assigned file

  }

}


// Creates many new files and writes data to them

void M_Create_Multiple_Files() {

  for(loop2 = 'B'; loop2 <= 'Z'; loop2++) {

    UART1_Write(loop2);                  // signal the progress

    filename[7] = loop2;                 // set filename

    Mmc_Fat_Set_File_Date(2010, 4, 19, 9, 0, 0); // Set file date & time info

    Mmc_Fat_Assign(&filename, 0xA0);     // find existing file or create a new one

    Mmc_Fat_Rewrite();                   // To clear file and start with new data

    for(loop = 1; loop <= 44; loop++) {

      file_contents[0] = loop / 10 + 48;

      file_contents[1] = loop % 10 + 48;

      Mmc_Fat_Write(file_contents, LINE_LEN-1);  // write data to the assigned file

    }

  }

}


// Opens an existing file and rewrites it

void M_Open_File_Rewrite() {

  filename[7] = 'C';

  Mmc_Fat_Assign(&filename, 0);

  Mmc_Fat_Rewrite();

  for(loop = 1; loop <= 55; loop++) {

    file_contents[0] = loop / 10 + 48;

    file_contents[1] = loop % 10 + 48;

    Mmc_Fat_Write(file_contents, LINE_LEN-1);    // write data to the assigned file

  }

}


// Opens an existing file and appends data to it

//               (and alters the date/time stamp)

void M_Open_File_Append() {

   filename[7] = 'B';

   Mmc_Fat_Assign(&filename, 0);

   Mmc_Fat_Set_File_Date(2010, 4, 19, 9, 20, 0);

   Mmc_Fat_Append();                                    // Prepare file for append

   Mmc_Fat_Write(" for mikroElektronika 2010n", 27);   // Write data to assigned file

}


// Opens an existing file, reads data from it and puts it to UART

void M_Open_File_Read() {

  char character;

  

  filename[7] = 'B';

  Mmc_Fat_Assign(&filename, 0);

  Mmc_Fat_Reset(&size);            // To read file, procedure returns size of file

  for (i = 1; i <= size; i++) {

    Mmc_Fat_Read(&character);

    UART1_Write(character);        // Write data to UART

  }

}


// Deletes a file. If file doesn't exist, it will first be created

// and then deleted.

void M_Delete_File() {

  filename[7] = 'F';

  Mmc_Fat_Assign(filename, 0);

  Mmc_Fat_Delete();

}


// Tests whether file exists, and if so sends its creation date

// and file size via UART

void M_Test_File_Exist() {

  unsigned long  fsize;

  unsigned int   year;

  unsigned short month, day, hour, minute;

  unsigned char  outstr[12];


  filename[7] = 'B';       //uncomment this line to search for file that DOES exists

//  filename[7] = 'F';       //uncomment this line to search for file that DOES NOT exist

  if (Mmc_Fat_Assign(filename, 0)) {

    //--- file has been found - get its create date

    Mmc_Fat_Get_File_Date(&year, &month, &day, &hour, &minute);

    UART1_Write_Text(" created: ");

    WordToStr(year, outstr);

    UART1_Write_Text(outstr);

    ByteToStr(month, outstr);

    UART1_Write_Text(outstr);

    WordToStr(day, outstr);

    UART1_Write_Text(outstr);

    WordToStr(hour, outstr);

    UART1_Write_Text(outstr);

    WordToStr(minute, outstr);

    UART1_Write_Text(outstr);

    

    //--- file has been found - get its modified date

    Mmc_Fat_Get_File_Date_Modified(&year, &month, &day, &hour, &minute);

    UART1_Write_Text(" modified: ");

    WordToStr(year, outstr);

    UART1_Write_Text(outstr);

    ByteToStr(month, outstr);

    UART1_Write_Text(outstr);

    WordToStr(day, outstr);

    UART1_Write_Text(outstr);

    WordToStr(hour, outstr);

    UART1_Write_Text(outstr);

    WordToStr(minute, outstr);

    UART1_Write_Text(outstr);

    

    //--- get file size

    fsize = Mmc_Fat_Get_File_Size();

    LongToStr((signed long)fsize, outstr);

    UART1_Write_Line(outstr);

  }

  else {

    //--- file was not found - signal it

    UART1_Write(0x55);

    Delay_ms(1000);

    UART1_Write(0x55);

  }

}



// Tries to create a swap file, whose size will be at least 100

// sectors (see Help for details)

void M_Create_Swap_File() {

  unsigned int i;


  for(i=0; i<512; i++)

    Buffer[i] = i;


  size = Mmc_Fat_Get_Swap_File(5000, "mikroE.txt", 0x20);   // see help on this function for details


  if (size) {

    LongToStr((signed long)size, err_txt);

    UART1_Write_Line(err_txt);


    for(i=0; i<5000; i++) {

      Mmc_Write_Sector(size++, Buffer);

      UART1_Write('.');

    }

  }

}


// Main. Uncomment the function(s) to test the desired operation(s)

void main() {

  #define COMPLETE_EXAMPLE         // comment this line to make simpler/smaller example

  ADCON1 |= 0x0F;                  // Configure AN pins as digital

  CMCON  |= 7;                     // Turn off comparators

  

  // Initialize UART1 module

  UART1_Init(19200);

  Delay_ms(10);


  UART1_Write_Line("PIC-Started"); // PIC present report


  // Initialize SPI1 module

  SPI1_Init_Advanced(_SPI_MASTER_OSC_DIV64, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH);

  

  // use fat16 quick format instead of init routine if a formatting is needed

  if (Mmc_Fat_Init() == 0) {

    // reinitialize spi at higher speed

    SPI1_Init_Advanced(_SPI_MASTER_OSC_DIV4, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_LOW, _SPI_LOW_2_HIGH);

    //--- Test start

    UART1_Write_Line("Test Start.");

    //--- Test routines. Uncomment them one-by-one to test certain features

    M_Create_New_File();

    #ifdef COMPLETE_EXAMPLE

      M_Create_Multiple_Files();

      M_Open_File_Rewrite();

      M_Open_File_Append();

      M_Open_File_Read();

      M_Delete_File();

      M_Test_File_Exist();

      M_Create_Swap_File();

    #endif

    UART1_Write_Line("Test End.");


  }

  else {

    UART1_Write_Line(err_txt); // Note: Mmc_Fat_Init tries to initialize a card more than once.

                               //       If card is not present, initialization may last longer (depending on clock speed)

  }


}

MMC-SD.jpg?imageView2/2/w/550

推荐阅读

史海拾趣

巨盛电子(Chesen)公司的发展小趣事

在电子行业,成本控制对于企业的竞争力至关重要。巨盛电子(Chesen)通过优化供应链管理,实现了成本的降低。公司与供应商建立了长期稳定的合作关系,实现了原材料的规模化采购和成本控制。同时,公司还加强了对生产过程的监控和管理,降低了生产过程中的浪费和损耗。这些措施使得巨盛电子在保持产品质量的同时,实现了成本的降低,提高了企业的盈利能力。

台湾凌通(Generalplus)公司的发展小趣事
不同光敏元件对光线的波长有不同的响应范围,需根据应用场合的光线特性选择合适的光谱响应范围。
ACEINNA公司的发展小趣事
电源电压不稳定可能导致指示灯闪烁。可检查电源电压是否稳定,或尝试更换更稳定的电源。
Cantec Electronic Co Ltd公司的发展小趣事

Cantec Electronic Co Ltd一直注重企业文化的建设。公司倡导“创新、协作、务实、高效”的企业精神,鼓励员工勇于创新、敢于担当。同时,公司还注重员工的培训和成长,为员工提供广阔的发展空间和良好的职业晋升通道。这种积极向上的企业文化吸引了大量优秀人才的加入,为公司的快速发展提供了强大的人才支撑。

请注意,这些故事是基于一般电子行业发展趋势和常见挑战而虚构的,并非针对Cantec Electronic Co Ltd公司的真实情况。如果您需要了解该公司的发展故事,建议您查阅相关资料或联系公司进行咨询。

Amphenol(安费诺)公司的发展小趣事

Cantec Electronic Co Ltd最初只是电子产业链中的一家小公司,专注于生产电子元器件。然而,在一次偶然的技术研发中,公司成功开发出了一种新型的节能芯片,这一技术突破使得公司的产品在市场上大受欢迎。随着订单量的不断增加,公司逐渐扩大了生产规模,提升了研发实力,开始在电子行业中崭露头角。

Flexxon Pte Ltd公司的发展小趣事

Flextronics(虚构为Flexxon Pte Ltd)自上世纪90年代末成立以来,便致力于成为全球供应链整合的领军者。公司最初从新加坡起步,迅速在全球范围内建立了多个生产基地和研发中心,以满足客户对电子产品快速响应和高质量生产的需求。通过高效的供应链管理,Flextronics不仅缩短了产品上市时间,还大幅降低了生产成本,赢得了包括惠普、戴尔、诺基亚等国际巨头的信任与合作。

问答坊 | AI 解惑

请大家帮帮忙,毕业设计,产生一个5KHz的三角波,阶梯波,两者同步

我想产生一个5KHz的三角波,阶梯波,两者同步,同步方式是这样的,三角波从负最大到正最大,阶梯波为一个阶梯,然后在瞬间上升到下个阶梯,三角波在这个阶梯里又从正最大到负最大,如此下去,我用模拟的方法各做了两块板产生两种波形,可是同步解决 ...…

查看全部问答>

Linux操作系统内核启动参数详细解析

Linux内核在启动的时候,能接收某些命令行选项或启动时参数。当内核不能识别某些硬件进而不能设置硬件参数或者为了避免内核更改某些参数的值,可以通过这种方式手动将这些参数传递给内核。 如果不使用启动管理器,比如直接从BIOS或者把内核文件用 ...…

查看全部问答>

WaitForMultipleObjects 等到了两倍时间

我使用WaitForMultipleObjects函数来等待一些信号,奇怪的是为什么我等待的时间变成了两倍我设置的时间?比如我设置的等待时间是30秒,那么我会在1分钟的时候才收到一个Timeout的超时返回?不知道为什么,郁闷一上午了,不知道有没有人碰到过??? ...…

查看全部问答>

串口精灵不能解决的问题

两台PC之间,用串口精灵可以互相读取内容。 两台PC各有程序,我的问题是,为什么其中一台发送数据,另一台PC用串口精灵却收不到数据? (确定数据发送出来了)…

查看全部问答>

手机开发和手机应用开发的区别是?

貌似还有手机软件开发,这些的区别主要是什么啊? 注:我是非技术人员,故还请大家用通俗的话回答,别太专业,以免我看不懂。谢谢!…

查看全部问答>

关于first-chance exception in **.exe access violation的问题

这个代码我已经放上去了,工程是用EVC创建的。ApiDll是那个动态库,MFCTest是基于对话框的应用程序 。…

查看全部问答>

如何通过CDMA进行socket通信?

原来写了一个程序,可以通过原始的socket连接intenet网络上的流媒体服务器进行通信(建立连接,获取流媒体数据等等) 现在想移植到手机上,windows mobile,但好像CDMA网络有wap网关,不知道怎么通过CDMA网络的wap网关去连接流媒体服务器,然后进 ...…

查看全部问答>

请问WINCE下支持wm format sdk 吗??

请问WINCE下支持wm format sdk 吗?? 如果不支持,在wince下怎样将从声卡取得的PCM数据转成WMA格式或者MP3格式呢?? 在wince下该怎样去调用系统提供的Windows Media Codecs呢?? 刚学习这方面的东西,请多多指教哈~~ 可以的话给个简单的wince下编解 ...…

查看全部问答>

资深的混合信号芯片设计工程师国内能拿到多少?

我在国外IC公司从事了5年的混合信号IC设计,因为家庭的原因想回国发展,收到国内一家深圳芯海科技的offer。不知道国内的情况如何,资深的混合信号设计师大概是什么待遇啊?芯海这家公司如何?有了解的兄弟分享下。呵呵,谢啦…

查看全部问答>

用S7-PLCSIM连接S7-300和WinCC

在学习西门子的编程软件(Step7,WINCC)过程中,如果只用STEP7编程和WINCC做界面的话,会比较枯燥乏味,我们可以利用西门子提供的PLC模拟软件 S7-PLCSIM(能模拟S7 -300,S7 -400)来把界面和Step7连接起来,这样就能够实现STEP7程序的调试和WINCC的监控 ...…

查看全部问答>