?? d12_operation.c
字號:
#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 + -