本帖最后由 Ray12345 于 2012-4-20 23:47 编辑
int main(void)
{
u8 u8Result;
u8 u8Length;
u8 *pu8Temp = u8SectorBuf;
u32 u32FileLen = 0;
u32 u32DataCnt = 0;
u32 i,j;
Stm32_Clock_Init(9); //72M
delay_init(72); //延时初始化
uart_init(72, 9600); //设置串口1的波特率
Vs1003_Init(); //Vs1003的初始化
Vs1003SoftReset(); //软复位VS1003
VsRamTest(); //RAM测试
VsSineTest(); //VS1003正弦测试
CH376_Init();
delay_ms(100);
while(1)
{
// SPI1_SetSpeed(SPI1_SPEED_16); //高速,对VS1003B,最大值不能超过36.864/6Mhz,这里设置为4.5M
if(CH376DiskConnect()==USB_INT_SUCCESS) /* 检查U盘是否连接,不支持SD卡 */
{
// LED2 = 0;
USART1_SendByte(0xe3);
if(CH376DiskMount()==USB_INT_SUCCESS) /* 初始化磁盘并测试磁盘是否就绪 */
{
u8Length = CH376ReadBlock(pu8Temp); /*从当前主机端点的接收缓冲区读取数据块,返回长度*/
if (u8Length != 0)
{
CH376DiskQuery((u32 *)pu8Temp); /*查询磁盘剩余空间信息,扇区数*/
strcpy((char*)pu8Temp, "\\风.MP3");
u8Result = CH376FileOpen(pu8Temp); // 打开文件
if (u8Result == USB_INT_SUCCESS)
{
USART1_SendByte(0xe5);
//LED2 = 1;
u32FileLen = CH376GetFileSize(); /* 获取文件大小 */
while (u32DataCnt < u32FileLen)
{
SPI2_SetSpeed(SPI2_SPEED_2);//高速
pu8Temp = u8SectorBuf;
CH376SecRead(pu8Temp, 1, 0); /*以扇区为单位从当前位置读取数据块,不支持SD卡*/
u32DataCnt += 512;
SPI1_SetSpeed(SPI1_SPEED_16); //高速,对VS1003B,设置为4.5M
VS_XDCS = 0; /*VS_XDCS = 0,选择vs1003的数据接口 */
i = 0;
while (i < 512) //循环发送512个字节
{
while (VS_DREQ == 0); //等待DREQ为高
// VS_XDCS = 0;
for (j=0; j<32; j++)
{
SPI1_ReadWriteByte(*pu8Temp++);
}
i += 32;
// VS_XDCS = 1;
}
VS_XDCS = 1; /*VS_XDCS = 1*/
}
}
}
}
}
}
}
/****************SPI1及VS1003端口初始化***********/
void SPI1_Init(void)
{
RCC->APB2ENR|=1<<2; //PORTA时钟使能
RCC->APB2ENR|=1<<12; //SPI1时钟使能
//这里只针对SPI口初始化
GPIOA->CRL&=0X000FFFFF;
GPIOA->CRL|=0XBBB00000;//PA5.6.7复用
GPIOA->ODR|=0X7<<5; //PA5.6.7上拉
SPI1->CR1|=0<<10;//全双工模式
SPI1->CR1|=1<<9; //软件nss管理
SPI1->CR1|=1<<8;
SPI1->CR1|=1<<2; //SPI主机
SPI1->CR1|=0<<11;//8bit数据格式
SPI1->CR1|=1<<1; //空闲模式下SCK为1 CPOL=1
SPI1->CR1|=1<<0; //数据采样从第二个时间边沿开始,CPHA=1
SPI1->CR1|=6<<3; //Fsck=Fcpu/64
// SPI1->CR1|=0<<7; //MSBfirst
SPI1->CR1 &= ~(1<<7); //MSBfirst
// SPI1->CR1|=1<<13; //CRC 计算多项式
SPI1->CR1|=1<<6; //SPI设备使能
SPI1_ReadWriteByte(0xff);//启动传输
}
/*****************************SPI2及CH376端口初始化*************************************/
void SPI2_Init(void)
{
RCC->APB2ENR|=1<<3; //PORTB时钟使能
RCC->APB2ENR|=1<<5; //PORTD时钟使能
RCC->APB1ENR|=1<<14; //SPI2时钟使能
/*CH376端口初始化*/
// GPIOD->CRL &= 0XF0FF0FFF; //(SCS)PD3推挽输出 (INT#)PD6输入
// GPIOD->CRL |= 0X08003000;
// GPIOD->ODR |= 1 << 6;
GPIOD->CRH &= 0XFF00FFFF; //(SCS)PD12推挽输出 (INT#)PD13输入
GPIOD->CRH |= 0X00430000;
GPIOD->ODR|=1<<12;
//这里只针对SPI2口初始化
GPIOB->CRH&=0X000FFFFF;
GPIOB->CRH|=0XBBB00000;//PB.13,PB.14,PB.15复用
// GPIOB->ODR|=1<<14; //PB.14上拉
GPIOB->ODR|=7<<13; //PB.14上拉
SPI2->CR1|=0<<10;//全双工模式
SPI2->CR1|=1<<9; //软件nss管理
SPI2->CR1|=1<<8;
SPI2->CR1|=1<<2; //SPI主机
SPI2->CR1|=0<<11;//8bit数据格式
SPI2->CR1 |= 0<<0; //数据采样从第一个时间边沿开始,CPHA=0
SPI2->CR1 &= ~(1<<1); //空闲模式下SCK为0,所以此位CPOL=0
SPI2->CR1|=1<<3; //Fsck=Fcpu/4
SPI2->CR1 &= ~(1<<7); //MSBfirst
// SPI2->CR1|=0<<7; //MSBfirst
SPI2->CR1|=1<<13; //CRC 计算多项式
SPI2->CR1|=1<<6; //SPI设备使能
SPI2_ReadWriteByte(0xff);//启动传输
} |