查看: 2633|回复: 0

[分享] k60 用 spi 读写SD卡 进不了idle

[复制链接]

该用户从未签到

1

主题

2

帖子

0

新手上路

Rank: 1

积分
0
最后登录
1970-1-1
发表于 2013-4-29 17:05:09 | 显示全部楼层 |阅读模式


//=========================================================================
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;i74个脉冲,让SD卡自己初始化完成
    for(i=0;i
回复

使用道具 举报

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

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-7-19 09:27 , Processed in 0.075629 second(s), 19 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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