📄 cjsd.c
字号:
/**--------------File Info-------------------------------------------------------------------------------
** File name: sddriver.c
** Last modified Date: 2005-1-6
** Last Version: V1.0
** Descriptions: sd 卡驱动软件包: SD卡物理层 用户API函数
** Soft Packet of SD Card Driver: user API funciton
**
**------------------------------------------------------------------------------------------------------
** Created by: gan peng
** Created date: 2005-1-6
** Version: V1.0
** Descriptions: The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Descriptions:
**
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Descriptions:
**
********************************************************************************************************/
#include "cjsd.h"
/* SD卡信息结构体变量 the information structure variable of SD Card */
sd_struct sds;
/* 超时时间单位表(单位:0.000000001ns) timeout unit table */
const unsigned long time_unit[8] = {1000000000,100000000,10000000,
1000000,100000,10000,1000,100};
/* 超时时间表 timeout value table */
const unsigned char time_value[16] = {0,10,12,13,15,20,25,30,
35,40,45,50,55,60,70,80};
/* 超时时间因数表 timeout factor table */
const unsigned char r2w_fator[6] = {1,2,4,8,16,32};
#if SD_CRC_EN
//X16 + X12 + X5 + 1 余式表
unsigned short const CRCTable[256]={0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7,
0x8108,0x9129,0xa14a,0xb16b,0xc18c,0xd1ad,0xe1ce,0xf1ef,
0x1231,0x0210,0x3273,0x2252,0x52b5,0x4294,0x72f7,0x62d6,
0x9339,0x8318,0xb37b,0xa35a,0xd3bd,0xc39c,0xf3ff,0xe3de,
0x2462,0x3443,0x0420,0x1401,0x64e6,0x74c7,0x44a4,0x5485,
0xa56a,0xb54b,0x8528,0x9509,0xe5ee,0xf5cf,0xc5ac,0xd58d,
0x3653,0x2672,0x1611,0x0630,0x76d7,0x66f6,0x5695,0x46b4,
0xb75b,0xa77a,0x9719,0x8738,0xf7df,0xe7fe,0xd79d,0xc7bc,
0x48c4,0x58e5,0x6886,0x78a7,0x0840,0x1861,0x2802,0x3823,
0xc9cc,0xd9ed,0xe98e,0xf9af,0x8948,0x9969,0xa90a,0xb92b,
0x5af5,0x4ad4,0x7ab7,0x6a96,0x1a71,0x0a50,0x3a33,0x2a12,
0xdbfd,0xcbdc,0xfbbf,0xeb9e,0x9b79,0x8b58,0xbb3b,0xab1a,
0x6ca6,0x7c87,0x4ce4,0x5cc5,0x2c22,0x3c03,0x0c60,0x1c41,
0xedae,0xfd8f,0xcdec,0xddcd,0xad2a,0xbd0b,0x8d68,0x9d49,
0x7e97,0x6eb6,0x5ed5,0x4ef4,0x3e13,0x2e32,0x1e51,0x0e70,
0xff9f,0xefbe,0xdfdd,0xcffc,0xbf1b,0xaf3a,0x9f59,0x8f78,
0x9188,0x81a9,0xb1ca,0xa1eb,0xd10c,0xc12d,0xf14e,0xe16f,
0x1080,0x00a1,0x30c2,0x20e3,0x5004,0x4025,0x7046,0x6067,
0x83b9,0x9398,0xa3fb,0xb3da,0xc33d,0xd31c,0xe37f,0xf35e,
0x02b1,0x1290,0x22f3,0x32d2,0x4235,0x5214,0x6277,0x7256,
0xb5ea,0xa5cb,0x95a8,0x8589,0xf56e,0xe54f,0xd52c,0xc50d,
0x34e2,0x24c3,0x14a0,0x0481,0x7466,0x6447,0x5424,0x4405,
0xa7db,0xb7fa,0x8799,0x97b8,0xe75f,0xf77e,0xc71d,0xd73c,
0x26d3,0x36f2,0x0691,0x16b0,0x6657,0x7676,0x4615,0x5634,
0xd94c,0xc96d,0xf90e,0xe92f,0x99c8,0x89e9,0xb98a,0xa9ab,
0x5844,0x4865,0x7806,0x6827,0x18c0,0x08e1,0x3882,0x28a3,
0xcb7d,0xdb5c,0xeb3f,0xfb1e,0x8bf9,0x9bd8,0xabbb,0xbb9a,
0x4a75,0x5a54,0x6a37,0x7a16,0x0af1,0x1ad0,0x2ab3,0x3a92,
0xfd2e,0xed0f,0xdd6c,0xcd4d,0xbdaa,0xad8b,0x9de8,0x8dc9,
0x7c26,0x6c07,0x5c64,0x4c45,0x3ca2,0x2c83,0x1ce0,0x0cc1,
0xef1f,0xff3e,0xcf5d,0xdf7c,0xaf9b,0xbfba,0x8fd9,0x9ff8,
0x6e17,0x7e36,0x4e55,0x5e74,0x2e93,0x3eb2,0x0ed1,0x1ef0
};
/********************************************************************************************************************
** 函数名称: unsigned char SD_GetCRC16() Name: unsigned char SD_GetCRC16()
** 功能描述: 计算CRC16 Function: calculate CRC16
** 输 入: unsigned char *pSource: 数据 Input: unsigned char *pSource: data
unsigned short len : 长度 unsigned short len : len
** 输 出: CRC16码 Output: CRC16 code
********************************************************************************************************************/
unsigned short SD_GetCRC16(unsigned char *pSource, unsigned short len)
{
unsigned short result = 0;
return result;
}
/*******************************************************************************************************************
** 函数名称: unsigned char SD_GetCmdByte6() Name: unsigned char SD_GetCmdByte6()
** 功能描述: 获取SD卡命令的CRC7 Function: get the CRC7 of the command of SD card
** 输 入: unsigned char cmd : 命令 Input: unsigned char cmd : command
unsigned char *param: 命令的参数,长度为4字节 unsigned char *param: the param of command,length is 4 bytes
** 输 出: CRC7码 Output: CRC7 code
********************************************************************************************************************/
unsigned char SD_GetCmdByte6(unsigned char cmd, unsigned char *param)
{
unsigned char i, j;
unsigned char reg = 0;
unsigned char array[5];
array[0] = cmd;
for (i = 1; i < 5; i++) /* 将参数的顺序重新排列 */
array[i] = param[4 - i];
for (i = 0; i < 5; i++) /* 计算5个字节的CRC7 */
{
for (j = 0; j < 8; j++)
{
reg <<= 1;
reg ^= ((((array[i] << j) ^ reg) & 0x80) ? 0x9 : 0);
}
}
return ((reg << 1) + 0x01) ; /* 计算结果的CRC7左移一位,并将最低位置1 */
}
#endif
/********************************************************************************************************************
** 函数名称: unsigned char SD_SendCmd() Name: unsigned char SD_SendCmd()
** 功能描述: 向卡发送命令,并取得响应 Function: send command to the card,and get a response
** 输 入: unsigned char cmd : 命令字 Input: unsigned char cmd : command byte
unsigned char *param : 命令参数,长度为4字节 unsigned char *param : command parameter,length is 4 bytes
unsigned char resptype : 响应类型 unsigned char resptype: response type
unsigned char *resp : 响应,长度为1-5字节 unsigned char *resp : response,length is 1-5 bytes
** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
********************************************************************************************************************/
unsigned char SD_SendCmd(unsigned char cmd, unsigned char *param, unsigned char resptype, unsigned char *resp)
{
long i,rlen;
unsigned char tmp;
SPI_CS_Assert();
SPI_SendByte((cmd & 0x3F) | 0x40); /* 发送命令头和命令字 send command header and word */
for (i = 3; i >= 0; i--)
SPI_SendByte(param[i]); /* 发送参数 send parameters */
#if SD_CRC_EN
tmp = SD_GetCmdByte6((cmd & 0x3F) | 0x40, param);
SPI_SendByte(tmp);
#else
SPI_SendByte(0x95); /* CRC校验码,只用于第1个命令 CRC,only used for the first command */
#endif
rlen = 0;
switch (resptype) /* 根据不同的命令,得到不同的响应长度 */
{ /* according various command,get the various response length */
case R1:
case R1B: rlen = 1; break;
case R2: rlen = 2; break;
case R3: rlen = 5; break;
default: SPI_SendByte(0xFF);
SPI_CS_Deassert();
return SD_ERR_CMD_RESPTYPE; /* 返回命令响应类型错误 return error of command response type */
break;
}
i = 0;
do /* 等待响应,响应的开始位为0 */
{ /* Wait for a response,a response is a start bit(zero) */
tmp = SPI_RecByte();
i++;
}while (((tmp & 0x80) != 0) && (i < SD_CMD_TIMEOUT));
if (i >= SD_CMD_TIMEOUT)
{
SPI_CS_Deassert();
return SD_ERR_CMD_TIMEOUT; /* 返回命令超时 return response timeout of command */
}
for (i = rlen - 1; i >= 0; i--)
{
resp[i] = tmp;
tmp = SPI_RecByte(); /* 循环的最后发送8clock at the last recycle,clock out 8 clock */
}
SPI_CS_Deassert();
return SD_NO_ERR; /* 返回执行成功 return perform sucessfully */
}
/********************************************************************************************************************
** 函数名称: void SD_PackParam() Name: void SD_PackParam()
** 功能描述: 将32位的参数转为字节形式 Function: change 32bit parameter to bytes form
** 输 入: unsigned char *parameter: 字节参数缓冲区 Input: unsigned char *parameter: the buffer of bytes parameter
unsigned long value : 32位参数 unsigned long value : 32bit parameter
** 输 出: 无 Output: NULL
*********************************************************************************************************************/
void SD_PackParam(unsigned char *parameter, unsigned long value)
{
parameter[3] = (unsigned char)(value >> 24);
parameter[2] = (unsigned char)(value >> 16);
parameter[1] = (unsigned char)(value >> 8);
parameter[0] = (unsigned char)(value);
}
/********************************************************************************************************************
** 函数名称: unsigned char SD_BlockCommand() Name: unsigned char SD_BlockCommand()
** 功能描述: 块命令 Function: command about block operation
** 输 入: unsigned char cmd : 命令字 Input: unsigned char cmd : command byte
unsigned char resptype : 响应类型 unsigned char resptype : response type
unsigned long parameter: 块操作参数 unsigned long parameter: parameter of block operation
** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
*********************************************************************************************************************/
unsigned char SD_BlockCommand(unsigned char cmd, unsigned char resptype, unsigned long parameter)
{
unsigned char param[4],resp,ret;
parameter <<= SD_BLOCKSIZE_NBITS; /* 调整地址:左移9位 adjust address: move 9 bits left */
SD_PackParam(param, parameter); /* 将参数转化为字节形式 change the parameter to bytes form */
/* 结束数据传输失败 stop transmission operation fail */
if (resp != 0)
return SD_ERR_CMD_RESP; /* 响应错误 response is error */
return SD_NO_ERR;
}
/*
************************************************
下面为SD卡SPI命令
************************************************
*/
/********************************************************************************************************************
** 函数名称: unsigned char SD_ResetSD() Name: unsigned char SD_ResetSD()
** 功能描述: 复位SD卡 Function: reset sd card
** 输 入: 无 Input: NULL
** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
*********************************************************************************************************************/
unsigned char SD_ResetSD(void)
{
unsigned char param[4] = {0,0,0,0},resp;
return (SD_SendCmd(CMD0, param, CMD0_R, &resp)); /* 复位命令 command that reset sd card */
}
/********************************************************************************************************************
** 函数名称: unsigned char SD_ReadCSD() Name: unsigned char SD_ReadCSD()
** 功能描述: 读SD卡的CSD寄存器 Function: read CSD register of sd card
** 输 入: unsigned char csdlen : 寄存器长度(固定为16) unsigned char csdlen : len of register (fixed,is 16)
unsigned char *recbuf : 接收缓冲区 unsigned char *recbuf : recbuffer
** 输 出: 0: 正确 >0: 错误码 Output: 0: right >0: error code
*********************************************************************************************************************/
unsigned char SD_ReadCSD(unsigned char csdlen, unsigned char *recbuf)
{
unsigned char param[4] = {0,0,0,0},resp,ret;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -