//向VS10XX写命令 //address:命令地址 //data:命令数据 void VS_WR_Cmd(u8 address, u16 data) { while (VS_DQ == 0); //等待空闲 VS_SPI_SpeedLow();//低速 VS_XDCS_H; VS_XCS_L; VS_SPI_ReadWriteByte(VS_WRITE_COMMAND);//发送VS10XX的写命令 VS_SPI_ReadWriteByte(address); //地址 VS_SPI_ReadWriteByte(data >> 8); //发送高八位 VS_SPI_ReadWriteByte(data); //第八位 VS_XCS_H; VS_SPI_SpeedHigh();//高速 }
//读VS10XX的寄存器 //address:寄存器地址 //返回值:读到的值 //注意不要用倍速读取,会出错 u16 VS_RD_Reg(u8 address) { u16 temp = 0; while (VS_DQ == 0); //非等待空闲状态 VS_SPI_SpeedLow();//低速 VS_XDCS_H; VS_XCS_L; VS_SPI_ReadWriteByte(VS_READ_COMMAND); //发送VS10XX的读命令 VS_SPI_ReadWriteByte(address); //地址 temp = VS_SPI_ReadWriteByte(0xff); //读取高字节 temp = temp << 8; temp += VS_SPI_ReadWriteByte(0xff); //读取低字节 VS_XCS_H; VS_SPI_SpeedHigh();//高速 return temp; }
//向VS10XX写数据 //data:要写入的数据 void VS_WR_Data(u8 data) { VS_SPI_SpeedHigh();//高速,对VS1003B,最大值不能超过36.864/4Mhz,这里设置为9M VS_XDCS_L; VS_SPI_ReadWriteByte(data); VS_XDCS_H; }
//发送一次音频数据 //固定为32字节 //返回值:0,发送成功 // 1,VS10xx不缺数据,本次数据未成功发送 u8 VS_Send_MusicData(u8* buf) { u8 n; if (VS_DREQ_STATE != 0) //送数据给VS10XX { VS_XDCS_LOW; for (n = 0; n < 32; n++) { VS_SPI_ReadWriteByte(buf[n]); } VS_XDCS_HIGH; } else return 1; return 0; //成功发送了 }
//发送一次音频数据 //固定为32字节 //返回值:0,发送成功 // 1,VS10xx不缺数据,本次数据未成功发送 u8 VS_Send_MusicData(u8* buf) { u8 n; if (VS_DQ != 0) //送数据给VS10XX { //PBout(0)_H; VS_XDCS_L; for (n = 0; n < 32; n++) { VS_SPI_ReadWriteByte(buf[n]); } VS_XDCS_H; } else return 1; return 0;//成功发送了 }
//发送一次音频数据 //固定为32字节 //返回值:0,发送成功 // 1,VS10xx不缺数据,本次数据未成功发送 u8 VS_Send_MusicData(u8* buf) { u8 n; if(VS_DQ!=0) //送数据给VS10XX { mico_rtos_suspend_all_thread(); VS_XDCS_Clr(); for(n=0;n<32;n++) { VS_SPI_ReadWriteByte(buf[n]); } VS_XDCS_Set(); mico_rtos_resume_all_thread(); }else return 1; return 0;//成功发送了 }
//ram 测试 //返回值:RAM测试结果 // VS1003如果得到的值为0x807F,则表明完好;VS1053为0X83FF. u16 VS_Ram_Test(void) { VS_HD_Reset(); VS_WR_Cmd(SPI_MODE, 0x0820); // 进入VS10XX的测试模式 while (VS_DQ == 0); // 等待DREQ为高 VS_SPI_SpeedLow();//低速 VS_XDCS_L; // xDCS_H,选择VS10XX的数据接口 VS_SPI_ReadWriteByte(0x4d); VS_SPI_ReadWriteByte(0xea); VS_SPI_ReadWriteByte(0x6d); VS_SPI_ReadWriteByte(0x54); VS_SPI_ReadWriteByte(0x00); VS_SPI_ReadWriteByte(0x00); VS_SPI_ReadWriteByte(0x00); VS_SPI_ReadWriteByte(0x00); delay_ms(150); VS_XDCS_H; return VS_RD_Reg(SPI_HDAT0);// VS1003如果得到的值为0x807F,则表明完好;VS1053为0X83FF.; }
//////////////////////////////////////////////////////////////////////////////// //软复位VS10XX void VS_Soft_Reset(void) { u8 retry = 0; while (VS_DQ == 0); //等待软件复位结束 VS_SPI_ReadWriteByte(0Xff);//启动传输 retry = 0; while (VS_RD_Reg(SPI_MODE) != 0x0800) // 软件复位,新模式 { VS_WR_Cmd(SPI_MODE, 0x0804); // 软件复位,新模式 delay_ms(2);//等待至少1.35ms if (retry++ > 100)break; } while (VS_DQ == 0); //等待软件复位结束 retry = 0; while (VS_RD_Reg(SPI_CLOCKF) != 0X9800) //设置VS10XX的时钟,3倍频 ,1.5xADD { VS_WR_Cmd(SPI_CLOCKF, 0X9800); //设置VS10XX的时钟,3倍频 ,1.5xADD if (retry++ > 100)break; } delay_ms(20); }
//正弦测试 void VS_Sine_Test(void) { VS_HD_Reset(); VS_WR_Cmd(0x0b, 0X2020); //设置音量 VS_WR_Cmd(SPI_MODE, 0x0820); //进入VS10XX的测试模式 while (VS_DQ == 0); //等待DREQ为高 //printf("mode sin:%x\n",VS_RD_Reg(SPI_MODE)); //向VS10XX发送正弦测试命令:0x53 0xef 0x6e n 0x00 0x00 0x00 0x00 //其中n = 0x24, 设定VS10XX所产生的正弦波的频率值,具体计算方法见VS10XX的datasheet VS_SPI_SpeedLow();//低速 VS_XDCS_L; //选中数据传输 VS_SPI_ReadWriteByte(0x53); VS_SPI_ReadWriteByte(0xef); VS_SPI_ReadWriteByte(0x6e); VS_SPI_ReadWriteByte(0x24); VS_SPI_ReadWriteByte(0x00); VS_SPI_ReadWriteByte(0x00); VS_SPI_ReadWriteByte(0x00); VS_SPI_ReadWriteByte(0x00); delay_ms(100); VS_XDCS_H; //退出正弦测试 VS_XDCS_L; //选中数据传输 VS_SPI_ReadWriteByte(0x45); VS_SPI_ReadWriteByte(0x78); VS_SPI_ReadWriteByte(0x69); VS_SPI_ReadWriteByte(0x74); VS_SPI_ReadWriteByte(0x00); VS_SPI_ReadWriteByte(0x00); VS_SPI_ReadWriteByte(0x00); VS_SPI_ReadWriteByte(0x00); delay_ms(100); VS_XDCS_H; //再次进入正弦测试并设置n值为0x44,即将正弦波的频率设置为另外的值 VS_XDCS_L; //选中数据传输 VS_SPI_ReadWriteByte(0x53); VS_SPI_ReadWriteByte(0xef); VS_SPI_ReadWriteByte(0x6e); VS_SPI_ReadWriteByte(0x44); VS_SPI_ReadWriteByte(0x00); VS_SPI_ReadWriteByte(0x00); VS_SPI_ReadWriteByte(0x00); VS_SPI_ReadWriteByte(0x00); delay_ms(100); VS_XDCS_H; //退出正弦测试 VS_XDCS_L; //选中数据传输 VS_SPI_ReadWriteByte(0x45); VS_SPI_ReadWriteByte(0x78); VS_SPI_ReadWriteByte(0x69); VS_SPI_ReadWriteByte(0x74); VS_SPI_ReadWriteByte(0x00); VS_SPI_ReadWriteByte(0x00); VS_SPI_ReadWriteByte(0x00); VS_SPI_ReadWriteByte(0x00); delay_ms(100); VS_XDCS_H; }