430读写SD卡

楼主
430读写SD卡
用了Ti读写SD 卡例子,但是URCTL总是为0X20,而且sd发出都是高电平,没有其他响应,不知什么原因,谢谢大家了

 看DC版主曾经发表过过一个读写SD卡的程序,不知有没有做过,
        发出复位SD卡命令后,收到总为高电平,响应不正确,解决不了啊
1楼
void initSPI (void)
{
  UCTL0 = SWRST;                            // 8-bit SPI Master **SWRST**
  UTCTL0 = CKPH | SSEL1 | SSEL0 | STC;      // SMCLK, 3-pin mode, clock idle low, data valid on rising edge, UCLK delayed
  UBR00 = 0x20;                             // 0x02: UCLK/2 (4 MHz), works also with 3 and 4
  UBR10 = 0x00;                             // -"-
  UMCTL0 = 0x00;                            // no modulation
  UCTL0 = CHAR | SYNC | MM | SWRST;         // 8-bit SPI Master **SWRST**
  UCTL0 &= ~SWRST;                          // clear SWRST
  ME1 |= USPIE0;                            // Enable USART1 SPI mode
  while (!(IFG1 & UTXIFG0));                // USART1 TX buffer ready (empty)?
}


// Initialize MMC card
char initMMC (void)
{

  //raise SS and MOSI for 80 clock cycles
  //SendByte(0xff) 10 times with SS high
  //RAISE SS
  int i;

  // Port 3 Function           Dir       On/Off
  //         3.0-mmcCD         Out       0 - card inserted
  //         3.1-Dout          Out       0 - off    1 - On -> init in SPI_Init
  //         3.2-Din           Inp       0 - off    1 - On -> init in SPI_Init
  //         3.3-Clk           Out       -                 -> init in SPI_Init
  //         2.6-mmcCS         Out       0 - Active 1 - none Active
 
  P2DIR |= BIT6;
  P3SEL |= 0x0E;
  P3SEL &= ~0x11;
  P3OUT |= 0x10;
  P3DIR |= 0x0A;

  initSPI();
  //initialization sequence on PowerUp
  CS_LOW();
  for(i=0;i<10;i++)
    spiSendByte(0xff);
  CS_HIGH();
  for(i=0;i<=9;i++)
    spiSendByte(0xff);

  return (mmc_GoIdle());
}


char mmc_GoIdle(void)
{
  char response=0x01;
  CS_LOW();

  //Send Command 0 to put MMC in SPI mode
  mmcSendCmd(MMC_GO_IDLE_STATE,0,0x95);
  //Now wait for READY RESPONSE
  if(mmcGetResponse()!=0x00)//应该是收到响应R1,也就是0,可是我总是收到是高电平,也不知是不是太快了,没收到,示波器看了,没有低电平的产生
    return MMC_INIT_ERROR;

  while(response==0x00)
  {
    CS_HIGH();
    spiSendByte(0xff);
    CS_LOW();
    mmcSendCmd(MMC_SEND_OP_COND,0x00,0xff);
    response=mmcGetResponse();
  }
  CS_HIGH();
  spiSendByte(0xff);
  return (MMC_SUCCESS);
}

// mmc Get Responce
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(0xff);
    if(response==0x00)break;
    if(response==0x01)break;
    i++;
  }
  return response;
}
2楼
这位兄弟,真不好意思。上次发表过的是转载国外的一位工程师的程序。SD卡操作我也没做过。
3楼
谢谢版主
我用示波器看了,结果并不是没有响应,有响应R1,只是在执行这个函数mmcGetResponse()之前,响应已经给过了。也就是说,在命令和响应有个时间间隔N(CR),这个间隔很短,以至于还没等到我执行接受响应语句,响应就已经发完了,真FT。
可是我还是不明白,我的MCLK为8M,而我的SPI的CLOCK仅为250K,按SD卡的技术文档命令和响应时间间隔N(CR)为0~8个时钟个数,单位为8个Clock周期。我认为单位为8个SPI的Clock周期,也就是0~64个SPI的Clock周期。这样算来,执行语句的速度怎么也应该能收到响应吧!
困惑中,DC版主提供点高见
har mmc_GoIdle(void)
{
  char response=0x01;
  CS_LOW();

  //Send Command 0 to put MMC in SPI mode
  mmcSendCmd(MMC_GO_IDLE_STATE,0,0x95);
  //Now wait for READY RESPONSE
  if(mmcGetResponse()!=0x00)
    return MMC_INIT_ERROR;
4楼
  //         3.0-mmcCD         Out       0 - card inserted
  //         3.1-Dout          Out       0 - off    1 - On -> init in SPI_Init
  //         3.2-Din           Inp       0 - off    1 - On -> init in SPI_Init
  //         3.3-Clk           Out       -                 -> init in SPI_Init
  //         2.6-mmcCS         Out       0 - Active 1 - none Active
上面是你的MCU IO配置吗?
P3.1 MOSI(SIMO) :主出从入
P3.2 MISO(SOMI) :主入从出

你现在的接法有错误!
    你把SD/MMC 卡做为SPI主机了。实际上MPS430才是主机。
这样一来你不是把430的SPI OUT,与SD/MMC卡的OUT 相连了。
你把SPI与SD/MMC卡的DIN,DOUT交换一下口,最好是串一个100~330的电阻保护。
试试看!

仔细看看下图的SD卡接口
MCU SIMO ----->DI
MCU SOMI ----->DO

[imga]../../upload/2006/05/01/152955.gif[/imga]
5楼
首先谢谢debug,感谢您能花时间回答我的问题

您看的太仔细了。这是ti提供的接法,确实按它的接法是没法收到响应的。我疏忽了,在帖上去之前没有更改过来。现在问题就是在430执行接受响应的语句之前,响应已经发生。我想应该是spi接受有问题。这个问题在软件或者是在硬件上如何解决?

我用示波器看SD卡的输出,其输出一直为高(111……),在执行完mmcSendCmd(MMC_GO_IDLE_STATE,0,0x95);后产生数据为(……11)0 1000 0000(11……)但是我读RXBUF0里的值为0xFF,而0x01这个我想要的值没有收到!

我想在软件上解决的方法就是读控制SD卡的CLOCK,在430没有执行接受响应的语句之前,430不提供时钟信号,这样SD卡应该不会提供响应(个人想法)。但是430的spi模块似乎是只要MOSI和 MISO有数据传输就提供CLOCK!所以我困在这里。
另外,就是为什么在CSPY中执行一个函数,GO比单步运行的时间快很多,是不是执行GO频率和单步频率不一样?

电脑版 Page created in 2.1406 seconds width 3 queries.