⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 d12_operation.c

📁 sd卡usb读卡器的设计,仅供大家交流参考
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "D12_Operation.h"
#include"MMC_SD.h"

#define NOP8() asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop")
#define NOP7() asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop")
#define NOP6() asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop")
#define NOP5() asm("nop");asm("nop");asm("nop");asm("nop");asm("nop")
#define NOP4() asm("nop");asm("nop");asm("nop");asm("nop")
#define NOP3() asm("nop");asm("nop");asm("nop")
#define NOP2() asm("nop");asm("nop")
#define NOP1() asm("nop")

void D12_Delay(U8 n)
{
	while(n--);
}

void D12_PORT_INI()
{
	D12_CS_PORT |= 1<<D12_CS_BIT;
	D12_CS_DDR |= 1<<D12_CS_BIT;

	D12_INT_PORT |= 1<<D12_INT_BIT;
	D12_INT_DDR &= ~(1<<D12_INT_BIT);

	D12_WR_PORT |= 1<<D12_WR_BIT;
	D12_WR_DDR |= 1<<D12_WR_BIT;
	
	D12_RD_PORT |= 1<<D12_RD_BIT;
	D12_RD_DDR |= 1<<D12_RD_BIT;

	D12_A0_PORT |= 1<<D12_A0_BIT;
	D12_A0_DDR |= 1<<D12_A0_BIT;

}

/**************************************************************/
/* 函数名: U8 D12_Select_Endpoint(U8 Endpoint)                */
/* 功能  : 选择端点                                           */
/* 返回值: bit0: 1 缓冲区满 0 empty ; bit1: 1 端点停止        */
/* 参数  : 端点值 00H~05H                                     */
/**************************************************************/
U8 D12_Select_Endpoint(U8 Endpoint)
{
	U8 temp;

	NOP4();

	D12_OUTPUT_MODE();
	D12_OUTPUT = Endpoint;
	D12_CMD_WR_L();
	D12_CMD_WR_H();

	NOP7();

	D12_INPUT_MODE();
	D12_DAT_RD_L();	
	NOP3();
	temp = D12_INPUT;
	D12_DAT_RD_H();

	NOP4();

	return temp;
}

/***************************************************************/
/* 函数名  : void D12_Set_Endpoint_Status(U8 Endpoint,U8 Status);*/
/* 功能    : 设置端点状态                                      */
/* 返回值  : 无                                                */
/* 参数    : 端点号+状态                                       */
/* Endpoint:                                                   */
/*          0:控制输出  1:控制输入   2:端点1输出               */
/*          3:端点1输入 4:端点2输出  5:端点2输入               */
/* Status:                                                     */
/*          0:不停止 1:停止                                    */
/***************************************************************/
void D12_Set_Endpoint_Status(U8 Endpoint,U8 Status)
{
	NOP4();

	D12_OUTPUT_MODE();
	D12_OUTPUT = Endpoint+0x40;
	D12_CMD_WR_L();
	D12_CMD_WR_H();

	NOP7();

	D12_OUTPUT = Status;
	D12_DAT_WR_L();
	D12_DAT_WR_H();

	NOP4();
}


/***************************************************************/
/* 函数名: void D12_Set_Address(U8 Addr,U8 Enable)             */
/* 功能  : 设置地址/使能                                       */
/* 返回值: 无                                                  */
/* 参数  : Addr Enable                                         */
/* Addr  : 地址值0~127                                         */
/* Enable: 使能位                                              */
/***************************************************************/
void D12_Set_Address_Enable(U8 Addr,U8 Enable)
{

	NOP4();

	D12_OUTPUT_MODE();
	D12_OUTPUT = 0xd0;
	D12_CMD_WR_L();
	D12_CMD_WR_H();

	NOP7();

	D12_OUTPUT = Addr|(Enable<<7);
	D12_DAT_WR_L();
	D12_DAT_WR_H();

	NOP4();
}


/***************************************************************/
/* 函数名: void D12_Set_Endpoint_Enable(U8 Enable)             */
/* 功能  : 设置端点使能                                        */
/* 返回值: 无                                                  */
/* 参数  : Enable                                              */
/* Enable :                                                    */
/*         bit0: 普通/同步端点使能                             */
/***************************************************************/
void D12_Set_Endpoint_Enable(U8 Enable)
{
	NOP4();
	
	D12_OUTPUT_MODE();
	D12_OUTPUT = 0xd8;
	D12_CMD_WR_L();
	D12_CMD_WR_H();

	NOP7();

	D12_OUTPUT = Enable;
	D12_DAT_WR_L();
	D12_DAT_WR_H();

	NOP4();
}

/***************************************************************/
/* 函数名: void D12_Set_DMA(U8 DMA)                            */
/* 功能  : 设置DMA                                             */
/* 返回值: 无                                                  */
/* 参数  : DMA                                                 */
/* DMA   :                                                     */
/*        bit0~1: DMA突发串长度:                               */
/*                00 单周期DMA                                 */
/*                01 4 周期DMA                                 */
/*                10 8 周期DMA                                 */
/*                11 16周期DMA                                 */
/*        bit2  : DMA使能   1:使能     0:停止                  */
/*        bit3  : DMA方向   1:RAM->D12 0:D12->RAM              */
/*        bit4  : 自动重装  1:使能     0:禁止                  */
/*        bit5  : 中断脚模式1:SOF模式  0:正常模式              */
/*        bit6  : 端点索引4中断模式                            */
/*        bit7  : 端点索引5中断模式                            */
/***************************************************************/
void D12_Set_DMA(U8 DMA)
{
	NOP4();

	D12_OUTPUT_MODE();
	D12_OUTPUT = 0xfb;
	D12_CMD_WR_L();
	D12_CMD_WR_H();

	NOP7();

	D12_OUTPUT = DMA;
	D12_DAT_WR_L();
	D12_DAT_WR_H();

	NOP4();
}

/***************************************************************/
/* 函数名: U8 D12_Get_DMA(void)                                */
/* 功能  : 读DMA设置值                                         */
/* 返回值: DMA值                                               */
/* 参数  : 无                                                  */
/***************************************************************/
U8 D12_Get_DMA(void)
{
	U8 temp;
	NOP4();

	D12_OUTPUT_MODE();
	D12_OUTPUT = 0xfb;
	D12_CMD_WR_L();
	D12_CMD_WR_H();

	NOP7();

	D12_INPUT_MODE();
	D12_CMD_RD_L();
	NOP3();
	temp = D12_INPUT;
	D12_CMD_RD_H();

	NOP4();
	return temp;
}

/***************************************************************/
/* 函数名: void D12_Set_Mode(U8 Val1, U8 Val2)                 */
/* 功能  : 设置模式                                            */
/* 返回值: 无                                                  */
/* 参数  : Val1,Val2                                           */
/* Val1  :                                                     */
/*         bit0: 保留                                          */
/*         bit1: 无LazyClock                                   */
/*         bit2: 时钟运行                                      */
/*         bit3: 中断模式                                      */
/*         bit4: SoftConect                                    */
/*         bit5: 保留                                          */
/*         bit6&7: 端点配置                                    */
/*                00 非同步模式                                */
/*                01 同步输出模式                              */
/*                10 同步输入模式                              */
/*                11 同步输入/输出模式                         */
/* Val2  :                                                     */
/*         bit0~3: 时钟分频系数       48MHz/(N-1)              */
/*         bit4~5: 保留                                        */
/*         bit6  : SET_TO_ONE                                  */
/*         bit7  : SOF_ONLY中断模式                            */
/***************************************************************/
void D12_Set_Mode(U8 Val1, U8 Val2)
{
	NOP4();
	D12_OUTPUT_MODE();
	D12_OUTPUT = 0xf3;
	D12_CMD_WR_L();
	D12_CMD_WR_H();

	NOP7();

	D12_OUTPUT = Val1;
	D12_DAT_WR_L();
	D12_DAT_WR_H();

	NOP6();

	D12_OUTPUT = Val2;
	D12_DAT_WR_L();
	D12_DAT_WR_H();

	NOP4();
}


/***************************************************************/
/* 函数名: void D12_Send_Resume(void)                          */
/* 功能  : 发送恢复                                            */
/* 返回值: 无                                                  */
/* 参数  : 无                                                  */
/***************************************************************/
void D12_Send_Resume(void)
{
	NOP4();
	D12_OUTPUT_MODE();
	D12_OUTPUT = 0xf6;
	D12_CMD_WR_L();
	D12_CMD_WR_H();

	NOP4();
}

/***************************************************************/
/* 函数名: void D12_Ack_Endpoint(U8 Endpoint)                  */
/* 功能  : 端点应答处理                                        */
/* 返回值: 无                                                  */
/* 参数  : Endpoint 端点号                                     */
/***************************************************************/
void D12_Ack_Endpoint(U8 Endpoint)
{
	NOP4();
	D12_OUTPUT_MODE();
	D12_OUTPUT = Endpoint;
	D12_CMD_WR_L();
	D12_CMD_WR_H();

	NOP7();

	D12_OUTPUT = 0xf1;
	D12_CMD_WR_L();
	D12_CMD_WR_H();
	NOP4();
	if(!Endpoint)
		D12_Clear_Buffer();
}


/***************************************************************/
/* 函数名: U16 D12_Read_Chip_ID(void)                          */
/* 功能  : 读芯片ID 1210                                       */
/* 返回值: temp id号                                           */
/* 参数  : 无                                                  */
/***************************************************************/
U16 D12_Read_Chip_ID(void)
{

	U16 temp;
	NOP4();
	D12_OUTPUT_MODE();
	D12_OUTPUT = 0xfd;
	D12_CMD_WR_L();
	D12_CMD_WR_H();

	NOP7();

	D12_INPUT_MODE();
	D12_DAT_RD_L();
	NOP3();
	temp = D12_INPUT;
	D12_DAT_RD_H();

	NOP6();

	D12_DAT_RD_L();
	NOP3();
	temp = temp<<8|D12_INPUT;
	D12_DAT_RD_H();

	NOP4();
	return temp;	
}


/***************************************************************/
/* 函数名: U8 D12_Read_Endpoint(U8 Endpoint,U8 * Buffer,U8 Count)*/
/* 功能  : 读取端点数据                                        */
/* 返回值: 1正常 0无数据                                       */
/* 参数  :                                                     */
/* Endpoint:端点号                                             */
/* Buffer  :外部缓冲区指针                                     */
/* Count   :数据长度                                           */
/***************************************************************/
U8 D12_Read_Endpoint(U8 Endpoint,U8 * Buffer,U8 Count)
{
	U8 temp;
	NOP4();
	while(!(D12_Select_Endpoint(Endpoint)&1));
	
	D12_Read_Last_Transaction_Status(Endpoint);


	D12_OUTPUT_MODE();
	D12_OUTPUT = 0xf0;
	D12_CMD_WR_L();
	D12_CMD_WR_H();

	NOP7();

	D12_INPUT_MODE();
	D12_CMD_RD_L();
	NOP3();
	temp = D12_INPUT;
	D12_CMD_RD_H();

	NOP6();

	D12_CMD_RD_L();
	NOP3();
	temp = D12_INPUT;
	D12_CMD_RD_H();


	if(temp<Count)Count = temp;
	temp = Count;
	while(Count)
	{
		NOP4();
		D12_CMD_RD_L();
		NOP3();
		*Buffer++ = D12_INPUT;
		D12_CMD_RD_H();
		Count--;
	}
	NOP4();
	D12_Clear_Buffer();
	return temp;	
}


/**********************************************************************/
/* 函数名: void D12_Write_Endpoint(U8 Endpoint, U8 * Buffer, U8 Count)*/
/* 功能  : 把数据写入端点                                             */
/* 返回值: 无                                                         */
/* 参数  :                                                            */
/* Endpoint:端点号                                                    */
/* Buffer  :外部缓冲区指针                                            */
/* Count   :数据长度                                                  */
/**********************************************************************/
void D12_Write_Endpoint(U8 Endpoint, U8 * Buffer, U8 Count)
{
	NOP4();
	while(1)//等待缓冲区为空
	{
		if(!(D12_Select_Endpoint(Endpoint)&1))break;
	}
	
	D12_Read_Last_Transaction_Status(Endpoint);

	D12_OUTPUT_MODE();
	D12_OUTPUT = 0xf0;
	D12_CMD_WR_L();
	D12_CMD_WR_H();

	NOP7();
	
	D12_OUTPUT = 0;
	D12_DAT_WR_L();
	D12_DAT_WR_H();

	NOP6();
	
	D12_OUTPUT = Count;
	D12_DAT_WR_L();
	D12_DAT_WR_H();

	while(Count)
	{
		NOP6();
		D12_OUTPUT = *Buffer++;
		D12_DAT_WR_L();
		D12_DAT_WR_H();

		Count--;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -