欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
SD Card 驅動(dòng)流程分析
一、硬件接口電路
首先來(lái)看一下SD card的一個(gè)硬件應用電路,如下圖所示:
SD卡有兩種工作模式,一個(gè)是spi接口模式,一個(gè)是SD模式,后者傳輸速率快些,這里討論SD模式;SD總線(xiàn)包含4個(gè)數據總線(xiàn)(SDIO0-SDIO3),1個(gè)命令線(xiàn)(SDCMD)和一個(gè)同步時(shí)鐘SDCLK;圖上第10腳是卡檢測信號。這里需注意的是傳輸總線(xiàn)必須加上拉。數據總線(xiàn)不一定全部要用到,根據需求可以選擇數據總線(xiàn)個(gè)數。
二、SD卡初始化過(guò)程
SD卡的初始化過(guò)程,簡(jiǎn)單一點(diǎn)說(shuō)包括:1.主機reset所有掛在SD總線(xiàn)上的CARD. 2.確認卡的工作電壓范圍。3.獲取卡的RCA(相對地址)??▌澐譃槭畟€(gè)工作狀態(tài),分別是如下所示:
初始化階段需要涉及前面四個(gè)狀態(tài),即inactive state、idle 、ready、identification  state。 初始化狀態(tài)圖如下:
SD卡是通過(guò)命令與host互動(dòng)的,主機發(fā)命令,sd卡接收到命令后返回相應的響應。所有命令和響應的傳輸都是在命令線(xiàn)上進(jìn)行的。剛上電時(shí),host發(fā)送CMD0來(lái)reset所有的sd卡(不管當前處于什么狀態(tài)),使之進(jìn)入idle狀態(tài)。
通過(guò)發(fā)送CMD8命令,告訴SD卡host提供的工作電壓范圍,若SD卡支持host提供的工作范圍,將在命令線(xiàn)上返回該值,可以說(shuō)明當前是ver2.0SD存儲卡。若SD卡不支持host提供的工作電壓范圍,它將沒(méi)有響應而繼續處在idle state。如果該卡沒(méi)有響應則是ver1.x。對于高容量SD存儲卡CMD8命令是必須的。接下來(lái)需要發(fā)送ACMD41來(lái)決定是否拒絕或者說(shuō)拋棄當前的SD卡(讓它們進(jìn)入inactive state),很明顯那些與host設計工作電壓范圍不匹配的卡將會(huì )遭此待遇。另外ACMD41命令的參數里面還包含了HCS位,即host capicity support,置1表示host支持高容量sd卡。對于高容量SD存儲卡,該位必須設為1,否則高容量卡響應中的busy 位不會(huì )置1,該busy位在OCR寄存器的第31位,是用來(lái)指示SD卡是否初始化完畢,即進(jìn)入ready state(busy bit is set to 1)。對于標準SD容量卡,HCS位設為0。要使的sd卡初始化完成并進(jìn)入ready狀態(tài),不僅HCS位要設置正確,host還必須重復發(fā)送ACMD41命令,直到busy 位置1。ACMD41的響應中除了busy位,還有一個(gè)CCS位(card capcity status),當CCS = 1時(shí),表示當前sd卡是高容量sd卡,CCS=0表示當前sd卡是標準容量sd卡。
接著(zhù)host發(fā)送cmd2來(lái)獲取sd卡的一些出廠(chǎng)信息(CID),比如出廠(chǎng)序列號之類(lèi)的,這些信息也是通過(guò)命令響應的方式傳送給host,sd卡返回CID信息后就進(jìn)入identification state。
發(fā)送cmd3使card傳送rca給host,rca是用來(lái)給sd卡編址的,用于后面的數據傳送。一旦獲取了rca,sd卡就進(jìn)入stand-by state。這個(gè)時(shí)候如果host想得到新的rca,再次發(fā)送cmd3即可。
具體的初始化和卡識別流程如下圖:
初始化注意事項:1、在初始化動(dòng)作之前,至少發(fā)送74個(gè)null clock ,否則可能會(huì )遇到初始化失敗。
2、ACMD命令發(fā)送之前需要發(fā)送cmd55命令,告訴sd卡host接下來(lái)要發(fā)送ACMD類(lèi)型的命令,A表示application,初始化的時(shí)候cmd55命令參數中的rca使用默認的值0x0000,初始化之后必須是相應rca。
3、整個(gè)初始化過(guò)程使用小于400KHZ時(shí)鐘,因為有的卡在初始化和識別階段對clock有限制,在數據傳送之前把clock調整即可。
三、數據傳送
從上圖可以很清晰地看到它的一個(gè)流程,進(jìn)入數據傳送模式開(kāi)始sd卡是處在Stand-by狀態(tài)的,此時(shí)可以發(fā)送命令獲取SD卡的一些信息,比如發(fā)送cmd9來(lái)計算sd卡的容量。要想進(jìn)入transfer狀態(tài),我們必須通過(guò)CMD7先選中某一張卡,該命令的參數設為我們想要選中sd卡的RCA,即初始化階段得到的RCA。在同一個(gè)時(shí)刻,只能有一張卡處在transfer狀態(tài),其他與cmd7命令攜帶參數(RCA)不匹配的卡會(huì )回到stand-by狀態(tài)。所以說(shuō)要選中某張卡,只要設置相應的RCA,而釋放一張卡,我們就設置與之不匹配的RCA(一般設為默認的值0x0000)。選中卡之后就進(jìn)入transfer state,這時(shí)我們可以發(fā)送acmd6設置數據傳輸的總線(xiàn)位寬,默認是1,注意此操作有兩個(gè)前提,一是處在transfer state ,二是當前卡沒(méi)有被lock。發(fā)送cmd17讀單快數據,cmd18讀多塊數據,cmd24寫(xiě)單塊,cmd25寫(xiě)多塊,這些命令都帶需要讀取數據的首地址。在對多塊進(jìn)行讀寫(xiě)的時(shí),直到host發(fā)送cmd12才停止。
對block寫(xiě)數據操作完成后,sd卡會(huì )進(jìn)入編程階段,sd卡是提供緩沖區的,也就是說(shuō)上一個(gè)block在編程時(shí)可以寫(xiě)下一個(gè)block數據。當緩沖區滿(mǎn)了,并且這是卡還在programming,這時(shí)DAT0數據線(xiàn)會(huì )被拉低,告訴host此時(shí)忙碌。
四、程序
程序是在ZSP200內核的DSP芯片上實(shí)現的,16位數據總線(xiàn),60MH的奔跑速度。下面是調試代碼,還沒(méi)來(lái)及優(yōu)化,實(shí)現了block的讀寫(xiě),在板子上驗證ok。
[cpp] view plaincopy
<span style="font-family:Microsoft YaHei;font-size:12px;"></span>
[cpp] view plaincopy
<span style="font-family:Microsoft YaHei;font-size:12px;">void sd_mmc_setup()
{
uint16 reg16_val;
uint32 reg32_val;
U8 i;
SysReadAMBAReg((uint32)SYS_PWRPEN_REG,reg32_val);
reg32_val |= (1L<<2);
SysWriteAMBAReg((uint32)SYS_PWRPEN_REG,reg32_val);      //開(kāi)啟SD/MMC控制器
sys_delay_ms(300L);
mmc_write_reg(MMC_CAR_SEL, 0xdd);        // enable module, enable mmcclk
mmc_write_reg(MMC_CRC_CTL, 0xd0);        // CRC circuit enable
mmc_write_reg(MMC_CTL, 0x0b);            // 1bit,low speed(256KHZ),1/4 divider,auto transfer, mmc mode.
//mmc_write_reg(MMC_INT_MASK, 0x7f);       // unmask all interrupt
for (i = 0; i<10; i++)                   // at least 74 clock for setup
{
mmc_write_reg(MMC_IO,0x24);          // only 8 null clock generation
mmc_read_reg(MMC_INT_CLR,reg16_val);
while(reg16_val != 0x01)
{
mmc_read_reg(MMC_INT_CLR,reg16_val);
}
mmc_write_reg(MMC_INT_CLR,reg16_val);
}
myptf("sd_mmc_setup finished!\r\n");
return;
}
U8 sd_write_cmd(U8 *cmd, BOOL b_resp)
{
U8 i;
uint16 reg16_val;
uint32 addr = MMC_CMD_BUF4;
for(i=0;i<5;i++)
{
mmc_write_reg(addr, cmd[i]);
addr -= 2;
}
if(b_resp == FALSE)
{
mmc_write_reg(MMC_IO,0x04);     //auto only command enable
}
else if ((cmd == cmd2) || (cmd == cmd9))
{
mmc_write_reg(MMC_IO,0x54);     //auto command + response,enable get CID front command buffer[135:8]
//mmc_write_reg(MMC_IO,0x0c);    //auto only response enable
}
/*else if (cmd == cmd24)
{
mmc_write_reg(MMC_IO, 0x01);              //write data, trig transfer
}*/
else
{
mmc_write_reg(MMC_IO,0x44);     //auto command + response
}
/*wait and clear sdmmc CMD done interrupt*/
mmc_read_reg(MMC_INT_CLR,reg16_val);
while(!(reg16_val & (1<<0)))
{
mmc_read_reg(MMC_INT_CLR,reg16_val);
if ((reg16_val & (1<<6)) != 0)           //command or response timer out
{
mmc_write_reg(MMC_INT_CLR,0x40);    //clear interrupt;
myptf("Send Cmd%d  Timerout!\r\n", cmd[0]-0x40);
return 0;
}
}
myptf("Interrupt Flag : %d\r\n", reg16_val);
mmc_write_reg(MMC_INT_CLR,0x1);        //clear CMD done interrupt;
return 1;
}
SD_RESPONSE_INFO get_response_info(void) //Only for 48 bit response
{
SD_RESPONSE_INFO res;
uint16 reg16_val;
uint32 reg32_val,addr;
U8 i;
addr = MMC_CMD_BUF3;
mmc_read_reg(MMC_CMD_BUF4, reg16_val);
myptf("res.cmd_index =%d\r\n", reg16_val);
res.cmd_index = reg16_val;
for (i=0; i<4; i++)
{
reg32_val <<= 8;
mmc_read_reg(addr, reg16_val);
reg32_val |= reg16_val;
addr -= 2;
}
res.card_status = reg32_val;
myptf("res.card_status =%ld\r\n", reg32_val);
mmc_read_reg(MMC_CRC_VAL, reg16_val);
res.crc = reg16_val;
return res;
}
BOOL sd_mmc_identify()
{
SD_RESPONSE_INFO resp;
U16 reg16_val;
U8 i;
sd_write_cmd(cmd0,FALSE);       //set the card into idle state
sd_write_cmd(cmd8,TRUE);        //verify the card operation condition;
resp = get_response_info();
CardType = 0; //ver2.0
if ( (resp.cmd_index != 0x08)
|| (resp.card_status != 0x15a) )
{
myptf("Erro Response for cmd8\r\n");
CardType = 1;
}
myptf("Ready to Tansmit ACMD!\r\n");
do
{
CMD55:
sd_write_cmd(cmd55, TRUE);      //For Transmit ACMD;
resp = get_response_info();
if ((resp.card_status & (1L<<5)) != 0x20)
{
goto CMD55;
}
if(CardType == 0)
sd_write_cmd(acmd41_1, TRUE);
else
sd_write_cmd(acmd41_0, TRUE);
resp = get_response_info();
if ( (resp.cmd_index != 0x3f)
|| ((resp.card_status & 0x00ffffff) != 0xff8000) )
{
myptf("Unusable Card!\r\n");
//return FALSE;
}
}while( (resp.card_status & (1L<<31)) == 0 ); //card is busy Wait for power up!
myptf("SD Card Power On!\r\n");
if ( !(resp.card_status & (1L<<30)) )
{
myptf("This is Standard Capacity SD Memery Card!\r\n");
}
else
{
myptf("This is High Capacity SD Memery Card!\r\n");
}
CMD2:
sd_write_cmd(cmd2,TRUE);    //it makes card identification state
mmc_read_reg(MMC_CMD_BUF15, reg16_val);
if (reg16_val != 0x3f)
{
goto CMD2;
}
myptf("Read CID...\r\n");
CMD3:
sd_write_cmd(cmd3,TRUE);    //get the card's RCA and change to standby state;
resp = get_response_info();
if (resp.cmd_index != 0x03)
{
//myptf("Erro Response for cmd3!\r\n");
goto CMD3;
}
card_addr = (U16)((resp.card_status & 0xffff0000) >> 16);
card_state = (U16)(resp.card_status & 0x0000ffff);
myptf("current card addr is %ld\r\n",card_addr);
myptf("current card state is %ld\r\n",card_state);
return TRUE;
}
BOOL read_cards_capacity(U16 rca)
{
U16 reg16_val;
U32 c_size;
cmd9[1] = rca/256;
cmd9[2] = rca%256;
sd_write_cmd(cmd9, TRUE);
mmc_read_reg(MMC_CMD_BUF15, reg16_val);
if (reg16_val != 0x3f)
{
myptf("Read Capacity Failed!\r\n");
return FALSE;
}
mmc_read_reg(MMC_CMD_BUF7, reg16_val); //read c_zize value
c_size = reg16_val & 0x3f;
c_size <<= 8;
mmc_read_reg(MMC_CMD_BUF6, reg16_val);
c_size |= reg16_val;
c_size <<= 8;
mmc_read_reg(MMC_CMD_BUF5, reg16_val);
c_size |= reg16_val;
card_capacity = ((c_size + 1) * 512) / 1024;
return TRUE;
}
void card_select(U16 rca, BOOL sel)  //change between standby and transfer state;
{
SD_RESPONSE_INFO resp;
cmd7[1] = 0x00;     //deselect card;
cmd7[2] = 0x00;
if (sel == TRUE)    //Select card
{
cmd7[1] = rca/256;
cmd7[2] = rca%256;
}
CMD7:
if (!(sd_write_cmd(cmd7, TRUE)))
{
goto CMD7;
}
//get_response_info();
}
void set_bus_width(U8 wide)               // width = 0:1bit; width = 2: 4bit ;
{
acmd6[4] = wide;
cmd55[1] = card_addr/256;
cmd55[2] = card_addr%256;                 //note: cmd55's argument include rca;
SETBUS:
sd_write_cmd(cmd55, TRUE);                //For Transmit ACMD;
//get_response_info();
if (!(sd_write_cmd(acmd6, TRUE)))
goto SETBUS;
get_response_info();
return;
}
void set_block_size()
{
sd_write_cmd(cmd16, TRUE);  // set block length 512 bytes;
get_response_info();
}
void read_block(U32 addr, U8 block_cnt)
{
U16 reg16_val;
U32 reg32_val;
U8 i,j;
//SD_RESPONSE_INFO resp;
//addr <<= 9;             // addr*521
mmc_write_reg(MMC_buf_ctl, 0x9000);       //active fifo status,flush fifo,disable dma,read sd-card,wm-128
if (block_cnt < 2)      //read single block
{
cmd17[1] = (U8)(addr>>24);
cmd17[2] = (U8)((addr>>16) & 0xff);
cmd17[3] = (U8)((addr>>8) & 0xff);
cmd17[4] = (U8)(addr & 0xff);
CMD17:
if(!(sd_write_cmd(cmd17, TRUE)))
{
goto CMD17;
}
get_response_info();
mmc_write_reg(MMC_BYTE_CNTH, 0x02);               //transfer 512 bytes
mmc_write_reg(MMC_IO, 0x03);                      //read data, auto transfer
}
else                                                  //read multi blockss
{
cmd18[1] = (U8)(addr>>24);
cmd18[2] = (U8)((addr>>16) & 0xff);
cmd18[3] = (U8)((addr>>8) & 0xff);
cmd18[4] = (U8)(addr & 0xff);
CMD18:
if (!(sd_write_cmd(cmd18, TRUE)))
{
goto CMD18;
}
//get_response_info();
//sys_delay_ms(20L);                               //delay befor trig transfer orelse erro
mmc_write_reg(MMC_BLOCK_CNT, block_cnt);         // set read block number;
//mmc_write_reg(MMC_IO, 0xc0);
mmc_write_reg(MMC_IO_MBCTL, 0x53);               // trig data transfer;
}
mmc_read_reg(MMC_buf_ctl, reg16_val);
while( !( reg16_val & ( 1<<0 ) ) )                  //wait for fifo full;
{
mmc_read_reg(MMC_buf_ctl, reg16_val);
}
//myptf("FIFO Full\r\n");
for(j=0; j<128*block_cnt; j++)
{
/*mmc_read_reg(MMC_buf_ctl, reg16_val);
while( ( reg16_val & ( 1<<1 ) ) == 0x02 )              // fifo empty?
{
mmc_read_reg(MMC_buf_ctl, reg16_val);
myptf("fifo empty!\nPlease Wait...\r\n");
}*/
SysReadAMBAReg(MMC_DATA_BUF0, sd_rd_buf[j]);
//for(i=0; i<50; i++);                           //delay for reading data else data erro appeared;
}
mmc_read_reg(MMC_INT_CLR,reg16_val);               //wait for data transfer finished
while( (reg16_val & (1<<1)) != 0x02 )
{
mmc_read_reg(MMC_INT_CLR,reg16_val);
}
myptf("Read Data Finished!\r\n");
mmc_write_reg(MMC_INT_CLR,0x02);                  //clear interrupt;
//mmc_read_reg(MMC_buf_ctl, reg16_val);
//myptf("fifo full?:%d\r\n", (reg16_val&0x01));
//myptf("fifo Empty?:%d\r\n", (reg16_val&0x02));
if (block_cnt > 1)
{
while((reg16_val & (1<<4)) != 0x10)
{
mmc_read_reg(MMC_INT_CLR,reg16_val);
}
mmc_write_reg(MMC_INT_CLR,0x10);            //clear interrupt flag;
myptf("Read Muliti Block Finished!\r\n");
CMD12:
if (!(sd_write_cmd(cmd12, TRUE)))
{
goto CMD12;
}
}
}
void write_block(U32 addr, U8 block_cnt)        //block_cnt <65536
{
U16 reg16_val;
U8 i,j;
//SD_RESPONSE_INFO resp;
//addr <<= 9;
if (block_cnt < 2)                            //write single block
{
cmd24[1] = (U8)(addr>>24);
cmd24[2] = (U8)((addr>>16) & 0xff);
cmd24[3] = (U8)((addr>>8) & 0xff);
cmd24[4] = (U8)(addr & 0xff);
CMD24:
if(!(sd_write_cmd(cmd24, TRUE)))
{
goto CMD24;
}
//get_response_info();
//sys_delay_ms(20L);
mmc_write_reg(MMC_BYTE_CNTH, 0x02);       //transfer 512 bytes
mmc_write_reg(MMC_buf_ctl, 0x9800);       //active fifo status,disable dma, write sd-card,
mmc_write_reg(MMC_IO, 0x01);              //write data, trig transfer
}
else                                          //write multi block
{
cmd25[1] = (U8)(addr>>24);
cmd25[2] = (U8)((addr>>16) & 0xff);
cmd25[3] = (U8)((addr>>8) & 0xff);
cmd25[4] = (U8)(addr & 0xff);
cmd55[1] = card_addr / 256;
cmd55[2] = card_addr % 256;
acmd23[3] = block_cnt / 256;
acmd23[4] = block_cnt % 256;
ACMD23:
sd_write_cmd(cmd55, TRUE);
if(!(sd_write_cmd(acmd23, TRUE)))
{
goto ACMD23;
}
CMD25:
if(!(sd_write_cmd(cmd25, TRUE)))
{
goto CMD25;
}
//get_response_info();
//sys_delay_ms(20L);
mmc_write_reg(MMC_BLOCK_CNT, block_cnt);   // set write block number;
mmc_write_reg(MMC_buf_ctl, 0x9800);       //active fifo status,disable dma, write sd-card,
mmc_write_reg(MMC_IO_MBCTL, 0x51);        // trig data transfer;
}
mmc_read_reg(MMC_buf_ctl, reg16_val);
while( !( reg16_val & ( 1<<1 ) ) )           //wait for fifo empty;
{
mmc_read_reg(MMC_buf_ctl, reg16_val);
}
//myptf("FIFO Empty\r\n");
for(j=0; j<128*block_cnt; j++)
{
SysWriteAMBAReg(MMC_DATA_BUF0, sd_rd_buf[j]);
//for(i=0; i<220; i++);
/*mmc_read_reg(MMC_buf_ctl, reg16_val);
while((reg16_val & 0x01) == 0x01)              //fifo full?
{
myptf("fifo full!\nPlease Wait...\r\n");
mmc_read_reg(MMC_buf_ctl, reg16_val);
}*/
}
mmc_read_reg(MMC_INT_CLR,reg16_val);         //wait for data transfer finished
while((reg16_val & (1<<1)) != 0x02 )
{
mmc_read_reg(MMC_INT_CLR,reg16_val);
}
myptf("Interrupt Flag : %d\r\n", reg16_val);
mmc_write_reg(MMC_INT_CLR,0x02);             //clear data done interrupt;
myptf("Write Data finished!\r\n");
if ( block_cnt > 1 )
{
while((reg16_val & (1<<4)) != 0x10)     //wait multi block done
{
mmc_read_reg(MMC_INT_CLR,reg16_val);
}
mmc_write_reg(MMC_INT_CLR,0x10);        //clear multi block done interrupt;
myptf("Write multi block finished!\r\n");
CMD12_1:
if (!(sd_write_cmd(cmd12, TRUE)))       //End Data transfer;
{
goto CMD12_1;
}
get_response_info();
}
}
void sd_mmc_initial()
{
sd_mmc_setup();
if (sd_mmc_identify() == FALSE)
{
myptf("sd card initial failed!\r\n");
}
else
{
myptf("sd card initial succesful!\r\n");
if ( read_cards_capacity(card_addr) == TRUE )
{
myptf("current card capacity is: %ldM\r\n", card_capacity);
}
card_select(card_addr, TRUE);
set_bus_width(BUS_4_BIT);             // set transfer data bus;
set_block_size();
mmc_write_reg(MMC_CTL,0xc3);          // 4bit data,high speed(30M),1/2 divider,auto transfer, mmc mode.
mmc_write_reg(MMC_IO_MBCTL, 0x50);    // timer out scal
}
}
</span>
/*測試代碼*/
[cpp] view plaincopy
U8 cmd0[5]={0x40,0x00,0x00,0x00,0x00};
U8 cmd2[5]={0x42,0x00,0x00,0x00,0x00};
U8 cmd3[5]={0x43,0x00,0x00,0x00,0x00};
U8 cmd7[5]={0x47,0x00,0x00,0x00,0x00};
U8 cmd8[5]={0x48,0x00,0x00,0x01,0x5a};     // 2.7-3.6V; use‘10101010b’for the‘check pattern’
U8 cmd9[5]={0x49,0x00,0x00,0x00,0x00};
U8 cmd12[5]={0x4c,0x00,0x00,0x00,0x00};    // stop transfer command;
U8 cmd16[5]={0x50,0x00,0x00,0x02,0x00};    // set block length 512 bytes;
U8 cmd17[5]={0x51,0x00,0x00,0x00,0x00};    // read single block;
U8 cmd18[5]={0x52,0x00,0x00,0x00,0x00};    // read multi block;
U8 cmd24[5]={0x58,0x00,0x00,0x00,0x00};    // write single block;
U8 cmd25[5]={0x59,0x00,0x00,0x00,0x00};    // write single block;
U8 cmd55[5]={0x77,0x00,0x00,0x00,0x00};
U8 acmd6[5]={0x46,0x00,0x00,0x00,0x00};    // set transfer data bus
U8 acmd23[5]={0x57,0x00,0xff,0x80,0x00};
U8 acmd41_1[5]={0x69,0x40,0xff,0x80,0x00}; // HCS =1; voltage range 2.7-3.6V;
U8 acmd41_0[5]={0x69,0x00,0xff,0x80,0x00}; // HCS =0; voltage range 2.7-3.6V;
typedef struct
{
U8 cmd_index;
uint32 card_status;
U8 crc;
}SD_RESPONSE_INFO;
uint16 card_addr;
uint16 card_state;
U8 CardType;
U32 card_capacity;
U32 sd_rd_buf[1024]={0};
U32 sd_write_buf[512]={0};
[cpp] view plaincopy
[cpp] view plaincopy
void main()
[cpp] view plaincopy
{
[cpp] view plaincopy
sd_mmc_initial();
while(1)
{
sys_wdtrestart();
read_block(153600, 8);
//read_block(153601, 3);           //31760
//read_block(300, 3);             //30760*512
//read_block(30, 1);           //30*512
for(j=0; j<128; j++)
{
myptf("sd_rd_buf[%d] = %ld\r\n", j, sd_rd_buf[j]);
}
write_block(153605, 1);
write_block(153606, 8);
//write_block(153609, 3);
//read_block(153604, 3);
/*for(j=0; j<384; j++)
{
myptf("sd_rd_buf[%d] = %ld\r\n", j, sd_rd_buf[j]);
}*/
//while(1);
}
[cpp] view plaincopy
}
就分析到這里,有分析不對的地方請博友們指正,愿意同大家交流。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
linux設備驅動(dòng)那點(diǎn)事兒之SD卡驅動(dòng)理論篇
SD卡規范解讀
TransFlash存儲卡在嵌入式系統調試中的應用http://www.21ic.com/app/embed/201304/179983.htm
SD卡的SPI模式的初始化
SD卡命令詳解
SD/MMC插口的規范之二:軟件命令
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久