智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 3570|回复: 2
打印 上一主题 下一主题

[咨询] k60 用 spi 读写SD卡 进不了idle

[复制链接]

4

主题

20

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
476
威望
299
贡献
85
兑换币
13
注册时间
2012-2-20
在线时间
46 小时
毕业学校
CQJTU
跳转到指定楼层
1#
发表于 2013-4-29 16:18:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
20贡献
//=========================================================================
void hw_spi_init(uint8 spiNo,uint8 master,uint8 speed)
{
    SPI_MemMapPtr BaseAdd = hw_spi_get_base_address(spiNo);
   
    //使能SPI模块时钟,配置SPI引脚功能
    if(spiNo == 0)
    {
        SIM_SCGC6 |= SIM_SCGC6_DSPI0_MASK;
        PORTA_PCR14 = 0 | PORT_PCR_MUX(0x2) | PORT_PCR_DSE_MASK;//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(spiNo == 1)
    {
        SIM_SCGC6 |= SIM_SCGC6_SPI1_MASK;
        PORTE_PCR1 = 0 | PORT_PCR_MUX(0x2) | PORT_PCR_DSE_MASK;//SOUT
        PORTE_PCR2 = 0 | PORT_PCR_MUX(0x2) | PORT_PCR_DSE_MASK;//SCK
        PORTE_PCR3 = 0 | PORT_PCR_MUX(0x2);//SIN
        PORTE_PCR4 = 0 | PORT_PCR_MUX(0x2) | PORT_PCR_DSE_MASK;//PCS0
      
        
    }
    else
    {
        SIM_SCGC3 |= SIM_SCGC3_SPI2_MASK;
    }
   
    SPI_MCR_REG(BaseAdd) = 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
                 | SPI_MCR_HALT_MASK;
    //根据主从机模式设置工作模式
    if(master == MASTER)
    {
      if(speed == SPI_SPEED_LOW)
      {
        SPI_MCR_REG(BaseAdd) |= SPI_MCR_MSTR_MASK;
        SPI_CTAR_REG(BaseAdd,0) = 0
                       | SPI_CTAR_DBR_MASK
                       | SPI_CTAR_FMSZ(0x07)
                       | SPI_CTAR_PDT_MASK//延时因子为7
                       | SPI_CTAR_BR(8)
                       | SPI_CTAR_CPOL_MASK
                       | SPI_CTAR_CPHA_MASK;
      }
      else
      {
   
        SPI_MCR_REG(BaseAdd) |= SPI_MCR_MSTR_MASK;
        SPI_CTAR_REG(BaseAdd,0) = 0
                       | SPI_CTAR_DBR_MASK
                       | SPI_CTAR_FMSZ(0x07)
                       | SPI_CTAR_PDT_MASK//延时因子为7
                       | SPI_CTAR_BR(0)
                       | SPI_CTAR_CPOL_MASK
                       | SPI_CTAR_CPHA_MASK;
      }
    }
    else
    {
        SPI_CTAR_SLAVE_REG(BaseAdd,0) = 0
                            | SPI_CTAR_SLAVE_FMSZ(0x07)
                            | SPI_CTAR_SLAVE_CPOL_MASK
                            | SPI_CTAR_SLAVE_CPHA_MASK;
   }

    SPI_SR_REG(BaseAdd) = (SPI_SR_EOQF_MASK
                         | SPI_SR_TFUF_MASK
                         | SPI_SR_TFFF_MASK
                         | SPI_SR_RFOF_MASK
                         | SPI_SR_RFDF_MASK);
   
    SPI_MCR_REG(BaseAdd) &= ~SPI_MCR_HALT_MASK;
}



uint8 DrvSPI_SendOneByte_ActiveCS(uint8 spiNo, uint8 buffer)
{
    uint8 RX_Data;
    SPI_MemMapPtr BaseAdd = hw_spi_get_base_address(spiNo);
    SPI_SR_REG(BaseAdd) = (SPI_SR_EOQF_MASK                         //在发送数据之前先清除接收最后一帧标志位
                       | SPI_SR_TFUF_MASK                       //在发送数据之前先清除TX FIFO下溢标志
                       | SPI_SR_TFFF_MASK                       //在发送数据之前先清除TX FIFO充满标志
                       | SPI_SR_RFOF_MASK                       //在发送数据之前先清除RX FIFO溢出标志
                       | SPI_SR_RFDF_MASK);                     //在发送数据之前先清除RX FIFO不空标志
    SPI_MCR_REG(BaseAdd) |= SPI_MCR_CLR_TXF_MASK
                         | SPI_MCR_CLR_RXF_MASK;               //在发送数据之前先清除TX FIFO和RX FIFO
   
    SPI_SR_REG(BaseAdd) |= SPI_SR_TCF_MASK;                         //清除发送完成标志
   
    SPI_PUSHR_REG(BaseAdd) = (SPI_PUSHR_CTAS(0)                     //选择CTAR0寄存器定义传输特性
                          | SPI_PUSHR_EOQ_MASK                  //该帧SPI数据是最后一帧数据
                          | SPI_PUSHR_PCS(1)                    //片选信号PCS0
                          | SPI_PUSHR_TXDATA(buffer));          //写入数据
   
    SPI_MCR_REG(BaseAdd) &= ~SPI_MCR_HALT_MASK;                     //启动SPI数据传输
   
    while((SPI_SR_REG(BaseAdd) & SPI_SR_TCF_MASK) == 0);            //等待发送完成
   
    SPI_SR_REG(BaseAdd) |= SPI_SR_TCF_MASK;                         //清除传送完成标志
   
    while((SPI_SR_REG(BaseAdd) & SPI_SR_RFDF_MASK) == 0);           //等待接收缓冲区有有效数据,即等待RX FIFO不为空为止
   
    RX_Data = (uint8)SPI_POPR_REG(BaseAdd);                         //读取RX FIFO内部数据
   
    SPI_SR_REG(BaseAdd) |= SPI_SR_RFDF_MASK;                        //清除RX FIFO不为空标志
   
    SPI_MCR_REG(BaseAdd) |= SPI_MCR_HALT_MASK;                      //停止SPI数据传输
   
    return (RX_Data);
}
/************发送bu读回***********/
uint8 DrvSPI_SendOneByte_InactiveCS(uint8 spiNo, uint8 buffer)
{
    uint8 RX_Data;
    SPI_MemMapPtr BaseAdd = hw_spi_get_base_address(spiNo);
    SPI_SR_REG(BaseAdd) = (SPI_SR_EOQF_MASK                         //在发送数据之前先清除接收最后一帧标志位
                       | SPI_SR_TFUF_MASK                       //在发送数据之前先清除TX FIFO下溢标志
                       | SPI_SR_TFFF_MASK                       //在发送数据之前先清除TX FIFO充满标志
                       | SPI_SR_RFOF_MASK                       //在发送数据之前先清除RX FIFO溢出标志
                       | SPI_SR_RFDF_MASK);                     //在发送数据之前先清除RX FIFO不空标志
    SPI_MCR_REG(BaseAdd) |= SPI_MCR_CLR_TXF_MASK
                         | SPI_MCR_CLR_RXF_MASK;               //在发送数据之前先清除TX FIFO和RX FIFO
   
    SPI_SR_REG(BaseAdd) |= SPI_SR_TCF_MASK;                         //清除发送完成标志
   
    SPI_PUSHR_REG(BaseAdd) = (SPI_PUSHR_CTAS(0)                     //选择CTAR0寄存器定义传输特性
                          | SPI_PUSHR_EOQ_MASK                  //该帧SPI数据是最后一帧数据
                          | SPI_PUSHR_PCS(0)                    //片选信号PCS0
                          | SPI_PUSHR_TXDATA(buffer));          //写入数据
   
   
    SPI_MCR_REG(BaseAdd) &= ~SPI_MCR_HALT_MASK;                     //启动SPI数据传输
   
    while((SPI_SR_REG(BaseAdd) & SPI_SR_TCF_MASK) == 0);            //等待发送完成
   
    SPI_SR_REG(BaseAdd) |= SPI_SR_TCF_MASK;                         //清除传送完成标志
   
    while((SPI_SR_REG(BaseAdd) & SPI_SR_RFDF_MASK) == 0);           //等待接收缓冲区有有效数据,即等待RX FIFO不为空为止
   
    RX_Data = (uint8)SPI_POPR_REG(BaseAdd);                         //读取RX FIFO内部数据
   
    SPI_SR_REG(BaseAdd) |= SPI_SR_RFDF_MASK;                        //清除RX FIFO不为空标志
   
    SPI_MCR_REG(BaseAdd) |= SPI_MCR_HALT_MASK;                      //停止SPI数据传输
   
   
    return (RX_Data);
}
unsigned char SD_Init(void)
{
     int i ;
    // 用来循环计数
    unsigned char r1 =0;
    // 存放SD卡的返回值
    unsigned int retry ;
    // 用来进行超时计数
    unsigned char buff[6];
    // 纯延时,等待SD卡上电完成
    for(i=0;i<0xf00;i++);
    //先产生>74个脉冲,让SD卡自己初始化完成
    for(i=0;i<10;i++)
    {
        DrvSPI_SendOneByte_InactiveCS(SPI_1, 0XFF);
    }

    //-----------------SD卡复位到idle开始-----------------
    //循环连续发送CMD0,直到SD卡返回0x01,进入IDLE状态
    //超时则直接退出
    retry=0 ;
    while((r1!=0x01)&&(retry<200))
   
    {           //发送CMD0,让SD卡进入IDLE状态
        r1=SD_SendCommand(CMD0,0,0x95);
        retry++;
    }
    //跳出循环后,检查原因:初始化成功?or 重试超时?
    if(retry==200)
    {   
//  put_s("SD Time out!");
        return 1 ;
        //超时返回1
    }



总是超时退出,不能进idle SPI测试能自发自收数据,请高手帮忙解惑!!!!!

4

主题

20

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
476
威望
299
贡献
85
兑换币
13
注册时间
2012-2-20
在线时间
46 小时
毕业学校
CQJTU
2#
 楼主| 发表于 2013-4-29 16:37:26 | 只看该作者
自己顶个
回复

使用道具 举报

4

主题

20

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
476
威望
299
贡献
85
兑换币
13
注册时间
2012-2-20
在线时间
46 小时
毕业学校
CQJTU
3#
 楼主| 发表于 2013-4-30 12:30:28 | 只看该作者
不要沉
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-12-25 16:06 , Processed in 0.074562 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表