?? sd.c
字號:
{
SPI_MasterTransmit(p[i]);
}
SD_CS_PIN=1;
while(!(Status_Register_Read ()&0x80));//檢測忙狀態(tài)確保內(nèi)部時序完成
}
/*-----------------------------------------------------------
擦除某頁將緩存數(shù)據(jù)寫進該頁函數(shù) 操作碼0x83 0x86
格式:操作碼+3字節(jié)地址碼(2無效位+12頁地址+10無效位)
結束標志:CS管腳置高 注意該函數(shù)調(diào)用以后需要一定時間將數(shù)據(jù)寫入芯片,要延時40ms,此時可向另一buffer寫
但在8腳封裝芯片上沒有RDY/BUSY管腳(指示內(nèi)部操作完成),但可以用軟件方法檢測狀態(tài)
-----------------------------------------------------------*/
void Buffer_to_Main_erase (unsigned int pageaddr,unsigned char buffer)
{ // pageaddr 為頁地址,buffer為buffer選擇,1為buffer1,同理
unsigned long j;
j= (((unsigned long)pageaddr)<<10)&0x3ffc00 ;
SD_CS_PIN=0;
if (buffer == 1)
SPI_MasterTransmit(0x83);//操作碼
else
SPI_MasterTransmit(0x86);//操作碼
SPI_MasterTransmit((unsigned char)(j>>16));//地址
SPI_MasterTransmit((unsigned char)(j>> 8));
SPI_MasterTransmit((unsigned char) j);
SD_CS_PIN=1;
while(!(Status_Register_Read ()&0x80));//檢測忙狀態(tài)確保內(nèi)部時序完成
}
/*-----------------------------------------------------------
將緩存數(shù)據(jù)寫進該頁函數(shù) 操作碼0x88 0x89
格式:操作碼+3字節(jié)地址碼(2無效位+12頁地址+10無效位)
結束標志:CS管腳置高 注意該函數(shù)調(diào)用之前需要對操作頁面進行擦除操作以后需要一定
時間將數(shù)據(jù)寫入芯片,要延時6ms 即本函數(shù)要配合擦除函數(shù)
-----------------------------------------------------------*/
void Buffer_to_Main (unsigned int pageaddr,unsigned char buffer)
{ // pageaddr 為頁地址,buffer為buffer選擇,1為buffer1,同理
unsigned long j;
j= (((unsigned long)pageaddr)<<10)&0x3ffc00;
SD_CS_PIN=0;
if (buffer == 1)
SPI_MasterTransmit(0x88);//操作碼
else
SPI_MasterTransmit(0x89);//操作碼
SPI_MasterTransmit((unsigned char)(j>>16));//地址
SPI_MasterTransmit((unsigned char)(j>> 8));
SPI_MasterTransmit((unsigned char) j);
SD_CS_PIN=1;
while(!(Status_Register_Read ()&0x80));//檢測忙狀態(tài)確保內(nèi)部時序完成
}
/*-----------------------------------------------------------
頁擦除函數(shù) 操作碼0x81
格式:操作碼+3字節(jié)地址碼(2無效位+12頁地址+10無效位)
結束標志:CS管腳置高 延時35ms
-----------------------------------------------------------*/
void Page_Erase (unsigned int pageaddr)
{ // pageaddr 為頁地址
unsigned long j;
j= (((unsigned long)pageaddr)<<10)&0x3ffc00;
SD_CS_PIN=0;
SPI_MasterTransmit(0x81);//操作碼
SPI_MasterTransmit((unsigned char)(j>>16));//地址
SPI_MasterTransmit((unsigned char)(j>> 8));
SPI_MasterTransmit((unsigned char) j);
SD_CS_PIN=1;
while(!(Status_Register_Read ()&0x80));//檢測忙狀態(tài)確保內(nèi)部時序完成
}
/*-----------------------------------------------------------
扇區(qū)擦除函數(shù) 每扇區(qū) 操作碼0x7C
格式:操作碼+3字節(jié)地址碼(3無效位+9扇區(qū)地址+12無效位(適于0a、0b扇區(qū)1~15是4扇區(qū)地址+17無效位))
結束標志:CS管腳置高 延時5s
-----------------------------------------------------------*/
void Sector_Erase (unsigned int Sector,unsigned char Sector0)
{ // Sector 為扇區(qū)地址 Sector0為0扇區(qū)a,b部分選擇
SD_CS_PIN=0;
SPI_MasterTransmit(0x7c);//操作碼
if (Sector>0)
{
SPI_MasterTransmit((unsigned char)(Sector<<1)&0x1e);//地址
SPI_MasterTransmit(0x00);
SPI_MasterTransmit(0x00);
}
else
{
SPI_MasterTransmit(0x00);//地址
SPI_MasterTransmit((unsigned char)(Sector0<<4)&0x10);
SPI_MasterTransmit(0x00);
}
SD_CS_PIN=1;
while(!(Status_Register_Read ()&0x80));//檢測忙狀態(tài)確保內(nèi)部時序完成
}
/*-----------------------------------------------------------
塊擦除函數(shù) 每塊8頁 操作碼0x50
格式:操作碼+3字節(jié)地址碼(3無效位+9塊地址+12無效位)
結束標志:CS管腳置高 延時100ms
-----------------------------------------------------------*/
void Block_Erase (unsigned int blockaddr)
{ // blockaddr 為塊地址
SD_CS_PIN=0;
SPI_MasterTransmit(0x50);//操作碼
SPI_MasterTransmit((unsigned char)(blockaddr>>4));//地址
SPI_MasterTransmit((unsigned char)(blockaddr<<4)&0xf0);
SPI_MasterTransmit(0x00);
SD_CS_PIN=1;
while(!(Status_Register_Read ()&0x80));//檢測忙狀態(tài)確保內(nèi)部時序完成
}
/*-----------------------------------------------------------
全盤擦除函數(shù) 每扇區(qū) 操作碼0xC7、94、80、9A
結束標志:CS管腳置高 延時ns
-----------------------------------------------------------*/
void Chip_Erase (void)
{ // Sector 為扇區(qū)地址
SD_CS_PIN=0;
SPI_MasterTransmit(0xc7);//操作碼
SPI_MasterTransmit(0x94);
SPI_MasterTransmit(0x80);
SPI_MasterTransmit(0x9a);
SD_CS_PIN=1;
while(!(Status_Register_Read ()&0x80));//檢測忙狀態(tài)確保內(nèi)部時序完成
}
/*-----------------------------------------------------------
帶緩存寫頁函數(shù) 操作碼0x82 0x85
格式:操作碼+3字節(jié)地址碼(12頁址+10頁內(nèi)地址(528byte))
結束標志:CS管腳置高 要延時40ms
-----------------------------------------------------------*/
void Page_Through_Buffer (unsigned char *p,unsigned int pageaddr,unsigned int byteaddr,unsigned char buffer)
{ // pageaddr 為頁地址,byteaddr為從頁中那個字節(jié)開始寫,buffer為buffer選擇,1為buffer1,同理
unsigned int i;
unsigned long j;
j= ((((unsigned long)pageaddr)<<10)&0x3ffc00)|(((unsigned long)byteaddr)&0x3ff);
SD_CS_PIN=0;
if (buffer == 1)
SPI_MasterTransmit(0x82);//操作碼
else
SPI_MasterTransmit(0x85);//操作碼
SPI_MasterTransmit((unsigned char)(j>>16));//地址
SPI_MasterTransmit((unsigned char)(j>> 8));
SPI_MasterTransmit((unsigned char) j);
for (i=0;i<528;i++)
{
SPI_MasterTransmit(p[i]);
}
SD_CS_PIN=1;
while(!(Status_Register_Read ()&0x80));//檢測忙狀態(tài)確保內(nèi)部時序完成
}
/*-----------------------------------------------------------
頁數(shù)據(jù)讀入緩存函數(shù) 操作碼0x53 0x55
格式:操作碼+3字節(jié)地址碼(12頁址+10頁內(nèi)地址(528byte))
結束標志:CS管腳置高 要延時400us
-----------------------------------------------------------*/
void Page_to_Buffer (unsigned int pageaddr,unsigned char buffer)
{ // pageaddr 為頁地址,buffer為buffer選擇,1為buffer1,同理
unsigned long j;
j= (((unsigned long)pageaddr)<<10)&0x3ffc00;
SD_CS_PIN=0;
if (buffer == 1)
SPI_MasterTransmit(0x53);//操作碼
else
SPI_MasterTransmit(0x55);//操作碼
SPI_MasterTransmit((unsigned char)(j>>16));//地址
SPI_MasterTransmit((unsigned char)(j>> 8));
SPI_MasterTransmit((unsigned char) j);
SD_CS_PIN=1;
while(!(Status_Register_Read ()&0x80));//檢測忙狀態(tài)確保內(nèi)部時序完成
}
/*-----------------------------------------------------------
軟件寫保護 操作碼0x3D、2A、7F、A9
結束標志:CS管腳置高 延時18s
-----------------------------------------------------------*/
void Enable_Sector_Protection (void)
{
SD_CS_PIN=0;
SPI_MasterTransmit(0x3d);//操作碼
SPI_MasterTransmit(0x2a);
SPI_MasterTransmit(0x7f);
SPI_MasterTransmit(0xa9);
SD_CS_PIN=1;
while(!(Status_Register_Read ()&0x80));//檢測忙狀態(tài)確保內(nèi)部時序完成
}
/*-----------------------------------------------------------
解除軟件寫保護 操作碼0x3D、2A、7F、9A
結束標志:CS管腳置高 延時ns
-----------------------------------------------------------*/
void Disenable_Sector_Protection (void)
{
SD_CS_PIN=0;
SPI_MasterTransmit(0x3d);//操作碼
SPI_MasterTransmit(0x2a);
SPI_MasterTransmit(0x7f);
SPI_MasterTransmit(0x9a);
SD_CS_PIN=1;
while(!(Status_Register_Read ()&0x80));//檢測忙狀態(tài)確保內(nèi)部時序完成
}
/*-----------------------------------------------------------
讀取廠商和設備信息 操作碼:0x9F
格式:操作碼
返回:0x1F (ATMEL) ID信息(2字節(jié)) 0x00
-----------------------------------------------------------*/
void ManufacturerDevice_read (unsigned char *p)
{
unsigned int i;
SD_CS_PIN=0;
SPI_MasterTransmit(0x9f);
for (i=0;i<4;i++)
{
p[i] = SPI_MasterReceive();
}
SD_CS_PIN=1;
while(!(Status_Register_Read ()&0x80));//檢測忙狀態(tài)確保內(nèi)部時序完成
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -