The Firest Version
This commit is contained in:
295
HARDWARE/SDIO/sdio_sdcard.c
Normal file
295
HARDWARE/SDIO/sdio_sdcard.c
Normal file
@@ -0,0 +1,295 @@
|
||||
#include "sdio_sdcard.h"
|
||||
#include "string.h"
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB>ѧϰʹ<CFB0>ã<EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD><C9A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD><CEBA><EFBFBD>;
|
||||
//ALIENTEK STM32F429<32><39><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//SD<53><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//<2F><><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD>@ALIENTEK
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̳:www.openedv.com
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:2016/1/16
|
||||
//<2F>汾<EFBFBD><E6B1BE>V1.0
|
||||
//<2F><>Ȩ<EFBFBD><C8A8><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD><D8BE><EFBFBD>
|
||||
//Copyright(C) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿƼ<D3BF><C6BC><EFBFBD><EFBFBD><EFBFBD>˾ 2014-2024
|
||||
//All rights reserved
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
SD_HandleTypeDef SDCARD_Handler; //SD<53><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
HAL_SD_CardInfoTypedef SDCardInfo; //SD<53><44><EFBFBD><EFBFBD>Ϣ<EFBFBD>ṹ<EFBFBD><E1B9B9>
|
||||
DMA_HandleTypeDef SDTxDMAHandler,SDRxDMAHandler; //SD<53><44>DMA<4D><41><EFBFBD>ͺͽ<CDBA><CDBD>վ<EFBFBD><D5BE><EFBFBD>
|
||||
|
||||
//SD_ReadDisk/SD_WriteDisk<73><6B><EFBFBD><EFBFBD>ר<EFBFBD><D7A8>buf,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>4<EFBFBD>ֽڶ<D6BD><DAB6><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>,
|
||||
//<2F><>Ҫ<EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,ȷ<><C8B7><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7>4<EFBFBD>ֽڶ<D6BD><DAB6><EFBFBD><EFBFBD><EFBFBD>.
|
||||
__align(4) u8 SDIO_DATA_BUFFER[512];
|
||||
|
||||
//SD<53><44><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>
|
||||
//<2F><><EFBFBD><EFBFBD>ֵ:0 <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
u8 SD_Init(void)
|
||||
{
|
||||
u8 SD_Error;
|
||||
|
||||
//<2F><>ʼ<EFBFBD><CABC>ʱ<EFBFBD><CAB1>ʱ<EFBFBD>Ӳ<EFBFBD><D3B2>ܴ<EFBFBD><DCB4><EFBFBD>400KHZ
|
||||
SDCARD_Handler.Instance=SDIO;
|
||||
SDCARD_Handler.Init.ClockEdge=SDIO_CLOCK_EDGE_RISING; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
SDCARD_Handler.Init.ClockBypass=SDIO_CLOCK_BYPASS_DISABLE; //<2F><>ʹ<EFBFBD><CAB9>bypassģʽ<C4A3><CABD>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD>HCLK<4C><4B><EFBFBD>з<EFBFBD>Ƶ<EFBFBD>õ<EFBFBD>SDIO_CK
|
||||
SDCARD_Handler.Init.ClockPowerSave=SDIO_CLOCK_POWER_SAVE_DISABLE; //<2F><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>ر<EFBFBD>ʱ<EFBFBD>ӵ<EFBFBD>Դ
|
||||
SDCARD_Handler.Init.BusWide=SDIO_BUS_WIDE_1B; //1λ<31><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
SDCARD_Handler.Init.HardwareFlowControl=SDIO_HARDWARE_FLOW_CONTROL_DISABLE;//<2F>ر<EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
SDCARD_Handler.Init.ClockDiv=SDIO_TRANSFER_CLK_DIV; //SD<53><44><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>25MHZ
|
||||
|
||||
SD_Error=HAL_SD_Init(&SDCARD_Handler,&SDCardInfo);
|
||||
if(SD_Error!=SD_OK) return 1;
|
||||
|
||||
SD_Error=HAL_SD_WideBusOperation_Config(&SDCARD_Handler,SDIO_BUS_WIDE_4B);//ʹ<>ܿ<EFBFBD><DCBF><EFBFBD><EFBFBD><EFBFBD>ģʽ
|
||||
if(SD_Error!=SD_OK) return 2;
|
||||
return 0;
|
||||
}
|
||||
|
||||
//SDMMC<4D>ײ<EFBFBD><D7B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>ʹ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD>DMA<4D><41><EFBFBD><EFBFBD>
|
||||
//<2F>˺<EFBFBD><CBBA><EFBFBD><EFBFBD>ᱻHAL_SD_Init()<29><><EFBFBD><EFBFBD>
|
||||
//hsd:SD<53><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
void HAL_SD_MspInit(SD_HandleTypeDef *hsd)
|
||||
{
|
||||
DMA_HandleTypeDef TxDMAHandler,RxDMAHandler;
|
||||
GPIO_InitTypeDef GPIO_Initure;
|
||||
|
||||
__HAL_RCC_SDIO_CLK_ENABLE(); //ʹ<><CAB9>SDIOʱ<4F><CAB1>
|
||||
__HAL_RCC_DMA2_CLK_ENABLE(); //ʹ<><CAB9>DMA2ʱ<32><CAB1>
|
||||
__HAL_RCC_GPIOC_CLK_ENABLE(); //ʹ<><CAB9>GPIOCʱ<43><CAB1>
|
||||
__HAL_RCC_GPIOD_CLK_ENABLE(); //ʹ<><CAB9>GPIODʱ<44><CAB1>
|
||||
|
||||
//PC8,9,10,11,12
|
||||
GPIO_Initure.Pin=GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12;
|
||||
GPIO_Initure.Mode=GPIO_MODE_AF_PP; //<2F><><EFBFBD>츴<EFBFBD><ECB8B4>
|
||||
GPIO_Initure.Pull=GPIO_PULLUP; //<2F><><EFBFBD><EFBFBD>
|
||||
GPIO_Initure.Speed=GPIO_SPEED_HIGH; //<2F><><EFBFBD><EFBFBD>
|
||||
GPIO_Initure.Alternate=GPIO_AF12_SDIO; //<2F><><EFBFBD><EFBFBD>ΪSDIO
|
||||
HAL_GPIO_Init(GPIOC,&GPIO_Initure); //<2F><>ʼ<EFBFBD><CABC>
|
||||
|
||||
//PD2
|
||||
GPIO_Initure.Pin=GPIO_PIN_2;
|
||||
HAL_GPIO_Init(GPIOD,&GPIO_Initure); //<2F><>ʼ<EFBFBD><CABC>
|
||||
|
||||
#if (SD_DMA_MODE==1) //ʹ<><CAB9>DMAģʽ
|
||||
HAL_NVIC_SetPriority(SDMMC1_IRQn,2,0); //<2F><><EFBFBD><EFBFBD>SDMMC1<43>жϣ<D0B6><CFA3><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD>ȼ<EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD>0
|
||||
HAL_NVIC_EnableIRQ(SDMMC1_IRQn); //ʹ<><CAB9>SDMMC1<43>ж<EFBFBD>
|
||||
|
||||
//<2F><><EFBFBD>÷<EFBFBD><C3B7><EFBFBD>DMA
|
||||
SDRxDMAHandler.Instance=DMA2_Stream3;
|
||||
SDRxDMAHandler.Init.Channel=DMA_CHANNEL_4;
|
||||
SDRxDMAHandler.Init.Direction=DMA_PERIPH_TO_MEMORY;
|
||||
SDRxDMAHandler.Init.PeriphInc=DMA_PINC_DISABLE;
|
||||
SDRxDMAHandler.Init.MemInc=DMA_MINC_ENABLE;
|
||||
SDRxDMAHandler.Init.PeriphDataAlignment=DMA_PDATAALIGN_WORD;
|
||||
SDRxDMAHandler.Init.MemDataAlignment=DMA_MDATAALIGN_WORD;
|
||||
SDRxDMAHandler.Init.Mode=DMA_PFCTRL;
|
||||
SDRxDMAHandler.Init.Priority=DMA_PRIORITY_VERY_HIGH;
|
||||
SDRxDMAHandler.Init.FIFOMode=DMA_FIFOMODE_ENABLE;
|
||||
SDRxDMAHandler.Init.FIFOThreshold=DMA_FIFO_THRESHOLD_FULL;
|
||||
SDRxDMAHandler.Init.MemBurst=DMA_MBURST_INC4;
|
||||
SDRxDMAHandler.Init.PeriphBurst=DMA_PBURST_INC4;
|
||||
|
||||
__HAL_LINKDMA(hsd, hdmarx, SDRxDMAHandler); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>DMA<4D><41>SD<53><44><EFBFBD>ķ<EFBFBD><C4B7><EFBFBD>DMA<4D><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
HAL_DMA_DeInit(&SDRxDMAHandler);
|
||||
HAL_DMA_Init(&SDRxDMAHandler); //<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>DMA
|
||||
|
||||
//<2F><><EFBFBD>ý<EFBFBD><C3BD><EFBFBD>DMA
|
||||
SDTxDMAHandler.Instance=DMA2_Stream6;
|
||||
SDTxDMAHandler.Init.Channel=DMA_CHANNEL_4;
|
||||
SDTxDMAHandler.Init.Direction=DMA_MEMORY_TO_PERIPH;
|
||||
SDTxDMAHandler.Init.PeriphInc=DMA_PINC_DISABLE;
|
||||
SDTxDMAHandler.Init.MemInc=DMA_MINC_ENABLE;
|
||||
SDTxDMAHandler.Init.PeriphDataAlignment=DMA_PDATAALIGN_WORD;
|
||||
SDTxDMAHandler.Init.MemDataAlignment=DMA_MDATAALIGN_WORD;
|
||||
SDTxDMAHandler.Init.Mode=DMA_PFCTRL;
|
||||
SDTxDMAHandler.Init.Priority=DMA_PRIORITY_VERY_HIGH;
|
||||
SDTxDMAHandler.Init.FIFOMode=DMA_FIFOMODE_ENABLE;
|
||||
SDTxDMAHandler.Init.FIFOThreshold=DMA_FIFO_THRESHOLD_FULL;
|
||||
SDTxDMAHandler.Init.MemBurst=DMA_MBURST_INC4;
|
||||
SDTxDMAHandler.Init.PeriphBurst=DMA_PBURST_INC4;
|
||||
|
||||
__HAL_LINKDMA(hsd, hdmatx, SDTxDMAHandler);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>DMA<4D><41>SD<53><44><EFBFBD>ķ<EFBFBD><C4B7><EFBFBD>DMA<4D><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
HAL_DMA_DeInit(&SDTxDMAHandler);
|
||||
HAL_DMA_Init(&SDTxDMAHandler); //<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>DMA
|
||||
|
||||
|
||||
HAL_NVIC_SetPriority(DMA2_Stream3_IRQn, 3, 0); //<2F><><EFBFBD><EFBFBD>DMA<4D>ж<EFBFBD><D0B6><EFBFBD><EFBFBD>ȼ<EFBFBD>
|
||||
HAL_NVIC_EnableIRQ(DMA2_Stream3_IRQn);
|
||||
HAL_NVIC_SetPriority(DMA2_Stream6_IRQn, 3, 0); //<2F><><EFBFBD><EFBFBD>DMA<4D>ж<EFBFBD><D0B6><EFBFBD><EFBFBD>ȼ<EFBFBD>
|
||||
HAL_NVIC_EnableIRQ(DMA2_Stream6_IRQn);
|
||||
#endif
|
||||
}
|
||||
|
||||
//<2F>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
||||
//cardinfo:<3A><><EFBFBD><EFBFBD>Ϣ<EFBFBD>洢<EFBFBD><E6B4A2>
|
||||
//<2F><><EFBFBD><EFBFBD>ֵ:<3A><><EFBFBD><EFBFBD>״̬
|
||||
u8 SD_GetCardInfo(HAL_SD_CardInfoTypedef *cardinfo)
|
||||
{
|
||||
u8 sta;
|
||||
sta=HAL_SD_Get_CardInfo(&SDCARD_Handler,cardinfo);
|
||||
return sta;
|
||||
}
|
||||
#if (SD_DMA_MODE==1) //DMAģʽ
|
||||
|
||||
//ͨ<><CDA8>DMA<4D><41>ȡSD<53><44>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//buf:<3A><><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD>
|
||||
//sector:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
|
||||
//blocksize:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С(һ<>㶼<EFBFBD><E3B6BC>512<31>ֽ<EFBFBD>)
|
||||
//cnt:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//<2F><><EFBFBD><EFBFBD>ֵ:<3A><><EFBFBD><EFBFBD>״̬;0,<2C><><EFBFBD><EFBFBD>;<3B><><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
|
||||
u8 SD_ReadBlocks_DMA(uint32_t *buf,uint64_t sector,uint32_t blocksize,uint32_t cnt)
|
||||
{
|
||||
u8 err=0;
|
||||
err=HAL_SD_ReadBlocks_DMA(&SDCARD_Handler,buf,sector,blocksize,cnt);//ͨ<><CDA8>DMA<4D><41>ȡSD<53><44>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
if(err==0)//<2F><>ȡ<EFBFBD>ɹ<EFBFBD>
|
||||
{
|
||||
//<2F>ȴ<EFBFBD><C8B4><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
||||
err=HAL_SD_CheckReadOperation(&SDCARD_Handler,(uint32_t)SD_TIMEOUT);
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
//дSD<53><44>
|
||||
//buf:д<><D0B4><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD>
|
||||
//sector:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
|
||||
//blocksize:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С(һ<>㶼<EFBFBD><E3B6BC>512<31>ֽ<EFBFBD>)
|
||||
//cnt:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//<2F><><EFBFBD><EFBFBD>ֵ:<3A><><EFBFBD><EFBFBD>״̬;0,<2C><><EFBFBD><EFBFBD>;<3B><><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
|
||||
u8 SD_WriteBlocks_DMA(uint32_t *buf,uint64_t sector,uint32_t blocksize,uint32_t cnt)
|
||||
{
|
||||
u8 err=0;
|
||||
err=HAL_SD_WriteBlocks_DMA(&SDCARD_Handler,buf,sector,blocksize,cnt);//ͨ<><CDA8>DMAдSD<53><44>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
if(err==0)//д<>ɹ<EFBFBD>
|
||||
{
|
||||
err=HAL_SD_CheckWriteOperation(&SDCARD_Handler,(uint32_t)SD_TIMEOUT);//<2F>ȴ<EFBFBD><C8B4><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>/
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
//<2F><>SD<53><44>
|
||||
//buf:<3A><><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD>
|
||||
//sector:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
|
||||
//cnt:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//<2F><><EFBFBD><EFBFBD>ֵ:<3A><><EFBFBD><EFBFBD>״̬;0,<2C><><EFBFBD><EFBFBD>;<3B><><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
|
||||
u8 SD_ReadDisk(u8* buf,u32 sector,u32 cnt)
|
||||
{
|
||||
u8 sta=SD_OK;
|
||||
long long lsector=sector;
|
||||
u8 n;
|
||||
if(SDCardInfo.CardType!=STD_CAPACITY_SD_CARD_V1_1)lsector<<=9;
|
||||
if((u32)buf%4!=0)
|
||||
{
|
||||
for(n=0;n<cnt;n++)
|
||||
{
|
||||
sta=SD_ReadBlocks_DMA((uint32_t*)SDIO_DATA_BUFFER,lsector+512*n,512,1);
|
||||
memcpy(buf,SDIO_DATA_BUFFER,512);
|
||||
buf+=512;
|
||||
}
|
||||
}else
|
||||
{
|
||||
sta=SD_ReadBlocks_DMA((uint32_t*)buf,lsector, 512,cnt);
|
||||
}
|
||||
return sta;
|
||||
}
|
||||
|
||||
//дSD<53><44>
|
||||
//buf:д<><D0B4><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD>
|
||||
//sector:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
|
||||
//cnt:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//<2F><><EFBFBD><EFBFBD>ֵ:<3A><><EFBFBD><EFBFBD>״̬;0,<2C><><EFBFBD><EFBFBD>;<3B><><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
|
||||
u8 SD_WriteDisk(u8 *buf,u32 sector,u8 cnt)
|
||||
{
|
||||
u8 sta=SD_OK;
|
||||
long long lsector=sector;
|
||||
u8 n;
|
||||
if(SDCardInfo.CardType!=STD_CAPACITY_SD_CARD_V1_1)lsector<<=9;
|
||||
if((u32)buf%4!=0)
|
||||
{
|
||||
for(n=0;n<cnt;n++)
|
||||
{
|
||||
memcpy(SDIO_DATA_BUFFER,buf,512);
|
||||
sta=SD_WriteBlocks_DMA((uint32_t*)SDIO_DATA_BUFFER,lsector+512*n,512,1);//<2F><><EFBFBD><EFBFBD>sector<6F><72>д<EFBFBD><D0B4><EFBFBD><EFBFBD>
|
||||
buf+=512;
|
||||
}
|
||||
}else
|
||||
{
|
||||
sta=SD_WriteBlocks_DMA((uint32_t*)buf,lsector,512,cnt);//<2F><><EFBFBD><EFBFBD>sector<6F><72>д<EFBFBD><D0B4><EFBFBD><EFBFBD>
|
||||
}
|
||||
return sta;
|
||||
}
|
||||
|
||||
//SDMMC1<43>жϷ<D0B6><CFB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
void SDMMC1_IRQHandler(void)
|
||||
{
|
||||
HAL_SD_IRQHandler(&SDCARD_Handler);
|
||||
}
|
||||
|
||||
//DMA2<41><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>6<EFBFBD>жϷ<D0B6><CFB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
void DMA2_Stream6_IRQHandler(void)
|
||||
{
|
||||
HAL_DMA_IRQHandler(SDCARD_Handler.hdmatx);
|
||||
}
|
||||
|
||||
//DMA2<41><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>3<EFBFBD>жϷ<D0B6><CFB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
void DMA2_Stream3_IRQHandler(void)
|
||||
{
|
||||
HAL_DMA_IRQHandler(SDCARD_Handler.hdmarx);
|
||||
}
|
||||
#else //<2F><>ѵģʽ
|
||||
|
||||
//<2F><>SD<53><44>
|
||||
//buf:<3A><><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD>
|
||||
//sector:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
|
||||
//cnt:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//<2F><><EFBFBD><EFBFBD>ֵ:<3A><><EFBFBD><EFBFBD>״̬;0,<2C><><EFBFBD><EFBFBD>;<3B><><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
|
||||
u8 SD_ReadDisk(u8* buf,u32 sector,u32 cnt)
|
||||
{
|
||||
u8 sta=SD_OK;
|
||||
long long lsector=sector;
|
||||
u8 n;
|
||||
lsector<<=9;
|
||||
INTX_DISABLE();//<2F>ر<EFBFBD><D8B1><EFBFBD><EFBFBD>ж<EFBFBD>(POLLINGģʽ,<2C>Ͻ<EFBFBD><CFBD>жϴ<D0B6><CFB4><EFBFBD>SDIO<49><4F>д<EFBFBD><D0B4><EFBFBD><EFBFBD>!!!)
|
||||
if((u32)buf%4!=0)
|
||||
{
|
||||
for(n=0;n<cnt;n++)
|
||||
{
|
||||
sta=HAL_SD_ReadBlocks(&SDCARD_Handler,(uint32_t*)SDIO_DATA_BUFFER,lsector+512*n,512,1);//<2F><><EFBFBD><EFBFBD>sector<6F>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD>
|
||||
memcpy(buf,SDIO_DATA_BUFFER,512);
|
||||
buf+=512;
|
||||
}
|
||||
}else
|
||||
{
|
||||
sta=HAL_SD_ReadBlocks(&SDCARD_Handler,(uint32_t*)buf,lsector,512,cnt);//<2F><><EFBFBD><EFBFBD>sector<6F>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD>
|
||||
}
|
||||
INTX_ENABLE();//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
|
||||
return sta;
|
||||
}
|
||||
|
||||
//дSD<53><44>
|
||||
//buf:д<><D0B4><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD>
|
||||
//sector:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
|
||||
//cnt:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//<2F><><EFBFBD><EFBFBD>ֵ:<3A><><EFBFBD><EFBFBD>״̬;0,<2C><><EFBFBD><EFBFBD>;<3B><><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>;
|
||||
u8 SD_WriteDisk(u8 *buf,u32 sector,u8 cnt)
|
||||
{
|
||||
u8 sta=SD_OK;
|
||||
long long lsector=sector;
|
||||
u8 n;
|
||||
lsector<<=9;
|
||||
INTX_DISABLE();//<2F>ر<EFBFBD><D8B1><EFBFBD><EFBFBD>ж<EFBFBD>(POLLINGģʽ,<2C>Ͻ<EFBFBD><CFBD>жϴ<D0B6><CFB4><EFBFBD>SDIO<49><4F>д<EFBFBD><D0B4><EFBFBD><EFBFBD>!!!)
|
||||
if((u32)buf%4!=0)
|
||||
{
|
||||
for(n=0;n<cnt;n++)
|
||||
{
|
||||
memcpy(SDIO_DATA_BUFFER,buf,512);
|
||||
sta=HAL_SD_WriteBlocks(&SDCARD_Handler,(uint32_t*)SDIO_DATA_BUFFER,lsector+512*n,512,1);//<2F><><EFBFBD><EFBFBD>sector<6F><72>д<EFBFBD><D0B4><EFBFBD><EFBFBD>
|
||||
buf+=512;
|
||||
}
|
||||
}else
|
||||
{
|
||||
sta=HAL_SD_WriteBlocks(&SDCARD_Handler,(uint32_t*)buf,lsector,512,cnt);//<2F><><EFBFBD><EFBFBD>sector<6F><72>д<EFBFBD><D0B4><EFBFBD><EFBFBD>
|
||||
}
|
||||
INTX_ENABLE();//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
|
||||
return sta;
|
||||
}
|
||||
#endif
|
||||
30
HARDWARE/SDIO/sdio_sdcard.h
Normal file
30
HARDWARE/SDIO/sdio_sdcard.h
Normal file
@@ -0,0 +1,30 @@
|
||||
#ifndef _SDMMC_SDCARD_H
|
||||
#define _SDMMC_SDCARD_H
|
||||
#include "sys.h"
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB>ѧϰʹ<CFB0>ã<EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD><C9A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>κ<EFBFBD><CEBA><EFBFBD>;
|
||||
//ALIENTEK STM32F746<34><36><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//SD<53><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//<2F><><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD>@ALIENTEK
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̳:www.openedv.com
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:2016/1/6
|
||||
//<2F>汾<EFBFBD><E6B1BE>V1.0
|
||||
//<2F><>Ȩ<EFBFBD><C8A8><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD><D8BE><EFBFBD>
|
||||
//Copyright(C) <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿƼ<D3BF><C6BC><EFBFBD><EFBFBD><EFBFBD>˾ 2014-2024
|
||||
//All rights reserved
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#define SD_TIMEOUT ((uint32_t)100000000) //<2F><>ʱʱ<CAB1><CAB1>
|
||||
|
||||
#define SD_DMA_MODE 0 //1<><31>DMAģʽ<C4A3><CABD>0<EFBFBD><30><EFBFBD><EFBFBD>ѯģʽ
|
||||
|
||||
extern SD_HandleTypeDef SDCARD_Handler; //SD<53><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
extern HAL_SD_CardInfoTypedef SDCardInfo; //SD<53><44><EFBFBD><EFBFBD>Ϣ<EFBFBD>ṹ<EFBFBD><E1B9B9>
|
||||
|
||||
u8 SD_Init(void);
|
||||
u8 SD_GetCardInfo(HAL_SD_CardInfoTypedef *cardinfo);
|
||||
u8 SD_ReadDisk(u8* buf,u32 sector,u32 cnt);
|
||||
u8 SD_WriteDisk(u8 *buf,u32 sector,u8 cnt);
|
||||
u8 SD_ReadBlocks_DMA(uint32_t *buf,uint64_t sector,uint32_t blocksize,uint32_t cnt);
|
||||
u8 SD_WriteBlocks_DMA(uint32_t *buf,uint64_t sector,uint32_t blocksize,uint32_t cnt);
|
||||
#endif
|
||||
Reference in New Issue
Block a user