打印

STM32+VS1003

[复制链接]
10625|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
w6850916|  楼主 | 2011-10-15 15:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
vs1003我之前调通过,用串口发数据给stm32存在flash中,发完后stm32从flash里读数据送到vs1003中播放,这种方式调试可行,但是我把数据存到SD卡中,再从SD卡中读数据送到vs1003中就出错,要是数据只有十几K大小的话可以播放,但是数据曾大的话vs1003只能播放几秒钟后程序就死在while (GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7) == 0);中,DREQ 一直为低,这是怎么回事啊!!!希望版主和接触过vs1003的大侠帮帮忙啊!!!先谢谢了
沙发
w6850916|  楼主 | 2011-10-17 09:49 | 只看该作者
两天都过去了,咋每一个人回啊!!!我确定我的VS1003没有问题,因为几十或一百K的文件是能正常播放的,可就是稍大的文件就死在上面所说的循环里,郁闷啊!谁能跟我说说大体的方向啊,或者导致DREQ一直为低的原因可能有哪些?

使用特权

评论回复
板凳
w6850916|  楼主 | 2011-10-18 10:02 | 只看该作者
今天测试突然发现对同样大小的156K的mp3文件一个能正常播放,而另一个怎么都不行,两个文件都是我用MP3分割软件分割的同一首歌曲的不同时间段,这是怎么回事啊??????

使用特权

评论回复
地板
xhtxzxw| | 2011-10-18 12:41 | 只看该作者
木有代码,无法说

使用特权

评论回复
5
yinyangdianzi| | 2011-10-18 12:50 | 只看该作者
1003B版本

使用特权

评论回复
6
w6850916|  楼主 | 2011-10-18 14:32 | 只看该作者
for(sd_block_add2 = 1024;sd_block_add2 < sd_block_add;)
         {
             IWDG_ReloadCounter();   //喂狗
             if (Status == SD_OK)
             {
                 Status = SD_ReadMultiBlocks(sd_block_add2, Buffer_MultiBlock_Rx, BlockSize, NumberOfBlocks);  //多块
        }
             if (Status == SD_OK)
             {
                        Fill_Buffer_sd(sd_block_buff, Buffer_MultiBlock_Rx, MultiBufferWordsSize);   //多块写
                Buffercmp11(sd_block_buff, MultiBufferWordsSize);  //多块
             }
                  sd_block_add2 = sd_block_add2+NumberOfBlocks*BlockSize;   //多块
         }

void Fill_Buffer_sd(u32 *pBuffer1, u32 *pBuffer2, u16 BufferLenght)
{
    u16 index = 0;

    /* Put in global buffer same values */
    for (index = 0; index < BufferLenght; index++ )
    {
        //pBuffer1[index] = pBuffer2[index];
        *pBuffer1 = *pBuffer2;
        pBuffer1++;
        pBuffer2++;
        }
}

void Buffercmp11(u32 *pBuffer, u16 BufferLength)
{
     u8  i = 0;
      
    GPIO_SetBits(GPIOA, GPIO_Pin_4);
    while (BufferLength)
   {
        BufferLength = BufferLength - 8;
        GPIO_ResetBits(GPIOB, GPIO_Pin_8);
        for(i=0;i < 8;i++)
        {
            SPI_Readbyte((*pBuffer)>>24);
            SPI_Readbyte((*pBuffer)>>16);
            SPI_Readbyte((*pBuffer)>>8);
            SPI_Readbyte(*pBuffer);
            pBuffer++;
        }
        GPIO_SetBits(GPIOB, GPIO_Pin_8);
        while (GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7) == 0);//等待DREQ为高              IWDG_ReloadCounter();
    }
}


我只把相关程序贴出来,大家看看有没有啥问题,常常播放几秒后程序就死在红色的位置

使用特权

评论回复
7
w6850916|  楼主 | 2011-10-21 20:33 | 只看该作者
终于找到原因了,我把串口发的数据先存到flash里,等串口发完后再把flash的数据转存到SD卡中,播放完全正常,这说明主要原因是串口再给SD卡的时候可能数据出错或是SD卡存写出错,其次是SD卡的读取速度和VS1003的速度不匹配,由于程序死在while (GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7) == 0);里,这个原因可能性很小,之后我把SD卡写入的数据打出来一个个的找,终于发现有的一个数据块完全正确,有的数据块的512个字节的第一个字节出错,很是纳闷,后来慢慢的调才缩小范围:是串口发512个字节时可能出错,我的串口中断程序如下:
void USART1_IRQHandler(void)
{
          u8 recv_com1_data;
       
        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
    {
         
        recv_com1_data = USART_ReceiveData(USART1);  //收下从串口1(计算机)发来的数据
     /*
        //接收计算机发来的命令和短消息     接收命令头0x55 0x55    结束命令0x55 0x35
        com1_data_num++;
        if(com1_data_num == 1)                                                                     //接收命令头0x55
        {
            if(recv_com1_data != 0x55)                                                  //如果第一个字符不是0x33,不是有用的信息
            {
                com1_data_num = 0;
                com1_data_sum = 0;
            }
        }
        else if(com1_data_num == 2)                                                     //数据2是0X35
        {
            if((recv_com1_data != 0x55)&&(recv_com1_data != 0x35))
            {
                com1_data_num = 0;                                                      //收到了不认得的信息,不去理会
                com1_data_sum = 0;
            }
            else if(recv_com1_data == 0x35)
            {
                com1_data_num = 0;
                sd_read_start = 1;
            }
        }
        else if(com1_data_num == 514)   //单个数据块
     {
            com1_data_num = 2;
            com1_shuju_buff[127] = com1_shuju_buff[127] | recv_com1_data;     //单个数据块写
        sd_start = 1;
        }
        else
        {
            if(recv_com1_data == 0x0F)
            {
                sd_jieshu = 1;
            }
            else if((recv_com1_data == 0x0D)&&(sd_jieshu == 1))
            {
                sd_jieshu = 2;
            }
            else if((recv_com1_data == 0x0A)&&(sd_jieshu == 2))
            {
                if((com1_data_num-5)%4==1)
                {
                    com1_shuju_buff[(com1_data_num-5)/4] = com1_shuju_buff[(com1_data_num-5)/4]<<16;
                }
                else if((com1_data_num-5)%4==2)
                {
                    com1_shuju_buff[(com1_data_num-5)/4] = com1_shuju_buff[(com1_data_num-5)/4]<<8;
                }
                for(i=((com1_data_num-5)/4+1);i<128;i++)
                {
                    com1_shuju_buff[i] = 0;
                }
                com1_data_num = 0;
                //sd_block_num++;
                sd_start = 1;
                sd_read_start = 1;
                wenjian_end = 1;
            }
            else
            {
                sd_jieshu = 0;
                if((com1_data_num-2)%4!=0)
                {
                    com1_shuju_buff[(com1_data_num-2)/4] = com1_shuju_buff[(com1_data_num-2)/4] | recv_com1_data;
                    com1_shuju_buff[(com1_data_num-2)/4] = com1_shuju_buff[(com1_data_num-2)/4]<<8;
                }
                else
                {
                    com1_shuju_buff[(com1_data_num-2)/4-1] = com1_shuju_buff[(com1_data_num-2)/4-1] | recv_com1_data;
                    com1_shuju_buff[(com1_data_num-2)/4]=0;
                }
            }
        }
  }
}
主函数如下:
while (1)
  {
      
     IWDG_ReloadCounter();   //喂狗
         
     if(sd_start == 1)
     {
         IWDG_ReloadCounter();   //喂狗
         Fill_Buffer_sd(Buffer_Block_Tx, com1_shuju_buff, BufferWordsSize);                 //单块写
         if (Status == SD_OK)
         {
               Status = SD_Erase(sd_block_add, (sd_block_add + 512));            //擦除块数据
      }
         if (Status == SD_OK)
         {
             Status = SD_WriteBlock(sd_block_add, Buffer_Block_Tx, BlockSize);                      //单块写
             sd_block_add = sd_block_add + 512;      //单块写
         }
         
         com1_huancun_num++;
         sd_start = 0;
     }
     
     if(sd_read_start == 1)
     {      
         for(sd_block_add2 = 1024;sd_block_add2 < sd_block_add;)
         {
             IWDG_ReloadCounter();   //喂狗
             if (Status == SD_OK)
             {
              Status = SD_ReadBlock(sd_block_add2, Buffer_Block_Rx, BlockSize);  //单块
             }
             if (Status == SD_OK)
             {
                 Fill_Buffer_sd(sd_block_buff, Buffer_Block_Rx, BufferWordsSize);                 //单块
           com1_huancun_num++;
                 
                 for(i=0;i<BufferWordsSize;i++)
                 {
                     mp3_date_ceshi[2*i] = sd_block_buff[i]>>16;
                     mp3_date_ceshi[2*i+1] = sd_block_buff[i];
                     //sd_block_buff[i] = 0;
                 }
                for(j=0;j<16;j++)
                 {
                     GPIO_ResetBits(GPIOB, GPIO_Pin_8);
                     for(t=0;t<16;t++)
                     {
                         SPI_Readbyte(mp3_date_ceshi[16*j+t]>>8);
                         SPI_Readbyte(mp3_date_ceshi[16*j+t]);
                     }
                     GPIO_SetBits(GPIOB, GPIO_Pin_8);
                    while (GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7) == 0);//等待DREQ为高
                     IWDG_ReloadCounter();
                 }
          }
                        sd_block_add2 = sd_block_add2+BlockSize;  //单块
                        
         }
         sd_read_start = 0;
                 
     }
     if(sd_block_num == 1)
     {
         
         for(i = 0;i < (sd_block_add-1024)/4;i++)
         {
             USART_SendData(USART1, ceshi_buff[i]>>24);
             while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
             USART_SendData(USART1, ceshi_buff[i]>>16);
             while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
             USART_SendData(USART1, ceshi_buff[i]>>8);
             while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
             USART_SendData(USART1, ceshi_buff[i]);
             while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
             Delay(10);
         }
         sd_block_num = 0;
     }
}
望各位高手帮忙看看什么原因导致的,小弟先谢了!!!

使用特权

评论回复
8
fusd| | 2011-12-21 13:56 | 只看该作者
可以去官网了解下详细资料哦,直接联系工程师也可以啊,官网:http://www.vlsi.fi/

使用特权

评论回复
9
woyaochenggong| | 2011-12-21 18:40 | 只看该作者
这些代码,怎么觉得这么乱呢?

使用特权

评论回复
10
nikita-fuck| | 2011-12-22 10:27 | 只看该作者
vs1003B  不错的型号

使用特权

评论回复
11
wangkangming| | 2012-8-17 09:44 | 只看该作者
小弟最近也在做mp3,请问LZ的问题解决了吗??

使用特权

评论回复
12
FZK374470412| | 2012-8-18 21:24 | 只看该作者
看看....................

使用特权

评论回复
13
vlsi源合| | 2012-11-26 11:19 | 只看该作者
学习了,顶下   8# w6850916

使用特权

评论回复
14
cdshkf| | 2014-3-4 09:48 | 只看该作者
挖个坟,求楼主开源PCB,想学习下啊。

使用特权

评论回复
15
jxyggg| | 2015-12-26 10:56 | 只看该作者
你好,我调试VS1003也遇到你类似的问题,DREQ在某个时段被拉低拉死了,请问是什么原因?而且现在通过SDI往VS1003灌数据的时候完全没有声音。。。SDI正弦测试是通过了的,能够从耳机听到声音。先谢谢了。。。希望你能上线看到。

使用特权

评论回复
16
zhuotuzi| | 2015-12-26 16:39 | 只看该作者
电路正常的情况下,VS1003需要首先通过XRESET异步复位,然后通过SPI发送0开启SPI功能,接着要正弦测试,如果有声音则芯片工作正常,之后才能用来播放。

使用特权

评论回复
17
jxyggg| | 2015-12-28 10:09 | 只看该作者
zhuotuzi 发表于 2015-12-26 16:39
电路正常的情况下,VS1003需要首先通过XRESET异步复位,然后通过SPI发送0开启SPI功能,接着要正弦测试,如 ...

需要发送多少0呢?

使用特权

评论回复
18
jxyggg| | 2015-12-28 10:52 | 只看该作者
zhuotuzi 发表于 2015-12-26 16:39
电路正常的情况下,VS1003需要首先通过XRESET异步复位,然后通过SPI发送0开启SPI功能,接着要正弦测试,如 ...

另外说明一点,SDI正弦测试正常,能正确开/关正弦波。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

126

帖子

5

粉丝