1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/xiang07-NIOS_ii_FATFS

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
sd_card.h 13 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Trail07 Отправлено 02.05.2018 11:27 2e2eca3
/*****************************************************************************
* Name: sd_card.h
* Describ: 通过SPI接口对SD卡的访问,实现SD卡的初始化,读写操作等等
* Version:Rev1.0
* Author:zjxiang
* Data:2018.03.13
******************************************************************************/
#ifndef __SD_CARD_H__
#define __SD_CARD_H__
#include <stdint.h>
typedef unsigned char u8;
typedef unsigned int u32;
typedef unsigned short u16;
typedef enum {FALSE = 0, TRUE = !FALSE} bool;
// SD卡类型定义
#define SD_TYPE_ERR 0X00
#define SD_TYPE_MMC 0X01
#define SD_TYPE_V1 0X02
#define SD_TYPE_V2 0X04
#define SD_TYPE_V2HC 0X06
// SD卡指令表
#define CMD0 0 //卡复位
#define CMD1 1
#define CMD8 8 //命令8 ,SEND_IF_COND
#define CMD9 9 //命令9 ,读CSD数据
#define CMD10 10 //命令10,读CID数据
#define CMD12 12 //命令12,停止数据传输
#define CMD16 16 //命令16,设置SectorSize 应返回0x00
#define CMD17 17 //命令17,读sector
#define CMD18 18 //命令18,读Multi sector
#define CMD23 23 //命令23,设置多sector写入前预先擦除N个block
#define CMD24 24 //命令24,写sector
#define CMD25 25 //命令25,写Multi sector
#define CMD41 41 //命令41,应返回0x00
#define CMD55 55 //命令55,应返回0x01
#define CMD58 58 //命令58,读OCR信息
#define CMD59 59 //命令59,使能/禁止CRC,应返回0x00
//数据写入回应字意义
#define MSD_DATA_OK 0x05
#define MSD_DATA_CRC_ERROR 0x0B
#define MSD_DATA_WRITE_ERROR 0x0D
#define MSD_DATA_OTHER_ERROR 0xFF
//SD卡回应标记字
#define MSD_RESPONSE_NO_ERROR 0x00
#define MSD_IN_IDLE_STATE 0x01
#define MSD_ERASE_RESET 0x02
#define MSD_ILLEGAL_COMMAND 0x04
#define MSD_COM_CRC_ERROR 0x08
#define MSD_ERASE_SEQUENCE_ERROR 0x10
#define MSD_ADDRESS_ERROR 0x20
#define MSD_PARAMETER_ERROR 0x40
#define MSD_RESPONSE_FAILURE 0xFF
//SD卡错误信息
typedef enum
{
SD_CMD_CRC_FAIL = (1), /*!< Command response received (but CRC check failed) */
SD_DATA_CRC_FAIL = (2), /*!< Data bock sent/received (CRC check Failed) */
SD_CMD_RSP_TIMEOUT = (3), /*!< Command response timeout */
SD_DATA_TIMEOUT = (4), /*!< Data time out */
SD_TX_UNDERRUN = (5), /*!< Transmit FIFO under-run */
SD_RX_OVERRUN = (6), /*!< Receive FIFO over-run */
SD_START_BIT_ERR = (7), /*!< Start bit not detected on all data signals in widE bus mode */
SD_CMD_OUT_OF_RANGE = (8), /*!< CMD's argument was out of range.*/
SD_ADDR_MISALIGNED = (9), /*!< Misaligned address */
SD_BLOCK_LEN_ERR = (10), /*!< Transferred block length is not allowed for the card or the number of transferred bytes does not match the block length */
SD_ERASE_SEQ_ERR = (11), /*!< An error in the sequence of erase command occurs.*/
SD_BAD_ERASE_PARAM = (12), /*!< An Invalid selection for erase groups */
SD_WRITE_PROT_VIOLATION = (13), /*!< Attempt to program a write protect block */
SD_LOCK_UNLOCK_FAILED = (14), /*!< Sequence or password error has been detected in unlock command or if there was an attempt to access a locked card */
SD_COM_CRC_FAILED = (15), /*!< CRC check of the previous command failed */
SD_ILLEGAL_CMD = (16), /*!< Command is not legal for the card state */
SD_CARD_ECC_FAILED = (17), /*!< Card internal ECC was applied but failed to correct the data */
SD_CC_ERROR = (18), /*!< Internal card controller error */
SD_GENERAL_UNKNOWN_ERROR = (19), /*!< General or Unknown error */
SD_STREAM_READ_UNDERRUN = (20), /*!< The card could not sustain data transfer in stream read operation. */
SD_STREAM_WRITE_OVERRUN = (21), /*!< The card could not sustain data programming in stream mode */
SD_CID_CSD_OVERWRITE = (22), /*!< CID/CSD overwrite error */
SD_WP_ERASE_SKIP = (23), /*!< only partial address space was erased */
SD_CARD_ECC_DISABLED = (24), /*!< Command has been executed without using internal ECC */
SD_ERASE_RESET = (25), /*!< Erase sequence was cleared before executing because an out of erase sequence command was received */
SD_AKE_SEQ_ERROR = (26), /*!< Error in sequence of authentication. */
SD_INVALID_VOLTRANGE = (27),
SD_ADDR_OUT_OF_RANGE = (28),
SD_SWITCH_ERROR = (29),
SD_SDIO_DISABLED = (30),
SD_SDIO_FUNCTION_BUSY = (31),
SD_SDIO_FUNCTION_FAILED = (32),
SD_SDIO_UNKNOWN_FUNCTION = (33),
SD_INTERNAL_ERROR,
SD_NOT_CONFIGURED,
SD_REQUEST_PENDING,
SD_REQUEST_NOT_APPLICABLE,
SD_INVALID_PARAMETER,
SD_UNSUPPORTED_FEATURE,
SD_UNSUPPORTED_HW,
SD_ERROR,
SD_OK = 0
} SD_Error;
typedef struct
{
u8 CSDStruct; /*!< CSD structure */
u8 SysSpecVersion; /*!< System specification version */
u8 Reserved1; /*!< Reserved */
u8 TAAC; /*!< Data read access-time 1 */
u8 NSAC; /*!< Data read access-time 2 in CLK cycles */
u8 MaxBusClkFrec; /*!< Max. bus clock frequency */
u16 CardComdClasses; /*!< Card command classes */
u8 RdBlockLen; /*!< Max. read data block length */
u8 PartBlockRead; /*!< Partial blocks for read allowed */
u8 WrBlockMisalign; /*!< Write block misalignment */
u8 RdBlockMisalign; /*!< Read block misalignment */
u8 DSRImpl; /*!< DSR implemented */
u8 Reserved2; /*!< Reserved */
u32 DeviceSize; /*!< Device Size */
u8 MaxRdCurrentVDDMin; /*!< Max. read current @ VDD min */
u8 MaxRdCurrentVDDMax; /*!< Max. read current @ VDD max */
u8 MaxWrCurrentVDDMin; /*!< Max. write current @ VDD min */
u8 MaxWrCurrentVDDMax; /*!< Max. write current @ VDD max */
u8 DeviceSizeMul; /*!< Device size multiplier */
u8 EraseGrSize; /*!< Erase group size */
u8 EraseGrMul; /*!< Erase group size multiplier */
u8 WrProtectGrSize; /*!< Write protect group size */
u8 WrProtectGrEnable; /*!< Write protect group enable */
u8 ManDeflECC; /*!< Manufacturer default ECC */
u8 WrSpeedFact; /*!< Write speed factor */
u8 MaxWrBlockLen; /*!< Max. write data block length */
u8 WriteBlockPaPartial; /*!< Partial blocks for write allowed */
u8 Reserved3; /*!< Reserded */
u8 ContentProtectAppli; /*!< Content protection application */
u8 FileFormatGrouop; /*!< File format group */
u8 CopyFlag; /*!< Copy flag (OTP) */
u8 PermWrProtect; /*!< Permanent write protection */
u8 TempWrProtect; /*!< Temporary write protection */
u8 FileFormat; /*!< File Format */
u8 ECC; /*!< ECC code */
u8 CSD_CRC; /*!< CSD CRC */
u8 Reserved4; /*!< always 1*/
} SD_CSD;
typedef struct
{
u8 ManufacturerID; /*!< ManufacturerID */
u16 OEM_AppliID; /*!< OEM/Application ID */
u32 ProdName1; /*!< Product Name part1 */
u8 ProdName2; /*!< Product Name part2*/
u8 ProdRev; /*!< Product Revision */
u32 ProdSN; /*!< Product Serial Number */
u8 Reserved1; /*!< Reserved1 */
u16 ManufactDate; /*!< Manufacturing Date */
u8 CID_CRC; /*!< CID CRC */
u8 Reserved2; /*!< always 1 */
} SD_CID;
//SD卡相关信息
typedef struct
{
SD_CSD SD_csd;
SD_CID SD_cid;
long long CardCapacity; //SD卡的容量
u32 CardBlockSize; //SD卡块大小
u16 RCA; //SD卡相对地址
u8 CardType; //卡类型
} SD_CardInfo;
extern SD_CardInfo SDCardInfo;
/******************************************************************************
函数名称:SD_WaitReady
函数功能:等待SD卡准备好
入口参数:无
出口参数:返回值为0表示SD卡准备好了,返回值为1表示错误
******************************************************************************/
uint8_t SD_WaitReady(void);
/******************************************************************************
函数名称:SD_DisSelect
函数功能:取消选择,释放SPI总线
入口参数:无
出口参数:无
******************************************************************************/
void SD_DisSelect(void);
/******************************************************************************
函数名称:SD_Select
函数功能:选择SD卡并且等待SD卡准备OK
入口参数:无
出口参数:返回值为0表示成功,返回值为1表示失败
******************************************************************************/
uint8_t SD_Select(void);
/******************************************************************************
函数名称:SDCard_Initial
函数功能:SD卡初始化
入口参数:无
出口参数:返回值为0表示成功,返回值为1表示失败
******************************************************************************/
uint8_t SDCard_Initial(void);
/******************************************************************************
函数名称:SD_SendCmd
函数功能:向SD卡发送一个命令并返回SD卡收到命令后的响应
入口参数:cmd:命令;arg:命令参数;crc:crc校验值
出口参数:SD卡返回的响应
******************************************************************************/
uint8_t SD_SendCmd(uint8_t cmd, uint32_t arg, uint8_t crc);
/******************************************************************************
函数名称:SD_ReadDisk
函数功能:读取SD卡磁盘上的数据存储在buffer缓冲区中
入口参数:buffer:读取的数据存储的缓冲区
sector:起始扇区
cnt:扇区数
出口参数:返回值为0表示读取数据成功,返回其它值表示读取数据失败
******************************************************************************/
uint8_t SD_ReadDisk(uint8_t *buffer, uint32_t sector, uint8_t cnt);
/******************************************************************************
函数名称:SD_ReceiveData
函数功能:从SD卡中读取一个数据包的内容
入口参数:buffer:读取的数据存储的缓冲区
length:要读取的数据长度
出口参数:返回值为0表示读取数据成功,返回其它值表示读取数据失败
******************************************************************************/
uint8_t SD_ReceiveData(uint8_t *buffer, uint16_t length);
/******************************************************************************
函数名称:SD_GetResponse
函数功能:等待SD卡的回应
入口参数:response:需要得到的回应值
出口参数:返回值为0表示成功得到了回应值,其它得到的回应值失败
******************************************************************************/
uint8_t SD_GetResponse(uint8_t response);
/******************************************************************************
函数名称:SD_WriteDisk
函数功能:向SD卡磁盘上指定扇区位置写入指定数目的数据
入口参数:buffer:待写入的数据存储的缓冲区
sector:起始扇区
number:扇区数
出口参数:返回值为0表示写入数据成功,返回其它值表示写入数据失败
******************************************************************************/
uint8_t SD_WriteDisk(uint8_t *buffer, uint32_t sector, uint8_t number);
/******************************************************************************
函数名称:SD_SendBlock
函数功能:向SD卡中写入一个数据包的内容
入口参数:buffer:待写入的数据存储的缓冲区
cmd:指令
出口参数:返回值为0表示写入数据成功,返回其它值表示写入数据失败
******************************************************************************/
uint8_t SD_SendBlock(uint8_t *buffer, uint8_t cmd);
/******************************************************************************
函数名称:SD_GetCID_Register
函数功能:获取SD卡的CID寄存器信息,包括SD卡制造商的信息
入口参数:cid_data:存放接受的CID寄存器数据的指针(至少是16字节)
出口参数:返回值为0表示成功,返回其它值表示失败
******************************************************************************/
uint8_t SD_GetCID_Register(uint8_t *cid_data);
/******************************************************************************
函数名称:SD_GetCSD_Register
函数功能:获取SD卡的CSD寄存器信息
入口参数:csd_data:存放接受的CSD寄存器数据的指针(至少是16字节)
出口参数:返回值为0表示成功,返回其它值表示失败
******************************************************************************/
uint8_t SD_GetCSD_Register(uint8_t *csd_data);
/******************************************************************************
函数名称:SD_GetSectorCount
函数功能:获取SD卡的扇区数容量信息
入口参数:无
出口参数:返回值为0表示获取容量数出错
返回其它值表示获取SD卡的容量值
******************************************************************************/
uint32_t SD_GetSectorCount(void);
void SD_CARD_Detect(void);
unsigned char FATFS_test(void);
u8 SD_Card_Scan_files(void);
#endif

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/xiang07-NIOS_ii_FATFS.git
git@api.gitlife.ru:oschina-mirror/xiang07-NIOS_ii_FATFS.git
oschina-mirror
xiang07-NIOS_ii_FATFS
xiang07-NIOS_ii_FATFS
master