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

📄 vs1011.c

📁 7s64mp3系统开发软件
💻 C
字号:
/************************************************************/
/*		 VS1011 Code for   AT91SAM7S64						*/
/*				By   pasyong								*/
/*					2006-5									*/
/*				Base IAR 4.30A						*/
/************************************************************/
/*-----------------------------------------------------------------------
硬件连接      VS1011_CMD_CS ---------------PA8
              VS1011_DATA_CS --------------PA9
              VS1011_DATA_REQ  -----------PA10
              VS1011_DATA_REST -----------PA24
-----------------------------------------------------------------------*/
#include "ioat91sam7s64.h"
#define uchar unsigned char
#define uint unsigned int
#define VS1011_CMD_CS     ((unsigned int) 1 << 8)
#define VS1011_DATA_CS    ((unsigned int) 1 << 9)
#define VS1011_DATA_REQ   ((unsigned int) 1 << 10)
#define VS1011_DATA_REST  ((unsigned int) 1 << 24)

void SPI_init(void)
{
*AT91C_PMC_PCER=1<<AT91C_ID_SPI ;
  //PIO外设功能时钟始能

*AT91C_PIOA_PDR|=(AT91C_PA12_MISO|AT91C_PA13_MOSI|AT91C_PA14_SPCK);
//PIO使能引脚的外设功能

*AT91C_PIOA_ASR|=(AT91C_PA12_MISO|AT91C_PA13_MOSI|AT91C_PA14_SPCK);
//外设A分配给SPI外设A功能;

*AT91C_SPI_CR|=AT91C_SPI_SPIEN ;
//允许SPI口
*AT91C_SPI_MR|=(AT91C_SPI_MSTR|AT91C_SPI_PS_FIXED|AT91C_SPI_MODFDIS|AT91C_SPI_DLYBCS);
//主机模式,不分频,固定片选0,禁止错误检测
*AT91C_SPI_CSR=AT91C_SPI_NCPHA|AT91C_SPI_BITS_8|((unsigned int) 0xFF <<  8);

//8位数据,传输完成后片选保持,48M/255分频,为初始化SD卡
}
/*-----------------------------------------------------------------------
PORT_INIT函数
-----------------------------------------------------------------------*/
void vs1011_port_init(void)
{
SPI_init();
*AT91C_PMC_PCER=1<<AT91C_ID_PIOA;
  //PIOA功能时钟使能
*AT91C_PIOA_PER|=VS1011_DATA_CS |VS1011_CMD_CS|VS1011_DATA_REST|VS1011_DATA_REQ;
   //作为I/O使用
*AT91C_PIOA_ODR|=VS1011_DATA_REQ;
  //输入
*AT91C_PIOA_SODR|=VS1011_DATA_REQ;
*AT91C_PIOA_OER|=VS1011_DATA_CS |VS1011_CMD_CS|VS1011_DATA_REST;
  //输出
*AT91C_PIOA_SODR|=VS1011_DATA_CS |VS1011_CMD_CS|VS1011_DATA_REST;
  //输出为高电平
}

void Write_Byte_SPI(unsigned char data)  //SPI发送一个字节的数据
{

  *AT91C_SPI_TDR = data;			// 传送数据到SPI寄存器

    while((*AT91C_SPI_SR&AT91C_SPI_TXEMPTY)==0);  // 等待数据传送完毕
}

unsigned char Read_Byte_SPI(void)             //SPI读一个字节的数据
{
 *AT91C_SPI_TDR = 0xffffffff;	
 while((*AT91C_SPI_SR&AT91C_SPI_TXEMPTY)==0) ;  //等待数据接收完成
 return (*AT91C_SPI_RDR&0xff);

}

void vs1011_cmd_write(uchar address,uint data)
{
*AT91C_PIOA_CODR|=VS1011_DATA_CS;       //MP3_DATA_CS=1;
*AT91C_PIOA_CODR|=VS1011_CMD_CS;        //MP3_CMD_CS=0;
Write_Byte_SPI(0x02);                   //VS1011的写命令

Write_Byte_SPI(address);                 //地址
Write_Byte_SPI(data>>8);
Write_Byte_SPI(data);

*AT91C_PIOA_SODR|=VS1011_CMD_CS;       //MP3_CMD_CS=1;
}

void vs1011_data_write(uchar data)
{
*AT91C_PIOA_CODR|=VS1011_DATA_CS;         //MP3_DATA_CS=0;
Write_Byte_SPI(data);
*AT91C_PIOA_SODR|=VS1011_DATA_CS;         //MP3_DATA_CS=1;
*AT91C_PIOA_SODR|=VS1011_CMD_CS;         //MP3_CMD_CS=1;
}

uint vs1011_read(uchar address)
{
uchar temp1=0;
uint temp=0;
*AT91C_PIOA_SODR|=VS1011_DATA_CS;        //MP3_DATA_CS=1;
*AT91C_PIOA_CODR|=VS1011_CMD_CS;        //MP3_CMD_CS=0;
Write_Byte_SPI(0x03);                   //VS1011的读命令

Write_Byte_SPI(address);                //地址
temp=Read_Byte_SPI();
temp=temp<<8;
temp1=Read_Byte_SPI();
temp=temp|temp1;
*AT91C_PIOA_SODR|=VS1011_CMD_CS;        //MP3_CMD_CS=1;
return temp;
}

void vs1011_init(void)
{
vs1011_cmd_write(0x00,0x0800);           //NEW MODE
vs1011_cmd_write(0x02,0X75);              //BASS
vs1011_cmd_write(0x03,0X9800);            //CLOCK F
vs1011_cmd_write(0x0b,0X0000);             //VOLUME
}

⌨️ 快捷键说明

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