سلام به همگی
این یه برنامه برای برقراری ارتباط با sd هست . در این برنامه توابعی برای خوندن و نوشتن در SD کارت وجود دارده. من توی خط های 69و70و76و77و123و129و132و134 مشکل دارم کسی میتونه توضیح کامل بده ؟ که اولا این خط ها یعنی چی ودر ضمن چه کاری می کنن ؟
این یه برنامه برای برقراری ارتباط با sd هست . در این برنامه توابعی برای خوندن و نوشتن در SD کارت وجود دارده. من توی خط های 69و70و76و77و123و129و132و134 مشکل دارم کسی میتونه توضیح کامل بده ؟ که اولا این خط ها یعنی چی ودر ضمن چه کاری می کنن ؟
کد:
#include <mega32.h>
#include <delay.h>
#define MMC_CS_PORT PORTB
#define MMC_CS_DDR DDRB
#define MMC_CS_PIN 4
// MMC commands (taken from sandisk MMC reference)
#define MMC_GO_IDLE_STATE 0 // initialize card to spi-type access
#define MMC_SEND_OP_COND 1 // set card operational mode
#define MMC_SEND_CSD 9 // get card"s CSD
#define MMC_SEND_CID 10 // get card's CID
#define MMC_SEND_STATE 13
#define MMC_SET_BLOCKLEN 16 //set number of byte to transferblock
#define MMC_READ_SINGLE_BLOCK 17 //read a block
#define MMC_WRITE_BLOCK 24 //write a block
#define MMC_PROGRAM_CSD 27
#define MMC_SET_WRITE_PROT 28
#define MMC_CLR_WRITE_PROT 29
#define MMC_SEND_WRITE_PORT 30
#define MMC_TAG_SECTOR_START 32
#define MMC_TAG_SECTOR_END 33
#define MMC_UNTAG_SECTOR 34
#define MMC_TAG_ERASE_GROUP_START 35 // sets beginning of erase group(mass erase)
#define MMC_TAG_ERASE_GROUP_END 36 //sets end of erase group (mass erase)
#define MMC_UNTAG_ERASE_GROUP 37
#define MMC_ERASE 38
#define MMC_CRC_ON_OFF 59
#define MMC_R1_BUSY 0X80
#define MMC_R1_PARAMETER 0X40
#define MMC_R1_ADDRESS 0X20
#define MMC_R1_ERASE_SEQ 0X10
#define MMC_R1_COM_CRC 0X08
#define MMC_R1_ILLEGAL_COM 0X04
#define MMC_R1_ERASE_RESET 0X02
#define MMC_R1_IDLE_STATE 0X01
#define MMC_STARTBLOCK_READ 0XFE
#define MMC_STARTBLOCK_WRITE 0XFE
#define MMC_STARTBLOCK_MWRITE 0XFC
#define MMC_STOPTRAN_WRITE 0XFD
#define MMC_DE_MASK 0X1F
#define MMC_DE_ERROR 0X01
#define MMC_DE_CC_ERROR 0X02
#define MMC_DE_ECC_FAIL 0X04
#define MMC_DE_OUT_OF_RANGE 0X04
#define MMC_DE_CARD_LOCKED 0X04
#define MMC_DR_MASK 0X1F
#define MMC_DR_ACCEPT 0X05
#define MMC_DR_REJECT_CRC 0X0B
#define MMC_DR_REJECT_WRITE_ERROR 0X0D
void mmclint(void);
unsigned char mmcreset(void);
unsigned char mmcsendcommand(unsigned char cmd, unsigned long int argument);
unsigned char mmcread(unsigned long int sector, unsigned char* buffer);
unsigned char mmcwrite(unsigned long int sector, unsigned char* buffer);
unsigned char mmccommand(unsigned char cmd, unsigned long int argument);
//----------------------------------
void spilnit()
{
PORT.7=1;
DDRB.7=1;
DDRB.6=0;
DDRB.5=1;
DDRB.4=1;
69) SPCR=0X52;
70) SPCR=0X00;
}
unsigned char spitransferbyte(unsigned char data)
{
unsigned char received =0;
76) SPDR = data;
77) while(!(SPSR&(1<<7)));
received = SPDR;
return (received);
}
//////////////////////////////////////
void mmclnit(void)
{
spilint();
MMC_CS_DDR.MMC_CS_PIN=1;
MMC_CS_PORT.MMC_CS_PIN=1;
}
/////////////////////////////////
unsigned char mmcreset(void){
unsigned char i;
unsigned char retry;
unsigned char r1=0;
retry=0;
do{
for(i=0;i<10;i++) spitransferbyte(0xff); // send dummy byte with CS high before accessing
r1= mmcsendcommand(MMC_GO_IDEL_STATE,0); //resetting card go to spi mode
retry++;
98) if(retry>10) return-1;
}while(r1 != 0X01);
retry=0;
do
{
r1= mmcsendcommand(MMC_SEND_OP_COND,0); // initializing card for operation
retry++;
if(retry>100)return-1;
}while(r1);
r1= mmcsendcommand(MMC_CRC_ON,0); //turn off CRC checking to simplify communication
r1=mmcsendcommand(MMC_SET_BLOCKLEN,512);
return 0;
}
//-------------------------------------------------
unsigned char mmcsendcommand(unsigned char cmd, unsigned long argument){
unsigned char r1;
MMC_CS_DDR.MMC_CS_PIN=0; //assert chip select
r1= mmccommand(cmd,argument); //issue the command
MMC_CS_PORT.MMC_CS_PIN=1;
return r1;
}
//-----------------------------------------------
123) char mmcread(unsigned long int sector,unsigned char* buffer )
{
unsigned char r1;
unsigned i;
portd.f1=0;
MMC_CS_DDR.MMC_CS_PIN=0;
129) r1= mmccommand(MMC_READ_SINGLE_BLOCK,sector<<9);
if (r1!=0X00)
return r1;
132) while(spitransferbyte(0xff)!=MMC_STARTBLOCK_READ);
for (i=0;i<0X200;i++)
134) *buffer++ = spitransferbyte(0xff);
spitransferbyte(0xff);
spitransferbyte(0xff);
MMC_CS_PORT.MMC_CS_PIN=1;
return 0;
}
///-------------------------------------------------------
unsigned char mmcwrite(unsigned long int sector,unsigned char* buffer ){
unsigned char r1;
unsigned int i;
MMC_CS_PORT.MMC_CS_PIN=1;
//issue command
r1=mmccommand(MMC_WRITE_BLOCK,sector<<9);
if(r1 != 0X00)
return r1;
spitransferbyte(0xff) // send dummy
spitransferbyte(MMC_STARTBLOCK_WRITE); //send data start token
for (i=0; i<512; i++)
156) spitransferbyte(*buffer++);
spitransferbyte(0xff);
spitransferbyte(0xff);
r1=spitransferbyte(0xff); // write 16-bit crc (dummy values)
// read data response token
if((r1&MMC_DR_MASK)!= MMC_DR_ACCEPT)
return r1;
164) while(!spitransferbyte(0xff));
MMC_CS_PORT.MMC_CS_PIN=1; //CS
return 0; // return succes
}
unsigned char mmccommand(unsigned char cmd,unsigned long int argument){
char r1;
char retry=0;
//send command
spi_write(cmd |0x40);
spi_write(argument>>24);
spi_write(argument>>16);
spi_write(argument>>8);
spi_write(argument);
spi_write(0x95); //crc valid only for mmc_go_idle_state
175) while((r1 = spitransferbyte(0xff))==0xff)
176) if(retry++ > 8) break;
177) return r1;
}
///-------------------------------------------------
char write_buf[512], read_buf[512];
void main(void) {
unsigned int i;
unsigned long int sector;
mmclnit();
mmcreset();
for (i=0;i<512;i++)
write_buf[i]=i;
sector=5;
mmcwrite(sector,write_buf); // write to sector 5
delay_ms(1);
mmcread(sector,read_buf); // read of sector 5
while(1)
}




دیدگاه