Код
// 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
// ----------------- -----------------
// | | | |
// | | | |
// | 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);
}
#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 должна загорется лампочка на плате
Так как опыта с МК нет, думаю что тут какая то принципиальная ошибка...
Собственно, наверное, кто то уже делал что либо подобное ....
Скажите в каком направлении двигаться и искать ошибку...............