亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來(lái)到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? mmc_spi.c

?? avr的fat文件系統(tǒng)測(cè)試程序
?? C
字號(hào):
//###########################################################
// File: mmc_spi.c
//
// Read-/Writeroutines for MMC MultiMedia cards and
// SD SecureDigital cards in SPI mode.
//
// This will work only for MMC cards with 512 bytes block length !
// This will work only for MMC cards with a partition table !
//
// 29.09.2004 split SPI_WRITE() into SPI_WRITE() and SPI_WAIT()
//            speeds up program because CPU can do something else
//            while SPI hardware module is shifting in/out data 
//            see MMCReadSector() and MMCWriteSector()
//
//#########################################################################
// Last change: 29.09.2004
//#########################################################################
// holger.klabunde@t-online.de
// http://home.t-online.de/home/holger.klabunde/homepage.htm
//#########################################################################
// Compiler: AVR-GCC 3.2
//#########################################################################

#include <io.h>

#include "dos.h"

#ifdef MMC_CARD_SPI

//######################################################
unsigned char MMCCommand(unsigned char command, unsigned long adress)
//######################################################
{

 SPI_WRITE(0xFF); 			 //Dummy write
 SPI_WAIT();
 SPI_WRITE(command);
 SPI_WAIT();
 SPI_WRITE((unsigned char)(adress>>24)); //MSB of adress
 SPI_WAIT();
 SPI_WRITE((unsigned char)(adress>>16));
 SPI_WAIT();
 SPI_WRITE((unsigned char)(adress>>8));
 SPI_WAIT();
 SPI_WRITE((unsigned char)adress);       //LSB of adress
 SPI_WAIT();
 SPI_WRITE(0xFF); 			 //dummy checksum
 SPI_WAIT();
 SPI_WRITE(0xFF); 			 //16 bit response
 SPI_WAIT();
 SPI_WRITE(0xFF);
 SPI_WAIT();

 return SPDR;      			 // only last 8 bits used
}

//######################################################
unsigned char MMCReadSector(unsigned long sector, unsigned char *buf)
//######################################################
{
 unsigned int i;
 unsigned char *p,by;
 unsigned long startadr;
 
 if(sector>=maxsect) return 1; //sectornumber too big

 p=buf; //using a pointer is much faster than indexing buf[i]
 
 MMC_CS_OFF();

//calculate startadress of the sector
 startadr=sector * (unsigned long)BYTE_PER_SEC;

 MMCCommand(MMC_READ_BLOCK,startadr);

 do
  {
   SPI_WRITE(0xFF);
   SPI_WAIT();
  }while(SPDR!=0xFE); // wait for card response
  
//the following code looks very strange !
//the idea is not to stop the cpu while SPI module transfers data.
//you have 16 cpu cycles until transmission has finished !
//you can use this time to do something like storing your last data
//or get your next data out of memory, doing some loop overhead.....
//don't wait for end of transmission until you have done something better ;)

 SPI_WRITE(0xFF); // shift in first byte
 SPI_WAIT();      // we have to wait for the first byte, but ONLY for the first byte
 by=SPDR;         // get first byte, but store later !
 
 SPI_WRITE(0xFF); // start shift in next byte
                  
 for(i=0; i< (BYTE_PER_SEC-1); i++) //execute the loop while transmission is running in background
  {
   // do the for() loop overhead at this point while SPI module shifts in new data
   *p++=by;         // store last byte in buffer while SPI module shifts in new data
   SPI_WAIT();      // wait for next byte
   by=SPDR;         // get next byte, but store later !
   SPI_WRITE(0xFF); // start shift in next byte
  } 

 // last SPI_WRITE(0xFF); is shifting in crc part1 at this point
 *p++=by;         // store last byte in buffer while SPI module shifts in crc part1
 SPI_WAIT();
 SPI_WRITE(0xFF); // shift in crc part2
 SPI_WAIT();

 MMC_CS_ON();

 return 0;
}

#ifdef DOS_WRITE
//######################################################
unsigned char MMCWriteSector(unsigned long sector, unsigned char *buf)
//######################################################
{
 unsigned int i;
 unsigned char *p, by;
 unsigned long startadr;

 if(sector>=maxsect) return 1; //sectornumber too big
 
 p=buf; //using a pointer is much faster than indexing buf[i]

 MMC_CS_OFF();

//calculate startadress
 startadr=sector * (unsigned long)BYTE_PER_SEC;

 MMCCommand(MMC_WRITE_BLOCK,startadr);

 SPI_WRITE(0xFF); // do we need this TWO dummy writes ?
 SPI_WAIT();
 SPI_WRITE(0xFF);
 SPI_WAIT();

 SPI_WRITE(0xFE); // start block token for next sector
                  
 for(i=0; i<BYTE_PER_SEC; i++) // execute the loop while transmission is running in background
  {
   // do the for() loop overhead at this point while SPI module shifts out new data
   by=*p++;       // get next data from memory while SPI module shifts out new data
   SPI_WAIT();    // wait for end of transmission
   SPI_WRITE(by); // start shift out next byte
  }

 SPI_WAIT();      // wait til last byte is written to MMC
 SPI_WRITE(0xFF); // 16 bit crc follows data
 SPI_WAIT();
 SPI_WRITE(0xFF);
 SPI_WAIT();

 SPI_WRITE(0xFF); // read response
 SPI_WAIT();
 by=SPDR & 0x1F;
 if(by != 0x05)   // data block accepted ?
  {
   MMC_CS_ON();
   return 1;
  }

 do
  {
   SPI_WRITE(0xFF);
   SPI_WAIT();
  }while(SPDR !=0xFF); // wait til busy is gone

 MMC_CS_ON();

 return 0;
}
#endif //DOS_WRITE

//######################################################
unsigned char MMCIdentify(void)
//######################################################
{
 unsigned char by;
 unsigned int i;
 unsigned int c_size, c_size_mult, read_bl_len;
 unsigned long drive_size;

//Init SPI with a very slow transfer rate first !

//SPCR SPI Controlregister
// SPIE=0; //No SPI Interrupt
// SPE=1;  //SPI Enable
// DORD=0; //Send MSB first
// MSTR=1; //I am the master !
// CPOL=0; //SCK low if IDLE
// CPHA=0; //SPI Mode 0
// SPR1=1; //SPI Clock = f/128 = 125kHz @16MHz Clock
// SPR0=1; //or f/64 if SPI2X = 1 in SPSR register
 SPCR=0x53;

//SPSR SPI Statusregister
// SPI2X=1; //Double speed for SPI = 250kHz @16MHz Clock
// SPSR=0x01;
 SPSR=0x00;

 for(i=0; i<10; i++)
  {
   SPI_WRITE(0xFF); // give min 74 SPI clock pulses before
                                      // sending commands
   SPI_WAIT();
  }                                      
 
 MMC_CS_OFF();

//send CMD0 for RESET
 SPI_WRITE(MMC_RESET); //command code CMD0
 SPI_WAIT();
 SPI_WRITE(0x00);
 SPI_WAIT();
 SPI_WRITE(0x00);
 SPI_WAIT();
 SPI_WRITE(0x00);
 SPI_WAIT();
 SPI_WRITE(0x00);
 SPI_WAIT();
 SPI_WRITE(0x95); // CMD0 needs a checksum !
 SPI_WAIT();
 SPI_WRITE(0xFF); // get 16 bit response high
 SPI_WAIT();
 SPI_WRITE(0xFF); // get 16 bit response low
 SPI_WAIT();

//repeat CMD1 til result=0
 do
  {
   by=MMCCommand(MMC_INIT,0);
  }while(by!=0);

//read CID
// MMCCommand(MMC_READ_CID,0); // nothing really interesting here

//read CSD Card Specific Data
 MMCCommand(MMC_READ_CSD,0);
 SPI_WRITE(0xFF); // ignore response 0xFE
 SPI_WAIT();

 for(i=0; i<16; i++) //CSD has 128 bits -> 16 bytes
  {
   SPI_WRITE(0xFF);
   SPI_WAIT();
   by=SPDR;
//   ShowHex(by);
   iob[i]=by;
  }

 SPI_WRITE(0xFF); // 16 bit crc follows data
 SPI_WAIT();
 SPI_WRITE(0xFF);
 SPI_WAIT();

//here comes the hard stuff !
//calculate disk size and number of last sector
//that can be used on your mmc/sd card

 c_size=iob[6] & 0x03; //bits 1..0
 c_size<<=10;
 c_size+=(unsigned int)iob[7]<<2;
 c_size+=iob[8]>>6;

 by= iob[5] & 0x0F;
 read_bl_len=1;
 read_bl_len<<=by;

 by=iob[9] & 0x03;
 by<<=1;
 by+=iob[10] >> 7;
 
 c_size_mult=1;
 c_size_mult<<=(2+by);

 drive_size=(unsigned long)(c_size+1) * (unsigned long)c_size_mult * (unsigned long)read_bl_len;
 maxsect= drive_size / BYTE_PER_SEC;

 MMC_CS_ON();

//switch to high speed SPI
// SPR1=0; //SPI Clock = f/4 = 4MHz @16MHz Clock
// SPR0=0; //or f/2 if SPI2X = 1 in SPSR register
 SPCR=0x50;

//SPSR SPI Statusregister
// SPI2X=1; //Double speed for SPI = 8MHz @16MHz Clock
 SPSR=0x01;

 return 0;
}


#endif //MMC_CARD_SPI

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美色综合影院| 国产成人av电影在线观看| 日韩手机在线导航| 粉嫩aⅴ一区二区三区四区五区 | 99精品久久久久久| 亚洲超碰精品一区二区| 久久亚洲私人国产精品va媚药| 国产麻豆精品95视频| 亚洲女同一区二区| 欧美精品日韩精品| 成人激情电影免费在线观看| 亚洲国产日韩精品| 国产网站一区二区| 在线精品亚洲一区二区不卡| 麻豆国产欧美一区二区三区| 日本一区二区免费在线观看视频 | 91香蕉视频mp4| 久久精品国产久精国产爱| 国产精品国产精品国产专区不蜜| 欧美日韩精品一区二区三区| 国产精品一区二区免费不卡| 亚洲18色成人| 久久综合成人精品亚洲另类欧美 | 亚洲免费三区一区二区| 日韩精品在线一区二区| 欧美亚洲国产一区二区三区va | 在线观看91视频| 日本不卡免费在线视频| 亚洲人成精品久久久久| 日韩视频中午一区| 99re在线视频这里只有精品| 久久精品国产99国产| 精品电影一区二区| 欧美日韩国产天堂| av亚洲精华国产精华| 黄色小说综合网站| 三级欧美韩日大片在线看| 亚洲欧洲日韩一区二区三区| 久久影视一区二区| 欧美成人综合网站| 欧美性色黄大片| 色噜噜狠狠成人中文综合| 成人成人成人在线视频| 国产成人精品亚洲777人妖 | 色婷婷av一区二区三区之一色屋| 国产大陆精品国产| 另类小说一区二区三区| 天堂久久久久va久久久久| 一区二区三区四区视频精品免费 | 国产盗摄精品一区二区三区在线 | 亚洲三级在线观看| 亚洲国产成人午夜在线一区| 久久久av毛片精品| 久久综合狠狠综合| 久久久久久久电影| 欧美精品一区二| 欧美精品在线一区二区| 欧美日韩日日骚| 欧美老女人在线| 欧美人牲a欧美精品| 欧美日韩免费一区二区三区视频| 91麻豆免费在线观看| 91浏览器在线视频| 91精彩视频在线观看| 日本韩国欧美三级| 91国在线观看| 欧美人xxxx| 欧美一区二区三区不卡| 日韩免费高清av| 精品动漫一区二区三区在线观看| 欧美成人一区二区| 国产亚洲一区二区在线观看| 国产欧美日韩麻豆91| 国产精品色婷婷| 亚洲精品视频自拍| 一区二区三区欧美日| 亚洲国产精品人人做人人爽| 天天色天天爱天天射综合| 免费在线一区观看| 精品一区二区三区视频在线观看| 国产高清成人在线| 99久久国产综合精品麻豆| 欧美午夜精品久久久| 欧美美女网站色| 精品久久一区二区| 中文字幕一区三区| 午夜在线电影亚洲一区| 男男视频亚洲欧美| 不卡的av在线播放| 欧美老人xxxx18| 国产午夜亚洲精品羞羞网站| 亚洲精品国产a| 日本一区中文字幕 | 国产精品996| 色欧美乱欧美15图片| 欧亚洲嫩模精品一区三区| 欧美日韩精品一区二区三区蜜桃| 欧美www视频| 一区二区免费视频| 成人一区二区三区在线观看| 欧美一区二区三区四区高清| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆| 免费看欧美美女黄的网站| 在线免费观看一区| 中文字幕av一区二区三区高| 免费高清在线一区| 色呦呦网站一区| 国产精品日产欧美久久久久| 久久 天天综合| 欧美日韩电影在线播放| 亚洲欧美日韩综合aⅴ视频| 国模少妇一区二区三区| 91精品国产综合久久精品麻豆| 亚洲品质自拍视频| 国产成人精品一区二| 精品国产电影一区二区| 舔着乳尖日韩一区| 在线观看日韩国产| 亚洲乱码一区二区三区在线观看| 福利一区在线观看| 国产视频一区二区三区在线观看| 久久精品久久99精品久久| 91麻豆精品国产91| 亚洲成人av一区二区三区| 欧美性色综合网| 亚洲自拍偷拍图区| 欧美中文字幕久久| 亚洲一区二区三区激情| 欧美自拍偷拍午夜视频| 亚洲自拍都市欧美小说| 91成人在线观看喷潮| 亚洲一区二区在线观看视频| 91久久精品午夜一区二区| 夜夜亚洲天天久久| 欧美日韩亚洲综合一区| 亚洲午夜三级在线| 7777女厕盗摄久久久| 日韩av一区二区三区四区| 欧美一卡二卡三卡| 成人理论电影网| 久久嫩草精品久久久精品一| 国产一区二区精品久久| 欧美精品一区二区三区高清aⅴ| 久久精品国产亚洲a| 久久亚区不卡日本| 国产成人在线视频网址| 国产精品乱码一区二三区小蝌蚪| 丁香婷婷综合色啪| 综合久久给合久久狠狠狠97色| av电影天堂一区二区在线观看| 综合久久久久久| 欧美日韩午夜在线视频| 免费美女久久99| 久久久亚洲国产美女国产盗摄 | 亚洲成人午夜影院| 9191成人精品久久| 久久99热这里只有精品| 国产日韩欧美电影| 色先锋资源久久综合| 日韩和欧美一区二区三区| 精品国精品国产尤物美女| 粉嫩aⅴ一区二区三区四区| 亚洲女人小视频在线观看| 欧美视频一区在线观看| 美腿丝袜在线亚洲一区| 国产视频一区在线观看| www.欧美日韩| 日日摸夜夜添夜夜添国产精品| 欧美变态tickle挠乳网站| 成人av电影免费观看| 视频一区在线播放| 国产视频一区在线观看| 欧美性色黄大片手机版| 国产专区综合网| 亚洲精品乱码久久久久久日本蜜臀| 91精品免费观看| 国产精品羞羞答答xxdd| 亚洲综合成人在线视频| 亚洲精品一区二区三区精华液 | 成人免费毛片高清视频| 亚洲已满18点击进入久久| 精品成人a区在线观看| 91欧美激情一区二区三区成人| 轻轻草成人在线| 日韩美女视频一区| 日韩精品一区二区三区视频在线观看| a级精品国产片在线观看| 免费在线欧美视频| 依依成人综合视频| 久久久久久久久久久电影| 欧美日韩亚洲丝袜制服| 丁香六月久久综合狠狠色| 视频一区二区欧美| 中文字幕一区日韩精品欧美| 欧美电影免费观看高清完整版在线观看| www.激情成人| 国产精品伊人色| 男女男精品网站| 亚洲午夜日本在线观看| 中文字幕欧美一|