OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4449|回复: 1

STM32F407对正点原子VS1053模块软复位问题

[复制链接]

1

主题

1

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2017-10-11
在线时间
3 小时
发表于 2017-10-11 20:57:52 | 显示全部楼层 |阅读模式
5金钱
       原子哥你好!今天我照着正点原子的MP3例程尝试在自己的STM32F407开发板里写VS1053模块的程序,发现硬件复位的程序是可以的,但是软件复位的程序就是不行,红色的程序行是用lcd显示的,显示读到的MODE寄存器的值一直为0x4800,这是什么问题?我不知道是不是端口初始化的问题,所以附上GPIO和SPI初始化的程序,到底是什么问题导致软件复位一直失败?


/*软件复位*/
u8 VS_Soft_Resert(void){
                u8 overtime=0;
                u16 temp=0;
                u8 showbuf[10]={0};
                while(!READ_VS_DREQ);        //等待空闲
                VS_SPI_ReadWriteByte(0Xff);        //启动传输
                overtime=0;
                temp=VS_RD_Reg(SPI_MODE);
                while(temp!=0x0800){
//                while(VS_RD_Reg(SPI_MODE)!=0x0800){
                                VS_WR_Cmd(SPI_MODE,0x0804);
                                delay7_ms(2);
                                sprintf((char*)showbuf,"rd=%04x",temp);
                                Display_String(50,86,(u8*)(showbuf),BLUE,WHITE);    //用lcd显示的,这里一直显示读到的SPI_MODE的值为0x4800
                                overtime++;
                                if(overtime>=100){
                                                overtime=0;
                                                return 0;                                //返回0表示失败
                                }
                                temp=VS_RD_Reg(SPI_MODE);
                }
                while(!READ_VS_DREQ);        //等待空闲
                overtime=0;
                while(VS_RD_Reg(SPI_CLOCKF)!=0x9800){//设置VS10XX的时钟,3倍频 ,1.5xADD
                                VS_WR_Cmd(SPI_CLOCKF,0x9800);
//                                temp=VS_RD_Reg(SPI_CLOCKF);
//                                sprintf((char*)showbuf,"rd=%04x",temp);
//                                Display_String(50,86,(u8*)(showbuf),BLUE,WHITE);
                                overtime++;
                                if(overtime>=100){
                                                overtime=0;
                                                return 255;                                //返回255表示失败
                                }
                }
                delay7_ms(20);
                return 1;                                //返回1表示成功
}



GPIO和SPI初始化以及硬件连接的说明:

/*
STM32F407ZG               复用功能                VS1053                STM32F103ZE

PF7                                普通IO                XCS                        PF7(普通IO)(推挽输出)
PF12                                普通IO                XDCS                        PF6(普通IO)(推挽输出)
PA5                                SPI1_SCK                SCK                        PA5(SPI1_SCK)
PB5                                SPI1_MOSI                SI                        PA7(SPI1_MOSI)
PB4                                SPI1_MISO                SO                        PA6(SPI1_MISO)
PF13                                普通IO                DREQ                        PC13(普通IO)(上拉输入模式)
PF15                                普通IO                RST                        PE6(普通IO )(推挽输出)
*/
void VS_Spi1_Init(void)
{
        RCC->APB2ENR |= 1<<12;//SPI1时钟源   84mhz
        RCC->AHB1ENR |= 1<<1;//GPIOB
        RCC->AHB1ENR |= 1<<0;//GPIOA
        RCC->AHB1ENR |= 1<<5;//GPIOF
       
        GPIOB->MODER &= ~(3<<2*4|3<<2*5);                        //MOSI\MISO
        GPIOB->MODER |= (2<<2*4|2<<2*5);
        GPIOB->AFR[0]&= ~(0XF<<4*4|0XF<<4*5);
        GPIOB->AFR[0]|= (0X5<<4*4|0X5<<4*5);
        GPIOB->OSPEEDR &= ~(3<<2*4|3<<2*5);
        GPIOB->OSPEEDR |= (2<<2*4|2<<2*5);
       
        GPIOA->MODER &= ~(3<<2*5);                                                //SCK
        GPIOA->MODER |= (2<<2*5);
        GPIOA->AFR[0]&= ~(0XF<<4*5);
        GPIOA->AFR[0]|= (0X5<<4*5);
        GPIOA->OSPEEDR &= ~(3<<2*5);
        GPIOA->OSPEEDR |= (2<<2*5);
       
        GPIOF->MODER&=~(3UL<<2*13);                                                //DREQ
        GPIOF->PUPDR&=~(3UL<<2*13);
        GPIOF->PUPDR|=1<<2*13;
       
        GPIOF->MODER&=~(3UL<<2*15);                                                //RST
        GPIOF->MODER|=1<<2*15;
        GPIOF->OTYPER&=~(1<<15);
        GPIOF->OSPEEDR&=~(3UL<<2*15);
        GPIOF->OSPEEDR|=2<<2*15;
        GPIOF->PUPDR&=~(3UL<<2*15);
        GPIOF->ODR|=1<<15;
       
        GPIOF->MODER&=~(3<<2*7);                                                  //XCS
        GPIOF->MODER|=1<<2*7;
        GPIOF->OTYPER&=~(1<<7);
        GPIOF->OSPEEDR&=~(3<<2*7);
        GPIOF->OSPEEDR|=2<<2*7;
        GPIOF->PUPDR&=~(3<<2*7);
        GPIOF->ODR|=1<<7;
       
        GPIOF->MODER&=~(3UL<<2*12);                                                //XDCS
        GPIOF->MODER|=1<<2*12;
        GPIOF->OTYPER&=~(1<<12);
        GPIOF->OSPEEDR&=~(3UL<<2*12);
        GPIOF->OSPEEDR|=2<<2*12;
        GPIOF->PUPDR&=~(3UL<<2*12);
        GPIOF->ODR|=1<<12;
       
        SPI1->CR1 = 0;
        SPI1->CR1 |= 3<<8;// 选择软件配置主从模式,配置为主模式
       
        SPI1->CR1 |= 1<<2; //主模式
        SPI1->CR1 |= 3;    //时钟极性、时钟相位都为1
        SPI1->CR1|=7<<3;                 //Fsck=Fcpu/256
        SPI1->CR1 |= 1<<6; //使能SPI1
        Spi1_RevSendByte(0XFF);        //启动传输
}


//SPI1收发一个字节函数
u8 Spi1_RevSendByte(u8 Data)
{
        while (!(SPI1->SR & 1<<1))
        {
                ;//等待spi发送缓存区为空
        }
        SPI1->DR = Data;
       
        while (!(SPI1->SR & 1<<0))
        {
                ;//等待spi接收缓存区为非空
        }
        return SPI1->DR;
}



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2017-10-13 01:21:44 | 显示全部楼层
你单步跟踪,然后用万用表测量下IO状态看看。
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-19 01:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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