⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 myfution.c

📁 自己编写移植的基于s3c44b0的bootloader源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/**************************************************************
 * ARMSYS-P, LiYuTai elec.
 *
 * MMC Card functions
 ************************************************************/

#include "myfution.h"
#define  MP3_ADDRESS 0xc090000	//存放音乐的起始地址
// unsigned char *MP3Buf;
volatile unsigned int MP3Size=0;
int dataLen;
extern int which_int;
extern int download_addr;
extern EnvParams Env;
//extern  int data_len;

/*************************************************************/
// MMC Init function
//
// - flushes card receive buffer
// - selects card
// - sends the reset command
// - sends the initialization command, waits for card ready
// - queries card status
 /*************************************************************/
void myfution(void)
{
//   while(1)
//   {
//	   Led_Display(0x01);
//	   Delay(1000);
//	   Led_Display(0x02);
//	   Delay(1000);
	   
	   InitPortVS1003();
//	   Mp3Reset();
//	   VsSineTest();
	   Mp3Play();
//       test_1011();
	   
//	}
}



//文件名:vs1003.c
//功能:vs1003 的底层驱动程序,主控芯片为LPC2103;
//     其他的微处理器(带SPI接口的)只需稍加修改即可适用;
//     对于不带硬SPI接口的微处理器可以用IO进行SPI的时序模拟
//     更多代码敬请访问www.icdev.com.cn
 

// #include "vs1003.h"
// #include "timer.h"

extern long volatile timeval; //用于延时的全局变量

/**********************************************************/
/*  函数名称 :   SoftDelay100ns                           */
/*  函数功能 : 延时100NS。               */
/*  参数     :  无                                        */
/*  返回值   :  无                                        */
/*--------------------------------------------------------*/
void  SoftDelay100ns(int ns)
{  
	int i,j;
	for(i=0;i<ns;i++)
	{
	  for(j=0;j<25;j++);  //50还可以听出原声;25还可以,但有间断;
	}
}


/**********************************************************/
/*  函数名称 :  InitPortVS1003                            */
/*  函数功能 : MCU与vs1003接口的初始化                   */
/*  参数     :  无                                        */
/*  返回值   :  无                                        */
/*--------------------------------------------------------*/
void  InitPortVS1003(void)
{
	
//	IODIR &= 0xfffeffff;   //其他接口线的设置,其中dreq 为输入口
//	IODIR |= MP3_XRESET | MP3_XCS | MP3_XDCS;//xRESET,xCS,xDS均为输出口
//	IOSET |= MP3_XRESET | MP3_XCS | MP3_XDCS;//xRESET,xCS,xDS默认输出高电平
	rPDATD= 0xff;
	rPCOND= 0x1115;	
	rPUPD = 0x0;	
}


/**********************************************************/
/*  函数名称 :  SPIPutChar                                */
/*  函数功能 : 通过SPI发送一个字节的数据                 */
/*  参数     :  待发送的字节数据                          */
/*  返回值   :  无                                        */
/*--------------------------------------------------------*/
void  SPIPutChar(unsigned char c)
{      
	// S0SPDR = c;
	// while((S0SPSR & 0x80) == 0);	 //等待SPI将数据发送完毕
	  int i,j;
      for(i=0;i<8;i++)
      {
        MP3_SCLK_L;
      //  _NOP();
      //  SoftDelay100ns(1);
        for(j=0;j<10;j++);
        //delay
        if(c&0X80)
        {
          MP3_SI_H;
        }
        else
        {
          MP3_SI_L;
        }
        c=c<<1;
        MP3_SCLK_H;
        for(j=0;j<10;j++);   //20 不错,可以播放速率300K的歌
      //  SoftDelay100ns(1);
      //  _NOP();
        //delay
      }
      MP3_SI_H;
      //delay
}

/**********************************************************/
/*  函数名称 :  SPIReadChar                                */
/*  函数功能 : 通过SPI读取一个字节的数据                 */
/*  参数     :  无                          */
/*  返回值   :  无                                        */
/*--------------------------------------------------------*/
unsigned short SPIReadChar(void)
{      
	// S0SPDR = c;
	// while((S0SPSR & 0x80) == 0);	 //等待SPI将数据发送完毕
	  int i;
	  unsigned short c;
      for(i=0;i<8;i++)
      {
        c=c<<1;
        MP3_SCLK_H;
        SoftDelay100ns(1);
        if(MP3_SO_IN!=0)
        {
          c|=0x01;
        }
        else
        {
          c&=~0x01;
        }
        MP3_SCLK_L;
        SoftDelay100ns(1);
      }
      c&=0x00ff;
      return (c);
  
}



/**********************************************************/
/*  函数名称 :  Mp3SoftReset                              */
/*  函数功能 : vs1003软件复位                            */
/*  参数     :  无                                        */
/*  返回值   :  无                                        */
/*--------------------------------------------------------*/
void Mp3SoftReset(void)
{
	Mp3WriteRegister (SPI_MODE, 0x08, 0x04); //软件复位

	Delay(10); //延时1ms
	while (MP3_DREQ_IN == 0); //等待软件复位结束
	Mp3WriteRegister(SPI_CLOCKF, 0x98, 0x00);//设置vs1003的时钟,3倍频
	Mp3WriteRegister (SPI_AUDATA, 0xBB, 0x81); //采样率48k,立体声
//	Mp3WriteRegister(SPI_BASS, 0x00, 0x55);//设置重音
	Mp3WriteRegister(SPI_BASS, 0x02, 0x75);
//	vs1011_cmd_write(0x02,0X75);       //BASS
	Mp3SetVolume(10,10);     //Mp3SetVolume(20,20);//设置音量
    	Delay(10); //延时1ms
    	
    	//向vs1003发送4个字节无效数据,用以启动SPI发送
        Mp3SelectData();
        SoftDelay100ns(1);
	SPIPutChar(0);
	SPIPutChar(0);
	SPIPutChar(0);
	SPIPutChar(0);
	SoftDelay100ns(1);
	Mp3DeselectData();

}
/**********************************************************/
/*  函数名称 :  Mp3Reset                                  */
/*  函数功能 : vs1003硬件复位                            */
/*  参数     :  无                                        */
/*  返回值   :  无                                        */
/*--------------------------------------------------------*/
void Mp3Reset(void)
{	
	Mp3PutInReset();//xReset = 0   复位vs1003      
	Delay(1000);//延时100ms
//	SPIPutCharWithoutWaiting(0xff);//发送一个字节的无效数据,启动SPI传输
	Mp3DeselectControl();   //xCS = 1
	SoftDelay100ns(1);
	Mp3DeselectData();     //xDCS = 1
	SoftDelay100ns(1);
	Mp3ReleaseFromReset(); //xRESET = 1
	Delay(1000);            //延时100ms
	while (MP3_DREQ_IN == 0);//等待DREQ为高
    Delay(1000);            //延时100ms
    Mp3SetVolume(10,10);  
    Mp3SoftReset();//vs1003软复位
}


/***********************************************************/
/*  函数名称 :  VsSineTest                                 */
/*  函数功能 : vs1003正弦测试,将该函数放在while循环中,  */
/*              如果能持续听到一高一低的声音,证明测试通过 */                            
/*  参数     :  无                                         */
/*  返回值   :  无                                         */
/*---------------------------------------------------------*/
void VsSineTest(void)
{
	Mp3PutInReset();  //xReset = 0   复位vs1003
	Delay(1000);        //延时100ms        
	SPIPutChar(0xff);//发送一个字节的无效数据,启动SPI传输
	Mp3DeselectControl();
	SoftDelay100ns(1);  
	Mp3DeselectData();
	SoftDelay100ns(1);     
	Mp3ReleaseFromReset(); 
	Delay(1000);	               
 	Mp3WriteRegister(SPI_MODE,0x08,0x20);//进入vs1003的测试模式
	while (MP3_DREQ_IN == 0);     //等待DREQ为高
 	Mp3SelectData();       //xDCS = 0,选择vs1003的数据接口
 	SoftDelay100ns(1);
 	
 	//向vs1003发送正弦测试命令:0x53 0xef 0x6e n 0x00 0x00 0x00 0x00
 	//其中n = 0x24, 设定vs1003所产生的正弦波的频率值,具体计算方法见vs1003的datasheet
    SPIPutChar(0x53);      
	SPIPutChar(0xef);      
	SPIPutChar(0x6e);      
	SPIPutChar(0x3f);      
	SPIPutChar(0x00);      
	SPIPutChar(0x00);
	SPIPutChar(0x00);
	SPIPutChar(0x00);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -