"Mark Stokes" <m.sto...@ieee.org> wrote:

>> Does anybody have an experience in coupling MultiMediaCard (MMC) and
>> msp430 via SPI ?
>
> Not yet, but I will in the next few weeks.  For the mean time, check
> out sandisk's web page.  You can freely download a full copy of their
> mmc spec which talks all about how to do it.
> Let me know if you get it working before me.
> -Mark

I have a piece of code that puts the card in SPI mode and reads the CSD.
It isn't commented very well, but it works. See attachment.

 Andreas

-- 
AVR-Tutorial, Forum, über 300 Links: http://www.mikrocontroller.net
/*
 * CVS: $Id: mmc.h,v 1.2 2003/03/06 16:11:46 andreas Exp $
 *
 *
 */

#define MMC_GO_IDLE_STATE 0
#define MMC_SEND_OP_COND 1
#define MMC_SEND_CSD 9
#define MMC_SEND_CID 10
#define MMC_STOP_TRANSMISSION 12
#define MMC_SEND_STATUS 13
#define MMC_SET_BLOCKLEN 16
#define MMC_READ_SINGLE_BLOCK 17
#define MMC_READ_MULTIPLE_BLOCK 18
#define MMC_WRITE BLOCK 24
#define MMC_WRITE_MULTIPLE_BLOCK 25
#define MMC_PROGRAM_CSD 27
#define MMC_SET_WRITE_PROT 28
#define MMC_CLR_WRITE_PROT 29
#define MMC_SEND_WRITE_PROT 30
#define MMC_TAG_SECTOR_START 32
#define MMC_TAG_SECTOR_END 33
#define MMC_UNTAG_SECTOR 34
#define MMC_TAG_EREASE_GROUP_START 35
#define MMC_TAG_EREASE_GROUP_END 36
#define MMC_UNTAG_EREASE_GROUP 37
#define MMC_EREASE 38
#define MMC_READ_OCR 58
#define MMC_CRC_ON_OFF 59
/*
 * CVS: $Id: main.c,v 1.3 2003/03/06 17:18:55 andreas Exp $
 *
 */

#include <io.h>
#include <msp430/usart.h>
#include <stdio.h>
#include <stdlib.h>
#include "mmc.h"

#define EN_LOW() P3OUT &= ~0x01
#define EN_HIGH() P3OUT |= 0x01
#define SPI_RXC (IFG2 & URXIFG0)
#define SPI_TXC (IFG2 & UTXIFG0)

#define DUMMY 0xFF

char buf[16]="Test";
unsigned char cmd0buf[6] = {0x40,0x00,0x00,0x00,0x00,0x95};

unsigned int sendcmd(int command);

int main(void)
{
  
  unsigned int i;
  
  WDTCTL = WDTPW|WDTHOLD;             // Stop WDT
  ME2 |= USPIE0;                        // Enable USART0 SPI mode
  UTCTL0 = CKPL|SSEL1|SSEL0|STC;        // SMCLK, 3-pin mode
  UCTL0 = CHAR+SYNC+MM;                 // 8-bit SPI Master **SWRST**
  UBR00 = 0x02;                         // UCLK/2 
  UBR10 = 0x00;                         // 0
  UMCTL0 = 0x00;                        // no modulation
  P3SEL |= 0x0E;                        // P3.1-3 SPI option select
  P3DIR |= 0x01;                        // P3.0 output direction
  P3OUT = 0x00;

  EN_HIGH();
  
  for(i = 0; i < 10; i++) {                   //80 cycles
    TXBUF0=DUMMY;
    while ((IFG2 & UTXIFG0) == 0);
  }
  
  EN_LOW();

  while(sendcmd(0)!=1);  // wait until cmd0 returns 1
  
  while(sendcmd(1)!=0);  //wait until ready

  // Read CSD
  sendcmd(MMC_SEND_CSD);
  
  {
  TXBUF0=DUMMY;      //8 clock cycles
  while(!SPI_TXC); 
  } while(RXBUF0!=0xFE);
  
  for(i=0;i<16;i++) {
    TXBUF0=DUMMY;    //send dummy byte to read response
    while(!SPI_TXC);
    while(!SPI_RXC);
    buf[i]=RXBUF0;
  }
  
  
  
  for(;;);           //infinite loop
}

//send command and return response
unsigned int sendcmd(int command)
{
  int count;
  unsigned int response;
  
  TXBUF0 = 0x40+command;
  while (!SPI_TXC);
  
  for(count=0;count<4;count++) {
    TXBUF0 = 0x00;
    while (!SPI_TXC);
  }
  
  if(command == 0) {
    TXBUF = 0x95;      // CRC for cmd0
  } else {
    TXBUF0 = 0xFF;     // CRC not used, send 0xFF
  }
  while (!SPI_TXC);
  
  TXBUF0=DUMMY;      //8 clock cycles
  while (!SPI_TXC);
  while (!SPI_RXC);
  
  response = RXBUF0;
  

  TXBUF0=DUMMY;      //send dummy byte to read response
  while (!SPI_TXC);
  while(!SPI_RXC);

  response=RXBUF0;


  //untested but should work
  if(command==MMC_SEND_STATUS) {
    TXBUF0=DUMMY;      //send dummy byte to read response
    while (!SPI_TXC);
    while(!SPI_RXC);
    response|=(RXBUF0<<8)&0xFF00;
  }

  TXBUF0=DUMMY;      //8 clock cycles
  while(!SPI_TXC);
  
  return response;
  
}

Attachment: makefile
Description: Binary data

Reply via email to