sharkchen 发表于 2010-11-5 14:00:09

菜鸟求助啊,ARM7上读取sd卡的bin文件,高手帮忙看看程序究竟哪里出问题了

/****************************************************************************
* 文 件 名:main.c
* 功    能:使用硬件SPI接口输出控制LED显示。(硬件:74HC595输出控制LED显示)
* 说    明:将SmartARM2200开发板上的J5上SPI1信号和LED子板的SPI接口相连接
****************************************************************************/
#include"config.h"
//#include"xxx.h"
#defineC_POW       (1<<23)            
#defineC_CS      (1<<24)
#defineC_INT       (1<<25)
#defineC_WP      (1<<25)

int bl1,bl2;   
uint8 rebuf;
int p=0;
uint8 read_SDcard;
uint16 read;      
int num,point=0;                                                           
/****************************************************************************
* 名    称:DelayNS()
* 功    能:长软件延时
* 入口参数:dly                延时参数,值越大,延时越久
* 出口参数:无
****************************************************************************/
voidDelayNS(uint32dly)
{
    uint32i;
    for(; dly>0; dly--)
    {
      for(i=0; i<50000; i++);
    }

}

/*******************************************************************************************************************
** 函数名称: void SPI_Clk400k()                                        Name:          void SPI_Clk400k()
** 功能描述: 设置SPI的时钟小于400kHZ                        Function: set the clock of SPI less than 400kHZ
** 输 入: 无                                                                        Input:          NULL
** 输   出: 无                                                                        Output:          NULL
********************************************************************************************************************/
void SPI_Clk400k(void)
{
        SPI_SPCCR = 30;                                                    /* 设置SPI时钟分频值为128Set the value of dividing frequency to 128 */
}


/*******************************************************************************************************************
** 函数名称: void SPI_ClkToMax()                                Name:          void SPI_ClkToMax()
** 功能描述: 设置SPI的clock到最大值                                Function: set the clock of SPI to maximum
** 输 入: 无                                                                        Input:          NULL
** 输   出: 无                                                                        Output:          NULL
********************************************************************************************************************/
void SPI_ClkToMax(void)
{
        SPI_SPCCR = 8;                                                                /* 设置SPI时钟分频值为8Set the value of dividing frequency to 8 */
}

/****************************************************************************
* 名    称:MSpiInit()
* 功    能:初始化SPI接口,设置为主机。
* 入口参数:无
* 出口参数:无
****************************************************************************/
voidMSpiInit(void)
{
        PINSEL0 = 0x5500;
       
        PINSEL1 = PINSEL1 & ( ~(3<<14) );//将C_POW配置为输出模式
        IO0DIR |=C_POW;
       
        PINSEL1 = PINSEL1 & ( ~(3<<16) );//将C_CS 配置为输出模式
        IO0DIR |=C_CS;
       
        IO1DIR &=~C_WP ;               //将C_WP 配置为输入模式
                       
    PINSEL1 = PINSEL1 & ( ~(3<<18) );//将C_INT 配置为输入模式
        IO0DIR &=~C_INT;
               
               
    SPI_Clk400k();
   
        S0PCR= (1 << 3) |                                // CPHA = 0, 数据在SCK 的第一个时钟沿采样
                       (1 << 4) |                                // CPOL = 1, SCK 为低有效
                       (1 << 5) |                                // MSTR = 1, SPI 处于主模式
                       (0 << 6) |                                // LSBF = 0, SPI 数据传输MSB (位7)在先
                       (0 << 7);                                // SPIE = 0, SPI 中断被禁止
}



/*******************************************************************************************************************
** 函数名称: void SPI_SendByte()                                Name:          void SPI_SendByte()
** 功能描述: 通过SPI接口发送一个字节                        Function: send a byte by SPI interface
** 输 入: INT8U byte: 发送的字节                                Input:          INT8U byte: the byte that will be send
** 输   出: 无                                                                        Output:          NULL
********************************************************************************************************************/
void SPI_SendByte(uint8 byte)
{
//        uint8 temp;

        SPI_SPDR = byte;                                                        /* 发送数据放入SPI数据寄存器 */
   
        while(0 == (SPI_SPSR & 0x80));                                /* 等待SPIF置位,即等待数据发送完毕 */
                                                                                                /* wait for SPIF being set, that is, wait for finishing of data being send */
        //temp = SPI_SPDR;
}


/*******************************************************************************************************************
** 函数名称: INT8U SPI_RecByte()                                Name:          INT8U SPI_RecByte()
** 功能描述: 从SPI接口接收一个字节                                Function: receive a byte from SPI interface
** 输 入: 无                                                                        Input:          NULL
** 输   出: 收到的字节                                                        Output:          the byte that be received
********************************************************************************************************************/
uint8 SPI_RecByte(void)
{
        SPI_SPDR = 0xFF;
   
        while(0 == (SPI_SPSR & 0x80));                                /* 等待SPIF置位,即等待收到数据 */
                                                                                                /* wait for SPIF being set, that is, wait for being received data */
        return(SPI_SPDR);                                                         /* 读取收到的字节 read the byte received */
}

/******显示*****/
void Image_320x240_dispaly(unsigned char*HZ_BUF)
{
int x,y;
for(y=0;y<240;y++)
{
   for(x=0;x<320;x++)
   {
    GUI_Point(x,y, *(HZ_BUF+y*320+x) );
   }
}
}   
/*************************************************************
* 名称:main()
* 功能:
***************************************************************/
intmain(void)
{
    int i;
    /************************初始化硬件************************************/
    MSpiInit();                                       // 初始化SPI接口
    IO0SET=C_POW;                // 断电
    DelayNS(10);
    IO0CLR=C_POW;                // 再供电
    GUI_Initialize();
    bl1= IO0PIN&C_INT;         //有SD卡时是低电平 无SD卡时是高电平
   
    if (bl1==0)
    {
         bl2= IO1PIN&C_WP;      //写保护的时候输出高电平否则输出低电平
    }
   
   /**************************复位设备CMD0******************************/      
        IO0SET |=C_CS;
           SPI_SendByte(0xff);
    DelayNS(2);
    for(i=0;i<=10;i++)         //大于74个时钟
    SPI_SendByte(0xff);   
    DelayNS(2);
   
    IO0CLR |=C_CS;
    SPI_SendByte(0x40);      
    SPI_SendByte(0x00);
    SPI_SendByte(0x00);      
    SPI_SendByte(0x00);   
    SPI_SendByte(0x00);         
    SPI_SendByte(0x95);      
    do
    {
       bl1= SPI_RecByte();   
    } while(bl1==0xff);
      
   
   for (i=0;i<=10;i++)
{
   
   /*************************激活卡 CMD1********************************/               
        IO0SET |=C_CS;
           SPI_SendByte(0xff);
    DelayNS(2);
    IO0CLR |=C_CS;
   
      SPI_SendByte(0x41);      
      SPI_SendByte(0x00);
      SPI_SendByte(0x00);      
      SPI_SendByte(0x00);   
      SPI_SendByte(0x00);         
      SPI_SendByte(0xff);
      SPI_SendByte(0xff);         
    do
    {
      bl2= SPI_RecByte();   
    } while(bl2==0xff);
      
        IO0SET |=C_CS;
    DelayNS(2);
       
   
    /************************* CMD 55 *********************************/                 
        IO0SET |=C_CS;
           SPI_SendByte(0xff);
    DelayNS(2);
    IO0CLR |=C_CS;
   
      SPI_SendByte(0x40+55);      
      SPI_SendByte(0x00);
      SPI_SendByte(0x00);      
      SPI_SendByte(0x00);   
      SPI_SendByte(0x00);         
      SPI_SendByte(0xff);   
      SPI_SendByte(0xff);      
    do
    {
      bl2= SPI_RecByte();   
    } while(bl2==0xff);
      
           IO0SET |=C_CS;
    DelayNS(2);
         
    /************************* ACMD 41 read****************************/
        IO0SET |=C_CS;
           SPI_SendByte(0xff);
    DelayNS(2);   
    IO0CLR |=C_CS;
   
      SPI_SendByte(0x40+41);      
      SPI_SendByte(0x00);
      SPI_SendByte(0x00);      
      SPI_SendByte(0x00);   
      SPI_SendByte(0x00);         
      SPI_SendByte(0xff);   
      SPI_SendByte(0xff);         
    do
    {
      bl2= SPI_RecByte();   
    } while(bl2==0xff);
      
           IO0SET |=C_CS;
    DelayNS(2);
               
}                     

/***********************CMD 51READ block ***************************/                            
        for(read=0;read<150;read++)
        {
        IO0SET |=C_CS;
           SPI_SendByte(0xff);
    DelayNS(2);
   
    IO0CLR |=C_CS;
   
      SPI_SendByte(0x51);      
      SPI_SendByte(0x00);
      SPI_SendByte(0x06);      
      SPI_SendByte(0x82);//从第1扇区读出512字节数
      SPI_SendByte(0x00+read);         
      SPI_SendByte(0xff);   
   
    do
    {
      bl2= SPI_RecByte();   
    } while(bl2==0xff);
   
    do
    {
      bl2= SPI_RecByte();   
    } while(bl2==0xff);
      p=0;
    do{
      bl1= SPI_RecByte();
      rebuf=bl1;
    } while(p<512);
   
   
        IO0SET |=C_CS;   
    DelayNS(2);
   for(num=0;num<512;num++)
   {
       read_SDcard=rebuf;
   }
   point+=512;
                 
    }
/***********************CMD3csd READ***************************/                            
/* for(i=0;i<60000;i++)
{
   
}

   Image_320x240_dispaly((unsigned char*)read_SDcard);
                   
        while(1);
       
    return(0);
}
我是将一张图片转换成bin文件放到sd卡上,从这个文件的首簇开始读扇区文件,共150个扇区,然后将图片打印出来,但程序一直卡在这里:
uint8 SPI_RecByte(void)
{
        SPI_SPDR = 0xFF;
   
        while(0 == (SPI_SPSR & 0x80));                                /* 等待SPIF置位,即等待收到数据 */
                                                                                                /* wait for SPIF being set, that is, wait for being received data */
        return(SPI_SPDR);                                                         /* 读取收到的字节 read the byte received */
}

高手帮忙看看这是什么错误

sharkchen 发表于 2010-11-5 14:01:43

我直接计算出文件的首簇号,从首簇开始读进去,没读完一个扇区将读出的数据存到一个大数组里面,最后打印出来

sharkchen 发表于 2010-11-5 16:58:32

自顶下。。。。。

sharkchen 发表于 2010-11-5 19:21:33

还有我用的是学校买的周立功的ARM7实验箱
页: [1]
查看完整版本: 菜鸟求助啊,ARM7上读取sd卡的bin文件,高手帮忙看看程序究竟哪里出问题了