📄 vs1011.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 + -