?? main.c
字號:
/*************************************************************************************
* Copyright (c) 2007 by PROCHIP Limited.
* PROPRIETARY RIGHTS of PROCHIP Limited are involved in the subject matter of this
* material. All manufacturing, reproduction, use, and sales rights
* pertaining to this subject matter are governed by the license agreement.
* The recipient of this software implicitly accepts the terms of the license.
*
* File Name: main.c
*
* File Description: 主函數, 實現具體功能.
*
* Version Date Author
*------------------------------------------------------------------------------------
* 0.0.1 2008.1.9
*
*************************************************************************************/
#include <stdio.h>
#include "ub4020evb.h"
#include "intc.h"
#define MEM_BLOCK_BEGIN 0x30200000
#define MEM_BLOCK_END 0x30220000
#define BLOCK_SIZE 1280
#define END(i) (MEM_BLOCK_END+i*(1<<16))
/*************************************************************
* FUNCTION
*
* CompareMem
*
* DESCRIPTION
*
* 比較2塊數據塊的內容是否一致。
*
* AUTHOR
*
* wuer
*
* INPUTS
*
* U32 src, 第一塊數據塊的首地址
* U32 dest, 第二塊數據塊的首地址
* U32 len, 比較的數據塊大小
*
* OUTPUTS
*
* 無 (出錯打印信息)
*
***************************************************************/
void CompareMem(U32 src, U32 dest,U32 len)
{
U32 i;
U32 a,b;
for(i=0;i<len;i++)
{
a = *(RP8)src;
b = *(RP8)dest;
if(a != b)
{
printf("Data different at 0x%lx\n",dest);
}
src ++;
dest ++;
}
printf("Data ok\n");
}
/*************************************************************
* FUNCTION
*
* int SendCmdWaitRespIni(U16 Cmd,U32 Arg,U16 trans_mode,U16 blk_len,U16 nob,U16 int_mask)
*
* DESCRIPTION
*
* 向SD控制器發送命令,等待SD控制器確認收到命令
*
* AUTHOR
*
* yao
*
* INPUTS
*
* Cmd: 命令編號;
* Arg: 命令參數;
* TransMode SD傳輸模式;
* BlkLen: 數據塊長度;
* Nob: 數據塊數目;
* IntMask: 中斷允許標志;
*
* OUTPUTS
*
* *(RP)SDC_RESPONSE0 SD命令響應
*
*************************************************/
int SendCmdWaitRespIni(U16 Cmd,U32 Arg,U16 TransMode,U16 BlkLen,U16 Nob,U16 IntMask)
{
U32 i;
*(RP)SDC_CLOCK_CONTROL=0Xff00; //配置SD時鐘
for (i=0;i<10;i++);
*(RP)SDC_CLOCK_CONTROL=0Xff04; //打開SD時鐘
for (i=0;i<10;i++);
*(RP)SDC_INTERRUPT_STATUS_MASK=IntMask;
for (i=0;i<10;i++);
*(RP)SDC_TRANSFER_MODE=TransMode;
for (i=0;i<10;i++);
*(RP)SDC_BLOCK_SIZE=BlkLen;
for (i=0;i<10;i++);
*(RP)SDC_BLOCK_COUNT=Nob;
for (i=0;i<10;i++);
*(RP)SDC_ARGUMENT=Arg;
for (i=0;i<10;i++);
*(RP)SDC_COMMAND=Cmd;
for (i=0;i<10;i++);
i = *(RP)SDC_INTERRUPT_STATUS & 0x1000;
for (i=0;i<10;i++);
while(i != 0x1000)
{
i = *(RP)SDC_INTERRUPT_STATUS & 0x1000;
}
for( i=0; i<160; i++);
return *(RP)SDC_RESPONSE0;
}
/*************************************************************
* FUNCTION
*
* int SendCmdWaitResp(U16 Cmd,U32 Arg,U16 TransMode,U16 BlkLen,U16 Nob,U16 IntMask)
*
* DESCRIPTION
*
* 向SD控制器發送命令并傳送數據,等待SD控制器確認收到命令
*
* AUTHOR
*
* yao
*
* INPUTS
*
* Cmd: 命令編號;
* Arg: 命令參數;
* TransMode SD傳輸模式;
* BlkLen: 數據塊長度;
* Nob: 數據塊數目;
* IntMask: 中斷允許標志;
*
* OUTPUTS
*
* *(RP)SDC_RESPONSE0 SD命令響應
*
*************************************************/
int SendCmdWaitResp(U16 Cmd,U32 Arg,U16 TransMode,U16 BlkLen,U16 Nob,U16 IntMask)
{
U32 i;
*(RP)SDC_CLOCK_CONTROL=0Xff00; //配置SD時鐘
for (i=0;i<1000;i++);
*(RP)SDC_CLOCK_CONTROL=0Xff04; //打開SD時鐘 // CLK_20M = APB時鐘;CLK_DIV = CLK_20M/64
for (i=0;i<10000;i++);
*(RP)SDC_INTERRUPT_STATUS_MASK=IntMask;
*(RP)SDC_TRANSFER_MODE=TransMode;
*(RP)SDC_BLOCK_SIZE=BlkLen;
*(RP)SDC_BLOCK_COUNT=Nob;
*(RP)SDC_ARGUMENT=Arg;
*(RP)SDC_COMMAND=Cmd;
for (i=0;i<10;i++);
i = *(RP)SDC_INTERRUPT_STATUS & 0x1040;
while(i != 0x1040)
{
i = *(RP)SDC_INTERRUPT_STATUS & 0x1040;
}
for( i=0; i<1000; i++);
return *(RP)SDC_RESPONSE0;
}
/*************************************************************
* FUNCTION
*
* int SendCmdWaitIdle(U16 Cmd,U32 Arg,U16 IntMask )
*
* DESCRIPTION
*
* 向SD控制器發送命令,等待SD控制器確認收到命令
*
* AUTHOR
*
* yao
*
* INPUTS
*
* Cmd: 命令編號;
* Arg: 命令參數;
* IntMask: 中斷允許標志;
*
* OUTPUTS
*
* *(RP)SDC_RESPONSE0 SD命令響應
*
*************************************************/
int SendCmdWaitIdle(U16 Cmd,U32 Arg,U16 IntMask )
{
int i;
*(RP)SDC_CLOCK_CONTROL=0Xff00; //配置SD時鐘 配置分頻比
for (i=0;i<10;i++);
*(RP)SDC_CLOCK_CONTROL=0X0004; //打開SD時鐘 配置分頻比
for (i=0;i<1000;i++);
*(RP)SDC_COMMAND=Cmd;
for (i=0;i<10;i++);
*(RP)SDC_INTERRUPT_STATUS_MASK=IntMask;
for (i=0;i<10;i++);
*(RP)SDC_ARGUMENT=Arg;
for (i=0;i<10;i++);
i = *(RP)SDC_INTERRUPT_STATUS & 0x1000;
while(i != 0x1000)
{
i = *(RP)SDC_INTERRUPT_STATUS & 0x1000;
}
for (i=0;i<1300;i++);
return *(RP)SDC_RESPONSE0;
return 1;
}
/*************************************************************
* FUNCTION
*
* void wait()
*
* DESCRIPTION
*
* 等待
*
* AUTHOR
*
* yao
*
* INPUTS
* 無
*
* OUTPUTS
*
* 無
*
*************************************************/
void wait()
{
U32 resp;
SendCmdWaitRespIni(0x1aa,0X0,0X0,0x0,0x0,0X0);//CMD13
resp = *(RP)SDC_INTERRUPT_STATUS & 0x1000;
while (resp != 0x1000)
{
SendCmdWaitRespIni(0x1aa,0X0,0X0,0x0,0x0,0X0);//CMD13
resp = *(RP)SDC_INTERRUPT_STATUS & 0x1000;
}
}
/*************************************************************
* FUNCTION
*
* void erase()
*
* DESCRIPTION
*
* 擦除
*
* AUTHOR
*
* yao
*
* INPUTS
*
* 無
*
* OUTPUTS
*
* 無
*
*************************************************/
void erase()
{
U32 i;
for (i = 0;i<100;i++);
SendCmdWaitRespIni(0x40a,0X0,0X0,0x0,0x0,0X0);//CMD35 配置起始地址
for (i = 0;i<100;i++);
SendCmdWaitRespIni(0x42a,0X4000,0X0,0x0,0x0,0X0);//CMD36 配置結束地址
for (i = 0;i<100;i++);
SendCmdWaitRespIni(0x4cb,0X0,0X0,0x0,0x0,0X0);//CMD38 執行擦除操作
for (i = 0;i<1000;i++);
}
/*************************************************************
* FUNCTION
*
* U32 InitialSd()
*
* DESCRIPTION
*
* 初始化SD卡
*
* AUTHOR
*
* yao
*
* INPUTS
*
* 無
*
* OUTPUTS
*
* rca SD卡的rca地址號
*
*************************************************/
U32 InitialSd()
{
U32 i,rca;
*(RP)SDC_SOFTWARE_RESET=0x0;
for (i=0;i<200;i++);
*(RP)SDC_SOFTWARE_RESET=0x1;
for (i=0;i<200;i++);
SendCmdWaitIdle(0x08,0x0,0xfff); //CMD0
for (i=0;i<8000;i++);
do
{
SendCmdWaitIdle(0x6ea,0x0,0xfff);//CMD55
for (i=0;i<3;i++);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -