#include "stm32f10x.h"
void RCC_Configuration(void);
void SPI1_Configuration(void);
void GPIO_Configuration(void);
void Delay(void);
void VS_Soft_Reset(void);
void VS_Write(u8 add,u16 data);
u16 VS_Read(u8 add);
void VS_Soft_Reset(void);
void VS_Test(void);
#define VS_DQ GPIOA,GPIO_Pin_1;
#define VS_XDCS GPIOA,GPIO_Pin_4;
#define VS_RST GPIOA,GPIO_Pin_2;
#define VS_XCS GPIOA,GPIO_Pin_3;
#define VS_REG_MODE 0x00
#define VS_REG_CLOCKF 0x03
#define VS_REG_AUDATA 0x05
#define VS_REG_BASS 0x02
#define VS_REG_VOL 0x0B
int main(void)
{
RCC_Configuration();
SPI1_Configuration();
GPIO_Configuration();
VS_Soft_Reset();
while(1)
{
VS_Test();
}
}
void RCC_Configuration(void)
{
SystemInit();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
}
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void SPI1_Configuration(void)
{
/*SPI初始化定义*/
SPI_InitTypeDef SPI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
/*GPIO端口配置 PA6为MISO,浮空输入,PA7为MOSI,复用推挽输出*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7|GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
/*SPI1 端口设置*/
SPI_Cmd(SPI1,DISABLE);
SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex;//SPI设置为全双工
SPI_InitStructure.SPI_Mode=SPI_Mode_Master;//设置为主SPI
SPI_InitStructure.SPI_DataSize=SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL=SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA=SPI_CPHA_2Edge;
SPI_InitStructure.SPI_NSS=SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_4;
SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial=7;
SPI_Init(SPI1,&SPI_InitStructure);
SPI_Cmd(SPI1,ENABLE);
}
void VS_Soft_Reset(void)
{
GPIO_ResetBits(GPIOA,GPIO_Pin_2);//VS_RST=0
Delay();
SPI_I2S_SendData(SPI1,0xff);
GPIO_SetBits(GPIOA,GPIO_Pin_4);//VS_XDCS=1;
GPIO_SetBits(GPIOA,GPIO_Pin_3);//VS_XCS=1;
GPIO_SetBits(GPIOA,GPIO_Pin_2);//VS_RST=1;
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)==0)//VS_DQ=1;
{
VS_Write(0x00,0x0804);
Delay();
Delay();
}
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)==0)//VS_DQ=1;
{
VS_Write(0x03,0x9800);
Delay();
VS_Write(0x05,0xbb81);
Delay();
VS_Write(0x02,0x0055);
Delay();
VS_Write(0x0b,0x2020);
GPIO_ResetBits(GPIOA,GPIO_Pin_4);//VS_XDCS=0;
SPI_I2S_SendData(SPI1,0xff);
SPI_I2S_SendData(SPI1,0xff);
SPI_I2S_SendData(SPI1,0xff);
SPI_I2S_SendData(SPI1,0xff);
}
}
void Delay(void)
{
unsigned long x;
for(x=0;x<0x500;x--);
}
void VS_Write(u8 add,u16 data)
{
while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)==0);
SPI1->CR1|=5<<3;//64分频
GPIO_SetBits(GPIOA,GPIO_Pin_4);//XDCS=1
GPIO_ResetBits(GPIOA,GPIO_Pin_3);//XCS=0
SPI_I2S_SendData(SPI1,0x02);//Send 0x02 choose write COMMAND
SPI_I2S_SendData(SPI1,add);
SPI_I2S_SendData(SPI1,data>>8);
SPI_I2S_SendData(SPI1,data);
GPIO_SetBits(GPIOA,GPIO_Pin_3);//XCS=1
SPI1->CR1|=2<<3;//high speed
}
u16 VS_Read(u8 add)
{
u16 temp=0;
while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)==0);
SPI1->CR1|=5<<3;//64分频
GPIO_SetBits(GPIOA,GPIO_Pin_4);//XDCS=1
GPIO_ResetBits(GPIOA,GPIO_Pin_3);//XCS=0
SPI_I2S_SendData(SPI1,0x03);//send read command 0x03
SPI_I2S_SendData(SPI1,add);
temp=SPI_I2S_ReceiveData(SPI1);
temp=temp<<8;
temp+=SPI_I2S_ReceiveData(SPI1);
GPIO_SetBits(GPIOA,GPIO_Pin_3);//XCS=1
SPI1->CR1|=2<<3;//high speed
return temp;
}
void VS_Test(void)
{
VS_Write(0x00,0x0820);
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)==0)
{
GPIO_ResetBits(GPIOA,GPIO_Pin_4);
GPIO_SetBits(GPIOA,GPIO_Pin_3);
SPI_I2S_SendData(SPI1,0X53);
SPI_I2S_SendData(SPI1,0XEF);
SPI_I2S_SendData(SPI1,0X6E);
SPI_I2S_SendData(SPI1,0X30);
SPI_I2S_SendData(SPI1,0X00);
SPI_I2S_SendData(SPI1,0X00);
SPI_I2S_SendData(SPI1,0X00);
SPI_I2S_SendData(SPI1,0X00);
Delay();
Delay();
Delay();
SPI_I2S_SendData(SPI1,0X45);
SPI_I2S_SendData(SPI1,0X78);
SPI_I2S_SendData(SPI1,0X69);
SPI_I2S_SendData(SPI1,0X74);
SPI_I2S_SendData(SPI1,0X00);
SPI_I2S_SendData(SPI1,0X00);
SPI_I2S_SendData(SPI1,0X00);
SPI_I2S_SendData(SPI1,0X00);
GPIO_SetBits(GPIOA,GPIO_Pin_4);
Delay();
}
}