FlyG_T 发表于 2012-4-15 23:30:37

K60 用spi写MicroSD卡,FAT32的文件系统

简洁的spi收发指令该如何写?下面是我写的,求火哥,老高等高手修改(PS:receiveByte的函数我弄不明白怎么写,感觉SD卡没有响应,真心求解释啊。。
void SPI_SendByte(u8 transmit_data){
    u8 temp;
    temp = transmit_data;
    SPI_SR_REG(SPI0_BASE_PTR) = (SPI_SR_EOQF_MASK         //clear the bit end of queue
                               | SPI_SR_TFUF_MASK         //clear the bit overflow
                               | SPI_SR_TFFF_MASK         //clear the bit fill
                               | SPI_SR_RFOF_MASK         //clear the bit overflow
                               | SPI_SR_RFDF_MASK);       //clear the bit drain
   
    SPI_MCR_REG(SPI0_BASE_PTR) |= SPI_MCR_CLR_TXF_MASK    //clear the TX FIFO
                               |SPI_MCR_CLR_RXF_MASK;   //clear the RX FIFO
   
   
    SPI_PUSHR_REG(SPI0_BASE_PTR) = 0
                                 | SPI_PUSHR_CTAS(0)      //CTAR0
                                 | SPI_PUSHR_EOQ_MASK   //last data
                                 | SPI_PUSHR_TXDATA(temp);//transfer
   
   
   
    while((SPI_SR_REG(SPI0_BASE_PTR) & SPI_SR_TCF_MASK)==0);
    SPI_SR_REG(SPI0_BASE_PTR)=1<<31;
}

hcx31 发表于 2012-5-5 16:23:48

你好,我现在也在研究k60的SD卡开发,用的也是SPI,但是我的SD卡初始化一直不能进入idle模式,下面是我的SPI初始化部分程序,能不能帮我看下有什么问题,或者给我提供一些建议,不胜感激。void spi_init(uint8_t spino, uint8_t master)
{   
    SPI_MemMapPtr base_addr = spi_get_base_address(spino);
   
    /* 使能SPI模块时钟,配置SPI引脚功能 */
    if(SPI_MOD_SET(spino) == SPI0)
    {
      SIM_SCGC6 |= SIM_SCGC6_DSPI0_MASK;
      
      /* PORT_PCR_MUX(0x2) : SPI功能
         * PORT_PCR_DSE_MASK : Drive Strength Enable */
      gpio_init(0, 13, OUT_PUT, 1);                            /* PCS0 */
      PORTA_PCR15 = 0 | PORT_PCR_MUX(0x2) | PORT_PCR_DSE_MASK; /* SCK */
      PORTA_PCR16 = 0 | PORT_PCR_MUX(0x2) | PORT_PCR_DSE_MASK; /* SOUT */
      PORTA_PCR17 = 0 | PORT_PCR_MUX(0x2);                     /* SIN */
    }
    else if(SPI_MOD_SET(spino) == SPI1)
    {
      SIM_SCGC6 |= SIM_SCGC6_SPI1_MASK;
      PORTE_PCR4 = 0 | PORT_PCR_MUX(0x2) | PORT_PCR_DSE_MASK; /* PCS0 */
      PORTE_PCR2 = 0 | PORT_PCR_MUX(0x2) | PORT_PCR_DSE_MASK; /* SCK */
      PORTE_PCR1 = 0 | PORT_PCR_MUX(0x2) | PORT_PCR_DSE_MASK; /* SOUT */
      PORTE_PCR3 = 0 | PORT_PCR_MUX(0x2);                     /* SIN */
    }
    else
    {
      SIM_SCGC3 |= SIM_SCGC3_SPI2_MASK;
    }
   
    SPI_MCR_REG(base_addr) = 0
               | SPI_MCR_CLR_TXF_MASK   /* Clear the Tx FIFO counter. */
               | SPI_MCR_CLR_RXF_MASK   /* Clear the Rx FIFO counter. */
               | SPI_MCR_PCSIS_MASK       /* Peripheral Chip Select x Inactive State */
               | SPI_MCR_HALT_MASK;       /* Starts and stops DSPI transfers */

    /* 根据主从机模式设置工作模式 */
    if(master == MASTER)
    {
      SPI_MCR_REG(base_addr) |= SPI_MCR_MSTR_MASK;   /* Master/Slave Mode Select */
      SPI_CTAR_REG(base_addr,0) = 0
                     | SPI_CTAR_DBR_MASK      /* Double Baud Rate */
                     | SPI_CTAR_FMSZ(0x08)      /* Frame Size */
                     | SPI_CTAR_PDT_MASK      /* 延时因子为7 */
                     | SPI_CTAR_BR(0x8)         /* Selects the scaler value for the baud rate.*/
                     | SPI_CTAR_CPOL_MASK       /* Clock Polarity:The inactive state value of SCK is high */
                     | SPI_CTAR_CPHA_MASK;      /* Clock Phase:Data is changed on the leading edge of SCK*/
    }
    else
    {
      SPI_CTAR_SLAVE_REG(base_addr,0) = 0
                            | SPI_CTAR_SLAVE_FMSZ(0x08)
                            | SPI_CTAR_SLAVE_CPOL_MASK
                            | SPI_CTAR_SLAVE_CPHA_MASK;
   }

    SPI_SR_REG(base_addr) = (SPI_SR_EOQF_MASK    /* End of Queue Flag */
                         | SPI_SR_TFUF_MASK      /* Transmit FIFO Underflow Flag */
                         | SPI_SR_TFFF_MASK      /* Transmit FIFO Fill Flag */
                         | SPI_SR_RFOF_MASK      /* Receive FIFO Overflow Flag */
                         | SPI_SR_RFDF_MASK);    /* Receive FIFO Drain Flag */
   
    SPI_MCR_REG(base_addr) &= ~SPI_MCR_HALT_MASK;   /* start */
   
}

山外メ雲ジ 发表于 2012-5-5 20:51:41

购买了野火的K60了?不是已经提供了SDHC的例程了吗?跑文件系统了

山外メ雲ジ 发表于 2012-5-5 20:53:53

hcx31 发表于 2012-5-5 16:23 static/image/common/back.gif
你好,我现在也在研究k60的SD卡开发,用的也是SPI,但是我的SD卡初始化一直不能进入idle模式,下面是我的SP ...

   第42行:                  | SPI_CTAR_FMSZ(0x08)      /* Frame Size */

通信的方式,是8位通信吧?这里修改成 0x07……

山外メ雲ジ 发表于 2012-5-5 20:55:26

应该是 SPI 的初始化有问题……苏大提供的例子,有个误导人的地方。

第42行:                      | SPI_CTAR_FMSZ(0x08)      /* Frame Size */

这里修改成0x07 ,而不是0x08

hcx31 发表于 2012-5-6 11:58:25

山外メ雲ジ 发表于 2012-5-5 20:51 static/image/common/back.gif
购买了野火的K60了?不是已经提供了SDHC的例程了吗?跑文件系统了

我们是自己做的板子,没有用SDHC,用的是SPI

hcx31 发表于 2012-5-6 13:16:50

山外メ雲ジ 发表于 2012-5-5 20:55 static/image/common/back.gif
应该是 SPI 的初始化有问题……苏大提供的例子,有个误导人的地方。

第42行:                      | SP ...

恩,看了芯片资料,这里确实应该是0x07,可是改过之后还是没有相应~~郁闷了

SHIYOULAN 发表于 2012-8-1 12:53:41

库函数里面没有SPI啊

jinyi7016 发表于 2015-2-23 21:11:59

fatfs的官网有STM32F4的程序,可以下来参考下
页: [1]
查看完整版本: K60 用spi写MicroSD卡,FAT32的文件系统