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

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

?? mmc.c

?? STM32F RFID通訊源代碼(支持雙向發(fā)送接收)
?? C
字號:
// mmc.c : MultiMediaCard functions: init, read, write ...
//
// Rolf Freitag 5/2003
//

// MMC Lib
#ifndef _MMCLIB_C
#define _MMCLIB_C
//---------------------------------------------------------------------

#include "mmc.h"
#include "stm32f10x_lib.h"
#include "bits.h"
#include <string.h>

// macro defines
#define CS_LOW()  GPIOB->BRR   |= BIT12	// Card Select
#define CS_HIGH() GPIOB->BSRR  |= BIT12  // Card Deselect

#define DUMMY 0xff

char mmcGetResponse(void);
char mmcGetXXResponse(const char resp);
char mmcCheckBusy(void);
void initSPI (void);


// Buffer for mmc i/o for data and registers
char mmc_buffer[512] = { 0 };	

// setup usart1 in spi mode
void initSPI (void)
{

  SPI_InitTypeDef  SPI_InitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;

  // Enable SPI2 and GPIOB, GPIOC clocks
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC, ENABLE);

  // Configure SPI1 pins: SCK, MISO and MOSI
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  // Configure PB12 as Output push-pull, used as CE
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  // CE high
  GPIO_WriteBit(GPIOB, GPIO_Pin_12, Bit_SET);


  // SPI1 configuration
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  SPI_InitStructure.SPI_CRCPolynomial = 7;
  SPI_Init(SPI2, &SPI_InitStructure);

  // Enable SPI2
  SPI_Cmd(SPI2, ENABLE);

}


// Initialisieren
char initMMC (void)
{

  //raise SS and MOSI for 80 clock cycles
  //SendByte(0xff) 10 times with SS high
  //RAISE SS
  int i;
  char response=0x01;

  // Start iniMMC......
  initSPI();
  //initialization sequence on PowerUp
  CS_HIGH();
  for(i=0;i<=9;i++)
    spiSendByte(0xff);
  CS_LOW();
  //Send Command 0 to put MMC in SPI mode
  mmcSendCmd(0x00,0,0x95);
  //Now wait for READY RESPONSE
  if(mmcGetResponse()!=0x01);
  // debug_printf("no responce");

  while(response==0x01)
  {
   CS_HIGH();
   spiSendByte(0xff);
   CS_LOW();
   mmcSendCmd(0x01,0x00,0xff);
   response=mmcGetResponse();
  }
  CS_HIGH();
  spiSendByte(0xff);

  return MMC_SUCCESS;
}



// Ti added mmc Get Responce
char mmcGetResponse(void)
{
  //Response comes 1-8bytes after command
  //the first bit will be a 0
  //followed by an error code
  //data will be 0xff until response
  int i=0;

  char response;

  while(i<=64)
  {
   response=spiSendByte(0xff);
   if(response==0x00)break;
   if(response==0x01)break;
   i++;
  }
  return response;
}

char mmcGetXXResponse(const char resp)
{
  //Response comes 1-8bytes after command
  //the first bit will be a 0
  //followed by an error code
  //data will be 0xff until response
  int i=0;

  char response;

  while(i<=500)
  {
   response=spiSendByte(0xff);
   if(response==resp)break;
   i++;
  }
  return response;
}

char mmcCheckBusy(void)
{
  //Response comes 1-8bytes after command
  //the first bit will be a 0
  //followed by an error code
  //data will be 0xff until response
  int i=0;

  char response;
  char rvalue;
  while(i<=64)
  {
   response=spiSendByte(0xff);
   response &= 0x1f;
   switch(response)
    {
     case 0x05: rvalue=MMC_SUCCESS;break;
     case 0x0b: return(MMC_CRC_ERROR);
     case 0x0d: return(MMC_WRITE_ERROR);
     default:
	      rvalue = MMC_OTHER_ERROR;
	      break;
    }
   if(rvalue==MMC_SUCCESS)break;
    i++;
  }
  i=0;
  do
  {
   response=spiSendByte(0xff);
   i++;
  }while(response==0);
  return response;
}

// The card will respond with a standard response token followed by a data
// block suffixed with a 16 bit CRC.
// Ti Modification: long int -> long ; int -> long
char mmcReadBlock(const unsigned long address, const unsigned long count)
{
  unsigned long i = 0;
  char rvalue = MMC_RESPONSE_ERROR;

  // Set the block length to read
  if (mmcSetBlockLength (count) == MMC_SUCCESS)	// block length could be set
    {
      // SS = LOW (on)
      CS_LOW ();
      // send read command MMC_READ_SINGLE_BLOCK=CMD17
      mmcSendCmd (17,address, 0xFF);
      // Send 8 Clock pulses of delay, check if the MMC acknowledged the read block command
      // it will do this by sending an affirmative response
      // in the R1 format (0x00 is no errors)
      if (mmcGetResponse() == 0x00)
	{
	  // now look for the data token to signify the start of
	  // the data
	  if (mmcGetXXResponse(MMC_START_DATA_BLOCK_TOKEN) == MMC_START_DATA_BLOCK_TOKEN)
	    {
	      // clock the actual data transfer and receive the bytes; spi_read automatically finds the Data Block
	      for (i = 0; i < 512; i++)
		mmc_buffer[i] = spiSendByte(0xff);	// is executed with card inserted

	      // get CRC bytes (not really needed by us, but required by MMC)
	      spiSendByte(0xff);
	      spiSendByte(0xff);
	      rvalue = MMC_SUCCESS;
	    }
	  else
	    {
	      // the data token was never received
	      rvalue = MMC_DATA_TOKEN_ERROR;	// 3
	    }
	}
      else
	{
	  // the MMC never acknowledge the read command
	  rvalue = MMC_RESPONSE_ERROR;	// 2
	}
    }
  else
    {
      rvalue = MMC_BLOCK_SET_ERROR;	// 1
    }
  CS_HIGH ();
  spiSendByte(0xff);
  return rvalue;
}				// mmc_read_block

//---------------------------------------------------------------------
// Ti Modification: long int -> long
char mmcWriteBlock (const unsigned long address)
{
  unsigned long i = 0;
  char rvalue = MMC_RESPONSE_ERROR;	// MMC_SUCCESS;
  //char c = 0x00;

  // Set the block length to read
  if (mmcSetBlockLength (512) == MMC_SUCCESS)	// block length could be set
    {
      // SS = LOW (on)
      CS_LOW ();
      // send write command
      mmcSendCmd (24,address, 0xFF);

      // check if the MMC acknowledged the write block command
      // it will do this by sending an affirmative response
      // in the R1 format (0x00 is no errors)
      if (mmcGetXXResponse(MMC_R1_RESPONSE) == MMC_R1_RESPONSE)
	{
	  spiSendByte(0xff);
	  // send the data token to signify the start of the data
	  spiSendByte(0xfe);
	  // clock the actual data transfer and transmitt the bytes
	  for (i = 0; i < 512; i++)
	    spiSendByte(mmc_buffer[i]);	// mmc_buffer[i];       Test: i & 0xff
	  // put CRC bytes (not really needed by us, but required by MMC)
	  spiSendByte(0xff);
	  spiSendByte(0xff);
	  // read the data response xxx0<status>1 : status 010: Data accected, status 101: Data
	  //   rejected due to a crc error, status 110: Data rejected due to a Write error.
          mmcCheckBusy();
	}
      else
	{
	  // the MMC never acknowledge the write command
	  rvalue = MMC_RESPONSE_ERROR;	// 2
	}
    }
  else
    {
      rvalue = MMC_BLOCK_SET_ERROR;	// 1
    }
  // give the MMC the required clocks to finish up what ever it needs to do
  //  for (i = 0; i < 9; ++i)
  //    spiSendByte(0xff);

  CS_HIGH ();
  // Send 8 Clock pulses of delay.
  spiSendByte(0xff);
  return rvalue;
}				// mmc_write_block





//---------------------------------------------------------------------
void mmcSendCmd (const char cmd, unsigned long data, const char crc)
{
  char frame[6];
  char temp;
  int i;

  frame[0]=(cmd|0x40);
  for(i=3;i>=0;i--){
    temp=(char)(data>>(8*i));
    frame[4-i]=(temp);
  }
  frame[5]=(crc);
  for(i=0;i<6;i++)
    spiSendByte(frame[i]);
}


//--------------- set blocklength 2^n ------------------------------------------------------
// Ti Modification: long int-> long
char mmcSetBlockLength (const unsigned long blocklength)
{
  //char rValue = MMC_TIMEOUT_ERROR;
  //char i = 0;

  // SS = LOW (on)
  CS_LOW ();

  // Set the block length to read
  //MMC_SET_BLOCKLEN =CMD16
  mmcSendCmd(16, blocklength, 0xFF);

  // get response from MMC - make sure that its 0x00 (R1 ok response format)
  if(mmcGetResponse()!=0x00);

  CS_HIGH ();

  // Send 8 Clock pulses of delay.
  spiSendByte(0xff);

  return MMC_SUCCESS;
}				// block_length

//TI added substitution routine for spi_read and spi_write
unsigned char spiSendByte(const unsigned char data)
{

  // Loop while DR register in not emplty
  while(SPI_GetFlagStatus(SPI2, SPI_FLAG_TXE) == RESET);

  // Send byte through the SPI1 peripheral
  SPI_SendData(SPI2, data);	

  // Wait to receive a byte
  while(SPI_GetFlagStatus(SPI2, SPI_FLAG_RXNE) == RESET);

  // Return the byte read from the SPI bus
  return SPI_ReceiveData(SPI2);

}


// Reading the contents of the CSD and CID registers in SPI mode is a simple
// read-block transaction.
char mmcReadRegister (const char cmd_register, const unsigned char length)
{
  char uc = 0;
  char rvalue = MMC_TIMEOUT_ERROR;
//  char i = 0;

  if (mmcSetBlockLength (length) == MMC_SUCCESS)
    {
      CS_LOW ();
      // CRC not used: 0xff as last byte
      mmcSendCmd(cmd_register, 0x000000, 0xff);

      // wait for response
      // in the R1 format (0x00 is no errors)
      if (mmcGetResponse() == 0x00)
	{
	 if (mmcGetXXResponse(0xfe)== 0xfe)
	    for (uc = 0; uc < length; uc++)
	      mmc_buffer[uc] = spiSendByte(0xff);
	  // get CRC bytes (not really needed by us, but required by MMC)
	  spiSendByte(0xff);
	  spiSendByte(0xff);
	}
      else
	rvalue = MMC_RESPONSE_ERROR;
      // CS = HIGH (off)
      CS_HIGH ();

      // Send 8 Clock pulses of delay.
      spiSendByte(0xff);
    }
  CS_HIGH ();
  return rvalue;
}				// mmc_read_register

//---------------------------------------------------------------------
#endif /* _MMCLIB_C */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91国偷自产一区二区开放时间 | 欧美亚洲另类激情小说| 国产亚洲精品免费| 国产精品一区二区果冻传媒| 久久品道一品道久久精品| 精品亚洲免费视频| 久久精品视频网| 成人av电影在线播放| 一区二区三区四区亚洲| 欧美日韩夫妻久久| 卡一卡二国产精品| 国产日韩欧美a| 99久久精品国产一区| 亚洲一区二区黄色| 欧美成人精品1314www| 另类小说一区二区三区| 国产欧美一区二区三区鸳鸯浴 | 蜜桃视频第一区免费观看| 91精品国产综合久久久久久漫画 | 欧美视频精品在线| 一区二区在线观看免费| 欧美色涩在线第一页| 日韩av二区在线播放| 久久久噜噜噜久久中文字幕色伊伊| 欧美激情一区二区三区蜜桃视频 | 亚洲va中文字幕| 日韩免费高清av| 大尺度一区二区| 亚洲一区二区三区四区中文字幕 | 国产福利视频一区二区三区| 亚洲婷婷综合色高清在线| 欧美日韩亚洲综合在线| 黄色精品一二区| 亚洲免费成人av| 26uuu久久天堂性欧美| 色婷婷综合久久久| 国产精品一区二区在线播放| 亚洲午夜一区二区三区| 久久久美女毛片| 91麻豆精品国产91久久久使用方法| 18欧美亚洲精品| 91精品国产综合久久福利| 成人免费视频一区| 六月丁香婷婷久久| 亚洲一区二区三区小说| 久久综合九色欧美综合狠狠| 欧美亚洲一区三区| 成人激情动漫在线观看| 蜜桃视频在线一区| 婷婷开心激情综合| 亚洲色图在线视频| 国产拍欧美日韩视频二区| 欧美一区二区女人| 欧美亚洲图片小说| 91视频免费看| 不卡一区二区在线| 国产老肥熟一区二区三区| 午夜天堂影视香蕉久久| 亚洲最新视频在线观看| 国产精品久久久久影视| 国产拍欧美日韩视频二区| 欧美一级高清大全免费观看| 欧美在线视频你懂得| 99re热视频精品| 成人手机在线视频| 成人天堂资源www在线| 国产一区二区看久久| 麻豆国产一区二区| 日本va欧美va精品发布| 午夜精彩视频在线观看不卡| 亚洲另类一区二区| 亚洲人成小说网站色在线| 国产欧美一区二区精品秋霞影院| 成人一二三区视频| 国产在线一区二区| 精品在线视频一区| 国产综合成人久久大片91| 婷婷综合另类小说色区| 亚洲午夜精品久久久久久久久| 欧美精品视频www在线观看| 91丝袜高跟美女视频| 99视频精品在线| 91免费版在线看| 色综合久久天天综合网| 色婷婷综合久久久久中文| 在线精品视频免费播放| 欧美四级电影在线观看| 91麻豆精品国产91久久久更新时间 | 日韩成人一区二区三区在线观看| 精品少妇一区二区| 欧美大胆一级视频| 精品国产亚洲在线| 久久综合九色综合97婷婷女人| 国产精品影视在线观看| 国产成a人无v码亚洲福利| 国产精品亚洲一区二区三区在线| 最新中文字幕一区二区三区 | 91精品国产91热久久久做人人| 国产精品一区二区在线播放| 激情欧美一区二区三区在线观看| 一区二区成人在线视频| 五月激情丁香一区二区三区| 视频一区中文字幕| 国产在线国偷精品产拍免费yy| 亚洲一区二区五区| 婷婷综合另类小说色区| 国产一区 二区| 99久久婷婷国产综合精品| 欧美日韩国产一区二区三区地区| 不卡一区二区在线| 欧美高清你懂得| 精品sm在线观看| 亚洲品质自拍视频网站| 日韩av在线发布| 国产精品亚洲成人| 欧美视频日韩视频在线观看| 久久综合给合久久狠狠狠97色69| 91精品国产乱码| 欧美国产欧美亚州国产日韩mv天天看完整| 欧美人与性动xxxx| 26uuu另类欧美| 亚洲宅男天堂在线观看无病毒| 国产精品理伦片| 日韩精品一区第一页| 国产精品亚洲第一区在线暖暖韩国| 久久黄色级2电影| 日本高清成人免费播放| 日韩美女视频一区二区在线观看| 欧美一区二区三区四区视频| 国产精品毛片大码女人| 午夜精品久久一牛影视| 久久99蜜桃精品| 日韩一区二区三区av| 国产精品乱码一区二三区小蝌蚪| 日韩欧美国产三级| 一区二区三区在线免费播放| 麻豆精品视频在线观看视频| 在线亚洲免费视频| 国产日韩欧美制服另类| 免费人成黄页网站在线一区二区| 久久99久久99| 在线观看网站黄不卡| 国产欧美日韩久久| 激情综合色播五月| 欧美电影一区二区三区| 亚洲精品高清在线| 99久久国产综合色|国产精品| 色先锋资源久久综合| 久久综合久久综合亚洲| 日韩精品一级二级| 欧美三级电影在线看| 日韩一区在线播放| 波多野结衣在线一区| 国产午夜精品美女毛片视频| 国产在线播精品第三| 亚洲另类在线视频| 色综合久久综合网| 亚洲人成精品久久久久久| 丰满白嫩尤物一区二区| 国产欧美日韩久久| 床上的激情91.| 国产女主播在线一区二区| 国产一区二区三区高清播放| 欧美精品一区二区三区一线天视频| 欧美极品少妇xxxxⅹ高跟鞋 | 91精品办公室少妇高潮对白| 国产精品美女一区二区| 成人激情免费网站| 亚洲免费观看高清| 日本高清成人免费播放| 午夜天堂影视香蕉久久| 欧美日韩一二区| 日本vs亚洲vs韩国一区三区 | 国精产品一区一区三区mba视频| 国产成人在线影院| 国产色产综合色产在线视频| 国产精品影视在线| 亚洲国产精品t66y| 91在线视频网址| 亚洲美女屁股眼交3| 在线中文字幕一区| 视频一区视频二区在线观看| 欧美一区二区福利在线| 国产一区二区毛片| 欧美激情艳妇裸体舞| 91尤物视频在线观看| 亚洲成av人片在www色猫咪| 欧美一级黄色大片| 国产又粗又猛又爽又黄91精品| 欧美日韩亚洲高清一区二区| 日韩av高清在线观看| 久久久久久免费网| 91丝袜国产在线播放| 亚欧色一区w666天堂| 精品国产在天天线2019| 成人午夜在线播放| 亚洲一区二区三区三| 精品美女在线播放| 91麻豆精品秘密| 蜜乳av一区二区三区|