新手上路
- 积分
- 21
- 金钱
- 21
- 注册时间
- 2017-10-11
- 在线时间
- 3 小时
|
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;
}
|
|