新手入门
- 积分
- 28
- 金钱
- 28
- 注册时间
- 2014-4-23
- 在线时间
- 0 小时
|
今天尝试一下VS1003b的驱动,但在读写模块寄存器时就出现了问题,便无法继续进行下去了。
下面是我的VS1003b_Init代码:
void My_VS1003b_Init()
{
u16 uReadVal = 0;
My_VS1003b_GPIOConfig();
My_SPI_Init(SPI1);
SPI_SetSpeed(SPI1,SPI_BaudRatePrescaler_16); //在模块为初始化之前SCLKI = 12MHZ,SPI允许的通信速率为SCLKI/6= 2MHZ
//SDI、SCI为SCLKI/4
// My_VS1003b_ExitConfig();
My_VS1003b_HardReset();
XDCS_H;
XCS_H;
My_TimeDelay(2);
My_VS1003b_WriteSCI(MODE,0x08,0x00);//软件复位,向0号寄存器写入0x0804 SM_SDINEW为1 SM_RESET为1 SM_DIFF为1环绕声
while(My_VS1003b_GetDREQState() == LOW);
My_VS1003b_WriteSCI(CLOCKF,0x98,0x00); //设置 VS1003 的时钟:例如SCI_CLOCKF=0x9800,向3号寄存器写入0x9800
//100 11 000 0000 0000 SC_MULT 为4 SC_ADD 为3 SC_FREQ为 0
// 设置完以后XTAIL不变,SCLKI = XTAIL*SC_MULT = 36MHZ,编解码速率 SCLKI*1.5 = 48MHZ;
uReadVal = My_VS1003b_Read(CLOCKF);
uReadVal += 0 ;
// SPI_SetSpeed(SPI1,SPI_BaudRatePrescaler_8);
My_VS1003b_WriteSCI(AUDATA,0xBB,0x81); //设置 VS1003 的采样率:SPI_AUDATA=0xbb81,采样率 0xBB80 48k,0x0001立体声
uReadVal = My_VS1003b_Read(AUDATA);
uReadVal += 0 ;
My_VS1003b_WriteSCI(BASS,0x00,0x00); //SPI_BASS=0x0055,重音设置,向2号寄存器写入0x0055
//SB_AMPLITUDE=5 SB_FREQLIMIT=5 低于50Hz时进行5dB的增强
uReadVal = My_VS1003b_Read(BASS);
uReadVal += 0 ;
My_VS1003b_WriteSCI(VOL,VOL_VALUE,VOL_VALUE); //初始设置音量:SCI_VOL=0x2020 左右声道相同
// while(1)
// {
// uReadVal = My_VS1003b_Read(VOL);
// uReadVal += 0 ;
// }
// VS1003_ResetDecodeTime();
SPI_WriteByte(SPI1,0); //SDI测试
SPI_WriteByte(SPI1,0);
SPI_WriteByte(SPI1,0);
SPI_WriteByte(SPI1,0);
while(My_VS1003b_GetDREQState() == LOW);
VS1003_Sintest(5);
}
SPI初始化代码:
GPIO初始略过。。。
SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStruct.SPI_Mode = SPI_Mode_Master;
SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;
SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;
SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStruct.SPI_CRCPolynomial = 7;
SPI_Cmd(pstSPIx,DISABLE);
SPI_Init(pstSPIx,&SPI_InitStruct);
SPI_Cmd(pstSPIx,ENABLE);
由于我的HCLK = 36MHZ,所以此处为16分频。。。。
这是我的100b 的 GPIO_Init代码:
void My_VS1003b_GPIOConfig()
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_InitStruct.GPIO_Pin = VS1003b_DREQ;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOC,&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = VS1003b_XDCS | VS1003b_XCS | VS1003b_RSET;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC,&GPIO_InitStruct);
}
1003b 读写模块函数:
u16 My_VS1003b_Read(u8 uAddress)
{
u16 uReturnVal = 0;
// while(My_VS1003b_GetXCSState() == HIGH);
My_VS1003b_SCIStart();
SPI_WriteByte(SPI1,VS1003b_Read);
SPI_WriteByte(SPI1,uAddress);
uReturnVal = (SPI_ReadWriteByte(SPI1,0xff) << 8);
uReturnVal |= SPI_ReadWriteByte(SPI1,0xff);
My_VS1003b_SCIStop();
return uReturnVal;
}
void My_VS1003b_WriteSDI(u8 uAddress,u8 uVal)
{
// while(My_VS1003b_GetXCSState() == HIGH);
My_VS1003b_SDIStart();
SPI_WriteByte(SPI1,VS1003b_Write);
SPI_WriteByte(SPI1,uAddress);
SPI_ReadWriteByte(SPI1,uVal % 0x100);
My_VS1003b_SDIStop();
My_TimeDelay(1);
}
void My_VS1003b_WriteSCI(u8 uAddress,u8 uHbyte,u8 uLbyte)
{
// while(My_VS1003b_GetXCSState() == HIGH);
My_VS1003b_SCIStart();
SPI_WriteByte(SPI1,VS1003b_Write);
SPI_WriteByte(SPI1,uAddress);
SPI_WriteByte(SPI1,uHbyte);
SPI_WriteByte(SPI1,uLbyte);
My_VS1003b_SCIStop();
My_TimeDelay(1);
}
|
|