реклама на сайте
подробности

 
 
> F2013 +SPI +SD
KAPTEP
сообщение Sep 16 2010, 10:33
Сообщение #1





Группа: Участник
Сообщений: 10
Регистрация: 25-02-10
Пользователь №: 55 657



Добрый день... приобрел комплект 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 должна загорется лампочка на плате

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

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

Скажите в каком направлении двигаться и искать ошибку...............
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th July 2025 - 21:16
Рейтинг@Mail.ru


Страница сгенерированна за 0.01378 секунд с 7
ELECTRONIX ©2004-2016