اطلاعیه

Collapse
No announcement yet.

ارتباط mmc با avr ؟

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    ارتباط mmc با avr ؟

    سلام دوستان
    آیا کسی هست که با AVR روی mmc هم read هم write کرده باشه؟(محیط codevision) و پیاده سازی کرده باشه،تست کرده باشه؟برنامشو در اختیار من هم بذاره؟؟؟
    از اینترنت چندتا برنامه دانلود کردم ولی error زیاد داشت.
    سخت افزار اتصال به میکرو رو هم اگر دارید،سپاسگزار میشم.
    از حسن توجهتون ممنونم.

    #2
    پاسخ : ارتباط mmc با avr ؟

    سلام دوست عزیز..... خیلی از بچه ها توسایت با mmc کارکردن...mmc رو سرچ کن حتما چیز های خوبی پیدا میکنی....همش هم عملی جواب داده....بازم اگه مشکلی داشتی من در خدمتم....

    دیدگاه


      #3
      پاسخ : ارتباط mmc با avr ؟

      سلام دوست من
      آقای قاسم پور درست میگن من با یه کتابخونه آماده از همین سایت این کار رو کردم
      بگرد حتمن پیدا میکنی
      اگه سوال هم داشتی بگو تا همه کمکت کنیم
      http://imenbazar.com

      دیدگاه


        #4
        پاسخ : ارتباط mmc با avr ؟

        [سلام دوستان
        آیا کسی هست که با avr روی mmc هم read هم write کرده باشه ،و برنامه رو امتحان کرده باشه(codevision)؟برنامه از اینترنت دانلود کردم ولی جواب نداد.حتی همان اول که فرمان reset(cmd0) را میفرستم پاسخ0x01 را نمیدهد و همیشه پاسخ0x00 است.در ضمن من از atmega16 استفاده کردم. برنامه و سخت افزارش را اینجا گذاشتم .اگر ایراد کارم را به من بگویید خیلی ممنون میشم.

        /************************************************** *****************

        Project : Ram Reader for MMC

        Chip type : ATmega16

        Clock frequency : 250khz
        _________________
        / 1 2 3 4 5 6 78 | <- view of MMC/SD card looking at contacts
        / 9 | Pins 8 and 9 are present only on SD cards
        | MMC/SD Card |
        | |
        /\/\/\/\/\/\/\/\/\/\
        1 - CS (chip select) - wire to any available I/O pin(*)
        2 - DIN (data in, card<-host) - wire to SPI MOSI pin
        3 - VSS (ground) - wire to ground
        4 - VDD (power, 3.3V only?) - wire to power (MIGHT BE 3.3V ONLY!)
        5 - SCLK (data clock) - wire to SPI SCK pin
        6 - VSS (ground) - wire to ground
        7 - DOUT (data out, card->host) - wire to SPI MISO pin
        'ATmega16 HW SPI Portb4=SS to MMC 1, Portb7=clock to MMC 5, MISO=Portb6 to MMC 7, MOSI=Portb5 to MMC 2
        ****************************** Include Files ************************************/
        #include <mega16.h>
        #include <delay.h>
        #include <stdio.h> // Standard Input/Output functions

        //************************* Port & Pin definitions ******************************
        #define MMC_PORT PORTB
        #define MMC_DDR DDRB
        #define SPI_MISO_PIN 6 //DataOut of MMC
        #define SPI_MOSI_PIN 5 //DataIn of MMC
        #define SPI_CLK_PIN 7 //Clock of MMC
        #define MMC_CS_PIN 4 //ChipSelect of MMC

        //********************* MMC Commands(taken from SanDisk MMC refrence)***********
        #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_SET_BLOCKLEN 16 //Set number of bytes to transfer per block
        #define MMC_READ_SINGLE_BLOCK 17 //Read a Block
        #define MMC_WRITE_BLOCK 24 //Write a Block
        #define MMC_CRC_OFF 59 // CRC checking on/off (normally automatically off in SPI)

        #define MMC_STARTBYTE_RDRW 0XFE // startbyte, block starts with 0xFE (both write and read block)
        /*when recieved from card, indicates that a block of data will follow*/

        #define MMC_BLOCK_SIZE 512

        //*********************** Data RESPONSE Token values ***************************
        #define MMC_DR_MASK 0X1F
        #define MMC_DR_ACCEPT 0X05

        //*********************** Result Codes ****************************************
        #define MMC_OK 0 //MMC initialized successfully
        #define MMC_INIT 1 //Error while trying to reset MMC
        #define MMC_NO_STARTBYTE 2 //No Start Byte recieved
        #define MMC_CMDERROR 3 //Error while sending command to MMC
        #define MMC_TIMEOUT 4 //Error Timeout
        #define MMC_ERROR_RESPONSE 5 //Error Response



        //////////////////////////////// Functions ////////////////////////////////////
        char check;
        //*************************** Initialization SPI ******************************
        void spi_init()
        {
        //PORTA.1=0;
        MMC_PORT.SPI_CLK_PIN=1; //set SCK hi
        MMC_DDR.SPI_MISO_PIN=0; //set MMC Data Out as Output //DDRB.6=0
        MMC_DDR.SPI_CLK_PIN=1; //set MMC Clk as Input //DDRB.7=1
        MMC_DDR.SPI_MOSI_PIN=1; //set MMC Data In as Input //DDRB.5=1
        MMC_DDR.MMC_CS_PIN=1; //SS must be output for Master mode to work //DDRB.4=1
        SPCR=0x52; //SPI Enable, SPI Master Mode //SPI Clock Rate:250khz
        SPSR=0x00; //setting clock of initialisation
        // delay_ms(5);
        //PORTA.1=1;
        // SPCR
        // SPIE SPE DORD MSTR CPOL CPHA SPR1 SPR0
        // 0 1 0 1 0 0 1 0
        // ! ! ! ! ! ! !....!..Clock rate select (f(osc)/64)
        // ! ! ! ! ! !............Clock phase (sample on rising edge)
        // ! ! ! ! !.................Clock polarity (SCK low on IDLE)
        // ! ! ! !......................Master/Slave select (Master)
        // ! ! !...........................Data order (MSB first)
        // ! !................................SPI enable (enabled)
        // !....................................SPI interrupt enable (Not enabled)

        // SPSR
        // SPIF WCOL SP2X
        // ! ! !.. spi double rate
        // ! !................................ Write collision (NOT enabled)
        // !..................................... SPI interrupt enable (NOT enabled)
        }

        //***************************** wait for byte Transmitted **********************
        void loop_until_bit_is_set(void)
        {
        SPSR &=0X80;
        do{
        }while(SPSR==0); //wait for byte Transmitted
        }

        //************************* Send Byte ******************************************
        unsigned char mmc_send_byte(unsigned char data)
        {
        unsigned char received=0;
        // PORTA.1=0;
        SPDR=data;
        loop_until_bit_is_set( );
        received=SPDR;
        //delay_ms(5);
        //PORTA.1=1;
        return(received);
        }

        //*************************** Initialization MMC ******************************
        void mmc_init(void)
        { //PORTA.2=0;
        // initialize SPI interface
        spi_init();
        MMC_DDR.MMC_CS_PIN=1; //release chip select
        delay_ms(1);
        MMC_PORT.MMC_CS_PIN=1; //MMC Chip Select ->High(deactivate) //PORTB.4=1
        //delay_ms(5);
        // PORTA.2=1;
        }

        //*************************** Set Command *************************************
        unsigned char mmc_Command(unsigned char cmd,unsigned long int argument)
        {
        unsigned char r1,retry=0;
        //PORTA.1=0;
        //send command

        mmc_send_byte(cmd|0x40);
        mmc_send_byte(argument>>24);
        mmc_send_byte(argument>>16);
        mmc_send_byte(argument>>8);
        mmc_send_byte(argument);
        mmc_send_byte(0x95); // CRC = always 0xFF OR 0x95 for MMC_GO_IDLE_STATE command
        //end command

        //wait for response
        //return the recevied 0xFF
        while((r1=mmc_send_byte(0xff))==0xff)
        if(retry++>8) break; //if more than 8 retries, card has timed out

        //delay_ms(5);
        //PORTA.1=1;
        return r1; //return response
        }

        //***************************** Send card an MMC command ***********************
        unsigned char mmc_send_command(unsigned char cmd,unsigned long int argument)
        {
        unsigned char r1;
        //PORTA.2=0;
        // mmc_send_byte(0xff);//Dummy delay 8 clocks
        MMC_PORT.MMC_CS_PIN=0; //assert chip select
        r1=mmc_Command(cmd,argument); //issue the command
        MMC_PORT.MMC_CS_PIN=1; //release chip select
        // delay_ms(5);
        //PORTA.2=1;
        return r1;
        }

        //******************************* Software Reset MMC *********************************
        unsigned char mmc_Reset(void)
        {
        unsigned char i;
        unsigned char r1=0,retry=0;
        PORTA.2=0;
        do{
        PORTA.1=0;
        // send 74+ (=80) dummy bits with CS high before accessing
        for(i=0;i<10;i++)
        mmc_send_byte(0xff);
        // delay_ms(50);
        // PORTA.1=1;
        r1=mmc_send_command(MMC_GO_IDLE_STATE,0); //Software resetting card, go to SPI mode
        retry++;
        delay_ms(50);
        PORTA.1=1;
        delay_ms(50);
        if(retry>10) // max 10 retries
        return -1;
        // delay_ms(50);
        //PORTA.1=1;
        }while(r1!=0x01); //store result of reset command, should be 0x01
        delay_ms(5);
        PORTA.2=1;
        // TODO: check card parameters for voltage compliance
        // before issuing initialize command
        retry=0;
        do{
        r1=mmc_send_command(MMC_SEND_OP_COND,0); //initializing card for operation
        retry++;
        if(retry>100) // max 100 retries
        return -1;
        }while(r1);
        r1=mmc_send_command(MMC_CRC_OFF,0); //turn off CRC checking to simplify communication
        r1=mmc_send_command(MMC_SET_BLOCKLEN,MMC_BLOCK_SIZ E); // set block length to 512 bytes (not actually needed 512 bytes is default)
        return 0;
        }




        //******************* Read 512-byte sector from card to buffer*******************
        unsigned char mmc_Read(unsigned long int sector,unsigned char* buffer)
        {
        unsigned char r1;
        unsigned int i;
        MMC_PORT.MMC_CS_PIN=0;
        r1=mmc_Command(MMC_READ_SINGLE_BLOCK,sector<&lt ;9);
        if(r1!=0x00) //check for valid response
        return r1;
        while(mmc_send_byte(0xff)!=MMC_STARTBYTE_RDRW); //wait for block start
        //read in data
        for(i=0;i<512;i++)
        *buffer++=mmc_send_byte(0xff);
        //read 16_bit CRC
        mmc_send_byte(0xff);
        mmc_send_byte(0xff);
        MMC_PORT.MMC_CS_PIN=1;
        return 0;
        }

        //********************* write 512 bytes to MMC from buffer ************************
        unsigned char mmc_Write(unsigned long int sector,unsigned char* buffer)
        {
        unsigned char r1;
        unsigned int i;
        MMC_PORT.MMC_CS_PIN=0;
        r1=mmc_Command(MMC_WRITE_BLOCK,sector<<9); //issue the command
        if(r1!=0x00) //check for valid response
        return r1;
        mmc_send_byte(0xff); //send dummy
        mmc_send_byte(MMC_STARTBYTE_RDRW); //send data start token
        //write data
        for(i=0;i<512;i++)
        mmc_send_byte(*buffer++);
        //write 16_bit CRC(dummy values)
        mmc_send_byte(0xff);
        mmc_send_byte(0xff);
        r1= mmc_send_byte(0xff);
        if((r1 & MMC_DR_MASK)!=MMC_DR_ACCEPT) //read data response token
        return r1;
        while(! mmc_send_byte(0xff)); // wait until card not busy
        MMC_PORT.MMC_CS_PIN=1; //release chip select
        return 0; //return successful
        }

        ///////////////////////////////////////////////////////
        //SD_readcid - Read CID of MMC Card
        // input - pointer for read data (16 bytes)
        // returns - 0 = okay, other = error
        ///////////////////////////////////////////////////////
        unsigned char mmc_read_cid(char *buffer)
        {
        unsigned char result=0xff;
        unsigned int i=0;
        //PORTA.1=0;
        //PORTA.2=1;
        if (mmc_send_command(MMC_SEND_CID,0)!= 0x00) {
        MMC_PORT.MMC_CS_PIN=1; //MMC Chip Select ->High(deactivate)
        return(1); //wrong response!
        }
        // wait for startbyte (0xFE)
        do {
        mmc_send_byte(0xFF);
        result=SPDR;
        i++;
        } while((result != MMC_STARTBYTE_RDRW ) && (i < 255));

        if(i == 255) { //startbyte received ?
        MMC_PORT.MMC_CS_PIN=1; //MMC Chip Select ->High(deactivate)
        return(MMC_NO_STARTBYTE);
        }
        for (i=0;i<16;i++)
        {

        *buffer++= mmc_send_byte(0xFF); // get byte

        }
        check=*buffer;
        //read 2 bytes CRC (not used);
        mmc_send_byte(0xFF);
        mmc_send_byte(0xFF);
        MMC_PORT.MMC_CS_PIN=1; //MMC Chip Select ->High(deactivate)
        //delay_ms(1);
        // PORTA.1=1;
        // PORTA.2=0;
        return(0);
        }

        //********************************* Main **************************************
        unsigned char r_cid=1;
        void main()
        {
        unsigned int i;
        unsigned long int sector;
        char* buffer;
        unsigned char response_W,response_R;
        DDRA=0XFF;
        mmc_init();
        mmc_Reset();
        while(1);
        }

        دیدگاه

        لطفا صبر کنید...
        X