关于ALIENTEK VS1053模块初始化问题

2019-08-18 20:33发布

本帖最后由 csf4824521 于 2017-5-15 16:59 编辑

我现在使用的是ALIENTEK VS1053模块,根据实验代码修改了一下GPIO接口,现在在程序的运行过程中发现DREQ信号一直为高,所以复位无法成功。我的开发板芯片是103ZET6的SPI接的PA5~7,VS相关引脚接在E2~5,分别是:2:DREQ、3:RST、4:XDCS、5:XCS。芯片上的引脚如后图所示。

下面是初始化和问题代码
void VS1053_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);

        //XDCS
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(GPIOE, &GPIO_InitStructure);

        //DREQ
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOE, &GPIO_InitStructure);

        //XCS
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(GPIOE, &GPIO_InitStructure);

        //RST
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(GPIOE, &GPIO_InitStructure);

        VS_DCS(1);
        VS_CCS(1);

        SPI1_Init();
}


//命令片选
#define VS_CCS(x)  x ? GPIO_SetBits(GPIOE, GPIO_Pin_5) : GPIO_ResetBits(GPIOE, GPIO_Pin_5)
//数据片选
#define VS_DCS(x)  x ? GPIO_SetBits(GPIOE, GPIO_Pin_4) : GPIO_ResetBits(GPIOE, GPIO_Pin_4)
#define VS_RST(x)  x ? GPIO_SetBits(GPIOE, GPIO_Pin_3) : GPIO_ResetBits(GPIOE, GPIO_Pin_3)
#define VS_DREQ    GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_2)


软复位时判断DREQ是否可接收数据,就陷入死循环
void VS1053_SoftReset(void)
{
        u8 retry;

        while(VS_DREQ == 0);
        VS_SPI_ReadWriteByte(0xFF);
        retry = 0;
        while(VS1053_ReadReg(0) != 0x0800)
        {
                VS1053_WriteReg(SPI_MODE, 0x0804);
                delay_ms(2);
                if(retry++ > 100) break;
        }

        while(VS_DREQ == 0);

        while(VS1053_ReadReg(SPI_CLOCKF) != 0x9800)
        {
                VS1053_WriteReg(SPI_CLOCKF, 0x9800);
                if(retry++ > 100) break;
        }

        delay_ms(20);
}

请大家帮我看看问题出在哪里
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。