Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: F2013 +SPI +SD
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
KAPTEP
Добрый день... приобрел комплект EZ430-F2013 решил подключить SD карту к выводам на плате , сделал это таким образом

Код
//            MSP430F2013                  SD Card
//         -----------------          -----------------
//        |                          |        |                 |
//        |                          |        |                 |
//        |                    Vcc |-- ---|Pin4/Vcc        
//        |                          |        |                 |
//        |                          |        |                 |
//        |                  P1.2 |<----|Pin6/CD/Vss2    
//        |                  P1.1 |---->|Pin1/CS          
//        |                          |        |                
//        |        P1.7/SDI     |---->|Pin7/DO        
//        |       P1.6/SDO    |<----|Pin2/DI        
//        |      P1.5/SCLK    |---->|Pin5/CLK        
//        |                           |        |                
//        |                     Vss|------|Pin3/GND/Vss1


Сразу же вопрос можно ли так напрямую подключать?

Далее, пользуясь исходником на сайте TI выписал часть программы

Код
#include "msp430.h"

#define halSPITXDONE  (1)
#define DUMMY_CHAR 0xFF
#define CS_LOW()    P1OUT &= ~0x02;                // Card Select
#define CS_HIGH()   while(!halSPITXDONE); P1OUT |= 0x02;  // Card Deselect

char mmcInit(void);        
void halSPISetup (void);
unsigned char spiSendByte(const unsigned char data);
char mmcGoIdle();
void mmcSendCmd (const char cmd, unsigned long data, const char crc);
char mmcGetResponse(void);
unsigned char spiSendFrame(unsigned char* pBuffer, unsigned int size);

unsigned int timeout = 0;
unsigned char status = 0;
unsigned int sic;

void main(void)
{
  
  
    WDTCTL = WDTPW + WDTHOLD;                 // Остановка сторожевого таймера
  
   for(sic=0; sic<150; sic++)
      status = mmcInit();
    
  
    
   if(status==0x01) {P1DIR |= 0x01;P1OUT |= 0x01;} //Тут как я понимаю, если все правильно должна загореться лампочка
  
}    
  
    

char mmcInit(void)
{

  int i;


  P1OUT |= 0x60;  //  SDO и SLTK
  P1DIR |= 0x60;
                  // CS
  P1OUT |= 0x02;
  P1DIR |= 0x02;
                  
                   // Card Detect
  P1DIR  &=  ~0x04;

  // Init SPI Module
  halSPISetup();
  
  // Enable secondary function
  P1SEL |= 0xE0;

    
  //initialization sequence on PowerUp
  CS_HIGH();
  for(i=0;i<=9;i++)
    spiSendByte(DUMMY_CHAR);

  return (mmcGoIdle());
}

void halSPISetup(void)
{
  USICTL0 = USIPE7+USIPE6+USIPE5+USIMST+USIOE; // Port, SPI master
  USICKCTL = USISSEL_2 + USICKPL;           // SCLK = SMCLK
  USICTL0 &= ~USISWRST;                     // USI released for operation

  USISRL = 0x00;                            // Ensure SDO low instead of high,
  USICNT = 1;  
}

unsigned char spiSendByte(const unsigned char data)
{
  while ((USIIFG & USICTL1)==0);    // wait while not ready for TX
  USISRL = data; USICNT = 8;           // write
  return (USISRL);
}

char mmcGoIdle()
{
    CS_LOW();

  //Send Command 0 to put MMC in SPI mode
  mmcSendCmd(0x40,0,0x95);
  //Now wait for READY RESPONSE
  if(mmcGetResponse()==0x01)
    return(1);
    else return(0);
  
}

void mmcSendCmd (const char cmd, unsigned long data, const char crc)
{
  unsigned char frame[6];
  char temp;
  int i;
  frame[0]=(cmd|0x40);
  for(i=3;i>=0;i--){
    temp=(char)(data>>(8*i));
    frame[4-i]=(temp);
  }
  frame[5]=(crc);
  spiSendFrame(frame,6);
}

char mmcGetResponse(void)
{
  //Response comes 1-8bytes after command
  //the first bit will be a 0
  //followed by an error code
  //data will be 0xff until response
  int i=0;

  char response;

  while(i<=64)
  {
    response=spiSendByte(DUMMY_CHAR);
    if(response==0x00)break;
    if(response==0x01)break;
    i++;
  }
  return response;
}

unsigned char spiSendFrame(unsigned char* pBuffer, unsigned int size)
{

  unsigned long i = 0;
  // clock the actual data transfer and receive the bytes; spi_read automatically finds the Data Block
  for (i = 0; i < size; i++){
    while ((USIIFG & USICTL1) ==0);   // wait while not ready for TX
   USISRL = pBuffer[i]; USICNT = 8;      // write
   pBuffer[i] =USISRL;
  }

  return(0);
}



как я понимаю на этом этапе после получения response==0x01 должна загорется лампочка на плате

Так как опыта с МК нет, думаю что тут какая то принципиальная ошибка...

Собственно, наверное, кто то уже делал что либо подобное ....

Скажите в каком направлении двигаться и искать ошибку...............
Shread
Я, извиняюсь, а собсна зачем это вам? FAT всеравно не удастся реализовать на 2013, банально RAM не хватит...
KAPTEP
Цитата(Shread @ Sep 22 2010, 11:27) *
Я, извиняюсь, а собсна зачем это вам? FAT всеравно не удастся реализовать на 2013, банально RAM не хватит...


Просто есть пока эта плата, и хотелось бы пока попрактиковаться с SD протоколом

Да, собственно приходит ответ , но response==0xFF, где то наверное порядок напутал

Собственно о чем это может говорить ответ 0xFF
1) что то не так подключил?? \вроде все проверил, еще включил pullup на CS , а может это SD вые...я?
2) может нарушил порядок инициализации??


Брал с исходника ТИ , так что вряд ли это программный глюк....
Shread
Первое что нужно проверить, это качество подключения и не забывать про то, что SD карты бывают разные. Многие жрут десятки ma, и этот ток стабилизатор в вашем ките может и не выдать... в нижнем уровне общаться с SD проблем никаких нет, стандартный пример от TI работает отлично.
KAPTEP
т.е надо запитать SD карту не от кита, а от какого нибудь дополнительного источника со стабилизатором,верно? попробую седня
Shread
Лучше и карту и проц от внешнего источника запитать, чтоб потом не пришлось уровни согласовывать. У меня в сааамом первом портотипе портативного прибора по какой-то причине часть карт не работала, а другая часть работала отлично(работали 16мегабайтные SD от Canon, Transcend, Kingston, в то же время MMC н 16мегабайт работать отказывлись, с картами Apacer та же засада). Спустя примерно неделю выяснилось что при работе с теми картами, которые не хотели дружить с девайсом по питанию имели место едва заметные на аналоговом осциллографе просадки - иголки(не тянул импульсник повышающий). Процессору напряжения питания хватало, а карте - нет.
KAPTEP
Теперь после отправки команды CMD0(0x40) получаю 0x00......хм
KAPTEP
В общем дело оказалось в инициализации портов.

В примере от Ti.com указано

MMC_CD_PxDIR &= ~MMC_CD;

Заменил на

MMC_CD_PxOUT |= MMC_CD;
MMC_CD_PxDIR |= MMC_CD;

В моем случае

P1DIR |= 0x03; // Card Detect
P1DIR |= 0x03;

ответ response==0x01 я получил.
Иду дальше....
Shread
А может быть всётаки попробовать сделать всё сразу как у TI по схеме и по софту? Просто CD как бы всегда был входом проца, а не выходом и должен иметь внешнюю подтяжку(или можно включить внутреннюю в процессоре).
Если у вас запуск этого примера занял почти месяц, то что будет дальше, если потребуется еще и FAT прикрутить...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.