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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? sd.c

?? VS1003_MP3_SPI_SDHC_FAT32
?? C
字號:
#include "sd.h"

extern 	SPI_InitTypeDef SPI_InitStructure;

void FCLK_SLOW() /*set SPI clk <= 400kHz*/
{
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
  SPI_Init (SPI1, &SPI_InitStructure)  ;
}

void FCLK_FAST() /*set SPI clk fast*/			
{
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
  SPI_Init (SPI1, &SPI_InitStructure)  ;
}

void SPI_transmit_m(uint8_t ch)
{
	while((SPI1->SR &SPI_I2S_FLAG_TXE)==RESET);
	SPI_I2S_SendData(SPI1,ch);
	while((SPI1->SR &SPI_I2S_FLAG_RXNE)==RESET);
	SPI_I2S_ReceiveData(SPI1);
}

void SPI_receive_m(uint8_t *ch)
{
	while((SPI1->SR &SPI_I2S_FLAG_TXE)==RESET);
	SPI_I2S_SendData(SPI1,0xff);
	while((SPI1->SR &SPI_I2S_FLAG_RXNE)==RESET);
	*ch = SPI_I2S_ReceiveData(SPI1);
}

uint8_t SD_sendCommand(uint8_t cmd, uint32_t arg)
{
	uint8_t response = 0xff;
	uint8_t retry = 0;

	SD_CS_ASSERT;

	SPI_transmit_m(cmd);          /*send command, first two bits always '01'*****/
	SPI_transmit_m(arg>>24);
	SPI_transmit_m(arg>>16);
	SPI_transmit_m(arg>>8);
	SPI_transmit_m(arg);
	if(cmd == CMD0)
		SPI_transmit_m(0x95);	       /*CRC, it must be 0x95 when cmd0*/
	else if(cmd == CMD8)
		SPI_transmit_m(0x87);
	else 
		SPI_transmit_m(0xff);

	do/*wait response*/
	{
		SPI_receive_m(&response); /*equal to "response = SPI_receive();"*/
    	if(retry++ > 0xfe) break; /*time out*/
	}while(response == 0xff); 
	
	SD_CS_DEASSERT;
	SPI_transmit_m(0xff);            //delay 8 clock

	return response; 
}

uint8_t SD_init(void)
{
	uint8_t response = 0xff;
	uint8_t retry = 0;
	uint8_t i = 0;
		
	FCLK_SLOW(); /*set SPI clk <= 400kHz*/		 

	SD_CS_DEASSERT;
		for(i=0;i<10;i++)
			SPI_transmit_m(0xff); /*74 clk*/
	retry = 0;
	do
	{ 	
		response = SD_sendCommand(CMD0, 0); /*send 'reset & go idle' command, the response should be 0x01 if successfull*/
		retry++;
  		if(retry > 0xfe)
			return 1; /*time out*/
   	}while(response != 0x01);
	
	retry = 0;
	do
	{
		response = SD_sendCommand(CMD8, 0x1aa); /* 判斷 SDHC */
		retry++;
  		if(retry > 0xfe)
			return 1; /*time out*/	
	}while(response != 0x01);

	retry = 0;
	do
	{
		response = SD_sendCommand(CMD55, 0); /*activate card's initialization process, the response should be 0x00 if successfull*/
    	response = SD_sendCommand(0x40+41, 0x40000000); 
		retry++;
    	if(retry > 0xfe) 
	  		return 1; /*time out*/
	}while(response);

	SD_sendCommand(CMD16, 512); /*set block size to 512*/

	FCLK_FAST(); /*set SPI clk fast*/				
	return 0; /*normal return*/
}

uint8_t transmit_DataBlock(
	const uint8_t *buff, /* 512 byte data block to be transmitted */
	uint8_t token /* Data/Stop token */
)
{
	uint8_t response = 0xff; 
	uint8_t bc = 0;
	uint32_t retry = 0;

	SD_CS_ASSERT;
	
	SPI_transmit_m(token); /*send start block token 0xfe (0x11111110)*/

	do /*transmit the 512 byte data block to SD card*/
	{					
		SPI_transmit_m(*buff++);
		SPI_transmit_m(*buff++);
	}while (--bc);

	SPI_transmit_m(0xff); /*CRC (Dummy)*/
	SPI_transmit_m(0xff);

	SPI_receive_m(&response);
	if( (response & 0x1f) != 0x05) /*response= 0bXXX0AAA1 ; AAA='010' - data accepted*/
	{                              /*AAA='101'-data rejected due to CRC error*/
 		 SD_CS_DEASSERT;           /*AAA='110'-data rejected due to write error*/
 		 return 1;
	}

	SPI_receive_m(&response);
	while(response != 0xff) //wait until the SD is not busy
   	{
		SPI_receive_m(&response);
		if(retry++ > 0xfffe){SD_CS_DEASSERT; return 1;}
	}
	SD_CS_DEASSERT;
	SPI_transmit_m(0xff); /*extra 8 clk*/

	return 0;
}




uint8_t receive_DataBlock(
	uint8_t *buff, /* Data buffer to store received data */ 
	uint32_t btr /* Byte count (must be multiple of 4) */
)
{
	uint8_t response = 0xff;
	uint32_t retry = 0;

	SD_CS_ASSERT;
	do /*wait for start block token 0xfe (0x11111110)*/
	{
		SPI_receive_m(&response);
    	if(retry++ > 0xfffe) /*time out error*/
		{
			SD_CS_DEASSERT; 
			return 1;	
		}
	}while(response != 0xfe); /*wait response*/

	do /*Receive the data block into buffer*/
	{								
		SPI_receive_m(buff++);
		SPI_receive_m(buff++);
		SPI_receive_m(buff++);
		SPI_receive_m(buff++);
	}while(btr -= 4);

	SPI_receive_m(&response); /*Discard CRC two bytes*/
	SPI_receive_m(&response);

	SD_CS_DEASSERT;
	SPI_transmit_m(0xff); /*extra 8 clk*/

	return 0;
}


uint8_t SD_writeSingleBlock(const uint8_t *buff, uint32_t startBlock)
{
	if(SD_sendCommand(CMD24, startBlock)) return 1;        //SDHC         //startBlock  *  512  字節
	
	if(transmit_DataBlock(buff, 0xfe)) return 1;

	return 0;
}

uint8_t SD_readSingleBlock(uint8_t *buff, uint32_t startBlock)
{
	if(SD_sendCommand(CMD17, startBlock)) return 1;        //SDHC         //startBlock  字節

	if(receive_DataBlock(buff, 512)) return 1;

	return 0;
}



uint8_t SD_writeMultipleBlock(const uint8_t *buff, uint32_t startBlock, uint32_t totalBlocks)
{
	uint8_t response = 0xff; /*response from sd card*/
	uint8_t bc = 0; 
	uint32_t retry = 0;

	if(SD_sendCommand(CMD25, startBlock)) return 1;

	SD_CS_ASSERT;

	do 
	{
		SPI_transmit_m(0xfc); /*Send start block token 0xfc (0x11111100)*/
   
		do /*ransmit the 512 byte data block to SDC*/
		{						
			SPI_transmit_m(*buff++);
			SPI_transmit_m(*buff++);
		} while (--bc);

		SPI_transmit_m(0xFF); /* CRC (Dummy) */
		SPI_transmit_m(0xFF);
			
		SPI_receive_m(&response);
		if( (response & 0x1f) != 0x05) /*response= 0bXXX0AAA1 ; AAA='010' - data accepted*/
		{                              /*AAA='101'-data rejected due to CRC error*/
 			 SD_CS_DEASSERT;           /*AAA='110'-data rejected due to write error*/
 			 return 1;
		}

		retry = 0;
		SPI_receive_m(&response);
		while(response != 0xff) /*wait for SD card to complete writing and get idle*/
		{
			SPI_receive_m(&response);
			if(retry++ > 0xfffe){SD_CS_DEASSERT; return 1;}
		}
		SPI_transmit_m(0xff);   /*extra 8 bits*/

	}while (--totalBlocks);

	SPI_transmit_m(0xfd); /*send 'stop transmission token'**/
	retry = 0;
	SPI_receive_m(&response);
	while(response != 0xff) //wait for SD card to complete writing and get idle
 	{
		SPI_receive_m(&response);
   		if(retry++ > 0xfffe){SD_CS_DEASSERT; return 1;}
	}
	SD_CS_DEASSERT;
	SPI_transmit_m(0xff);

	return 0;
}



uint8_t SD_readMultipleBlock(uint8_t *buff, uint32_t startBlock, uint32_t totalBlocks)
{
	uint8_t response = 0xff;
	uint32_t retry = 0;
	uint32_t nbyte = 512;

	if(SD_sendCommand(CMD18, startBlock)) return 1;

	SD_CS_ASSERT;

	do 
	{	
		do /*wait for start block token 0xfe (0x11111110)*/
		{
			SPI_receive_m(&response);
    		if(retry++ > 0xfffe) /*time out error*/
			{
				SD_CS_DEASSERT; 
				return 1;	
			}
		}while(response != 0xfe); /*wait response*/

		do /*Receive the data block into buffer*/
		{							
			SPI_receive_m(buff++);
			SPI_receive_m(buff++);
			SPI_receive_m(buff++);
			SPI_receive_m(buff++);
		}while (nbyte -= 4);

		SPI_receive_m(&response); /*Discard CRC*/
		SPI_receive_m(&response);

		nbyte = 512;
		retry = 0;

	}while (--totalBlocks);

	SD_sendCommand(CMD12, 0); /*STOP_TRANSMISSION*/

	SD_CS_DEASSERT;
	SPI_transmit_m(0xff); /*extra 8 clk*/

	return 0;
}

uint8_t SD_erase(uint32_t startBlock, uint32_t totalBlocks)
{
	uint8_t response;

	response = SD_sendCommand(CMD32, startBlock); /*send starting block address*/
	if(response != 0x00) /*check for SD status: 0x00 is OK*/
  		return response;

	response = SD_sendCommand(CMD33,(startBlock + totalBlocks - 1)); /*send end block address*/
	if(response != 0x00)
  		return response;

	response = SD_sendCommand(CMD38, 0); /*erase all selected blocks*/
	if(response != 0x00)
  		return response;

	return 0; /*normal return*/
}









?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产一区二区三区精品视频| 亚洲欧美日韩久久精品| 亚洲电影中文字幕在线观看| 欧美色图一区二区三区| 国产精品全国免费观看高清| 裸体在线国模精品偷拍| 国产精品视频一二三区| 日韩精品一区二| 韩国精品主播一区二区在线观看 | 日韩精品五月天| 一本大道av一区二区在线播放 | 欧美日韩国产高清一区二区| 国内精品久久久久影院色| 美腿丝袜亚洲色图| 国产福利一区在线| 日韩avvvv在线播放| 亚洲色图丝袜美腿| 国产校园另类小说区| 欧美性受极品xxxx喷水| 欧美亚洲尤物久久| 欧美日韩国产综合草草| 欧美日韩国产电影| 26uuu国产一区二区三区| 欧美日韩一区精品| 91.xcao| 色综合久久综合中文综合网| 欧美午夜精品久久久久久超碰 | 本田岬高潮一区二区三区| 免费在线看成人av| 亚洲一区二区美女| 亚洲三级理论片| 午夜欧美2019年伦理| 亚洲一级二级在线| 久久se这里有精品| 久久激情综合网| 成人国产视频在线观看| 成人看片黄a免费看在线| 久久99国产精品麻豆| 蜜乳av一区二区三区| proumb性欧美在线观看| 欧美日韩高清在线播放| 久久人人爽爽爽人久久久| 亚洲精品一区二区三区四区高清| 欧美精品 国产精品| 3atv在线一区二区三区| 国产欧美日韩麻豆91| 国产女人18水真多18精品一级做| 欧美精品一区二区三区高清aⅴ | 国产精品超碰97尤物18| 亚洲国产成人一区二区三区| 国产日韩成人精品| 天堂影院一区二区| av高清不卡在线| 一区二区三区四区中文字幕| 首页综合国产亚洲丝袜| 色视频一区二区| 欧美一区二区在线视频| 99精品在线免费| 91美女在线看| 在线视频你懂得一区二区三区| 97精品久久久午夜一区二区三区 | 色综合中文字幕国产| 成人久久18免费网站麻豆| 日本精品一级二级| 777色狠狠一区二区三区| 亚洲丝袜精品丝袜在线| 国产河南妇女毛片精品久久久| 日韩一二三四区| 国产亚洲人成网站| 美女被吸乳得到大胸91| 欧美老年两性高潮| 亚洲图片一区二区| 欧美性猛交一区二区三区精品 | 99re热这里只有精品视频| 久久精品综合网| 国产成人鲁色资源国产91色综| 欧美一区二区三区精品| 奇米精品一区二区三区在线观看 | 日本福利一区二区| 亚洲欧洲日产国产综合网| 亚洲国产一区二区a毛片| 99久久精品免费看| 中文字幕日本不卡| 国产成人免费在线视频| 日本一区二区三区国色天香| 成人午夜电影小说| 亚洲欧美一区二区视频| 97久久久精品综合88久久| 一区二区三区鲁丝不卡| 欧美精品xxxxbbbb| 精品一区二区影视| 国产精品毛片a∨一区二区三区| 成人av集中营| 亚洲午夜精品在线| 亚洲精品在线观看网站| 国产一区二区三区电影在线观看| 国产午夜一区二区三区| 95精品视频在线| 亚洲成人久久影院| 国产成人啪免费观看软件| 综合久久久久综合| 欧美日本在线播放| 国产九九视频一区二区三区| 91精品在线免费| 国产一区二区三区久久久| 亚洲欧美另类综合偷拍| 337p亚洲精品色噜噜狠狠| 国产在线不卡一区| 一区二区三区在线视频观看| 欧美一二三区精品| 丁香六月综合激情| 午夜精品视频在线观看| 国产区在线观看成人精品| 99视频国产精品| 首页国产欧美日韩丝袜| 国产精品美日韩| 欧美精品日日鲁夜夜添| 国产美女一区二区| 亚洲欧美自拍偷拍| 日韩精品一区二区三区中文精品| 成人h精品动漫一区二区三区| 午夜久久久久久久久| 国产欧美精品日韩区二区麻豆天美| 欧洲在线/亚洲| 国产成人精品免费在线| 免费在线观看成人| 亚洲精品一二三四区| 国产成人av福利| 亚洲精品在线免费播放| 欧美日韩一级视频| 99这里都是精品| 国产经典欧美精品| 轻轻草成人在线| 亚洲午夜免费福利视频| 国产精品久久久久久妇女6080| 欧美精品一区二区三区一线天视频 | 国产一区二区视频在线| 一区二区三区四区不卡在线 | 日本黄色一区二区| 丁香另类激情小说| 国产一区二区三区最好精华液| 青青国产91久久久久久| 夜夜精品视频一区二区 | 欧美性videosxxxxx| 成人av综合一区| 国产一本一道久久香蕉| 美腿丝袜亚洲色图| 日本视频免费一区| 蜜桃久久av一区| 九九精品视频在线看| 另类小说图片综合网| 美国三级日本三级久久99| 性欧美疯狂xxxxbbbb| 午夜久久久影院| 亚洲图片欧美激情| 亚洲免费资源在线播放| 亚洲欧洲日产国产综合网| 18欧美乱大交hd1984| 国产精品乱子久久久久| 中文字幕免费观看一区| 国产精品久久久久久久久免费丝袜| 久久久久久久综合色一本| 国产三级精品视频| 国产精品美女久久久久aⅴ | 亚洲国产精品综合小说图片区| 亚洲少妇30p| 亚洲欧美日韩中文播放| 亚洲3atv精品一区二区三区| 五月激情六月综合| 极品少妇xxxx偷拍精品少妇| 国产在线日韩欧美| thepron国产精品| 在线视频欧美区| 欧美区在线观看| 精品国产区一区| 国产精品久久久一本精品| 亚洲日本护士毛茸茸| 一区二区三区在线看| 香蕉成人啪国产精品视频综合网 | 国产欧美综合在线观看第十页| 中文字幕av资源一区| 亚洲免费av高清| 奇米精品一区二区三区在线观看一| 国产黄色成人av| 在线日韩一区二区| 日韩一区二区三区四区五区六区| 日韩免费高清av| 国产精品久久久久久久久果冻传媒 | 麻豆免费看一区二区三区| 国产不卡高清在线观看视频| 在线观看日韩一区| 精品国产制服丝袜高跟| 亚洲欧洲性图库| 激情综合色综合久久| 91老师国产黑色丝袜在线| 日韩一区二区在线观看视频播放| 国产三级精品三级在线专区| 亚洲成人自拍一区| 成人高清视频免费观看| 日韩一区二区在线观看视频|