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

📄 d12_operation.c

📁 基於MCU c51/8051 讀寫SD/MMC card 再以USB 傳回電腦的範例程序
💻 C
字号:
/* ELEC254 Group32 USB SD Card Reader */

#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)
{
	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)
{
	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_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)
{
	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)
{
	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)
{
	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)
{
	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)
{
	NOP4();
	D12_OUTPUT_MODE();
	D12_OUTPUT = 0xf6;
	D12_CMD_WR_L();
	D12_CMD_WR_H();

	NOP4();
}

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)
{

	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)
{
	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)
{
	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--;
	}
	NOP4();
	D12_Enable_Buffer();
}

void D12_Write_Endpoint_SD(U8 Endpoint)
{
	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_OUTPUT = 0;
	D12_DAT_WR_L();
	D12_DAT_WR_H();

	NOP6();

	D12_OUTPUT = 64;
	D12_DAT_WR_L();
	D12_DAT_WR_H();
	
	
	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();

	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();

	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();

	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();
	
	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();

	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();

	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();

	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();
	
	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();

	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();

	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();

	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();
	
	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();

	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();

	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();

	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();
	
	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();

	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();

	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();

	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();
	
	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();

	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();

	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();

	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();
	
	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();

	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();

	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();

	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();
	
	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();

	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();

	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();

	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();
	
	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();

	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();

	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();

	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();
	
	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();

	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();

	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();

	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();
	
	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();

	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();

	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();

	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();
	
	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();

	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();

	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();

	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();
	
	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();

	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();

	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();

	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();
	
	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();

	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();

	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();

	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();
	
	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();

	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();

	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();

	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();
	
	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();

	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();

	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();

	D12_OUTPUT = SPI_WriteByte(0xff);
	D12_DAT_WR_L();
	D12_DAT_WR_H();

	NOP4();
	D12_Enable_Buffer();
}

U16 D12_Read_Interrupt_Register(void)
{
	U16 temp;
	U8 temp2;
	NOP4();

	D12_OUTPUT_MODE();
	D12_OUTPUT = 0xf4;
	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();
	temp2 = D12_INPUT;
	D12_CMD_RD_H();
	
	NOP4();

	return temp;
}

void D12_Clear_Buffer(void)
{

	NOP4();

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

	NOP4();
}

void D12_Enable_Buffer(void)
{

	NOP4();

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

	NOP4();
}

U16 D12_Read_Current_Frame_Number(void)
{
	U16 temp;

	NOP4();
	
	D12_OUTPUT_MODE();
	D12_OUTPUT = 0xf5;
	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_Last_Transaction_Status(U8 Endpoint)
{
	U8 temp;
	NOP4();

	D12_OUTPUT_MODE();
	D12_OUTPUT = Endpoint+0x40;
	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;
}

⌨️ 快捷键说明

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