stm32 与VS1003的接口设置
第一点,STM32的端口设置,设置为SCK和MOSI复用推挽,而片选设为推挽输出即可,MISO设为input floating即可。
第二点,因为VS1003控制寄存器是八位数据读写的,所以STM32需要设置发送和接收数据也是八位的。
第三点,根据VS1003的时序关系,需要设置STM32的时钟信号的相位和极性为CPOL为0,CPHA为0。
第四点,NSS模式需要设置软件模式,这样就可以利用另作他用了,可以用GPIO口控制作为片选了。
这里贴一下源码void SPI1_Init(void)
{
SPI_InitTypeDef SPIStruct_Init;
SPIStruct_Init.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //配置SPI为全双工模式
SPIStruct_Init.SPI_Mode = SPI_Mode_Master; //配置SPI为主模式
SPIStruct_Init.SPI_DataSize = SPI_DataSize_8b; //配置SPI为8位数据传送
SPIStruct_Init.SPI_CPOL = SPI_CPOL_Low; //配置CPOL为低
SPIStruct_Init.SPI_CPHA = SPI_CPHA_1Edge; //配置CPHA为第一个上升沿
SPIStruct_Init.SPI_NSS = SPI_NSS_Soft; //配置NSS为软件控制
SPIStruct_Init.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4; //配置SPI时钟预分频
SPIStruct_Init.SPI_FirstBit = SPI_FirstBit_MSB; //配置传输字节高位在前
SPIStruct_Init.SPI_CRCPolynomial = 7; //配置CRC,可不用理
SPI_Init(SPI1,&SPIStruct_Init); //SPI初始化函数
SPI_Cmd(SPI1, ENABLE); //使能SPI
}
void Mp3WriteRegister(uint8_t addressbyte,uint8_t high,uint8_t low)
{
Mp3DeselectData(); //释放数据端口
Mp3SelectControl(); //选择控制端口
while(!SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE)); //判断发送缓冲器是否为空
SPI_I2S_SendData(SPI1,VS_WRITE_COMMAND); //发送写寄存器命令
while(!SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE));
SPI_I2S_SendData(SPI1, addressbyte); //发送寄存器的地址
while(!SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE));
SPI_I2S_SendData(SPI1, high); //发送参数的高八位
while(!SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE));
SPI_I2S_SendData(SPI1, low); //发送参数的低八位
Mp3DeselectControl();
}
/*************************************************************/
/* 函数名称 : CheckVS1003B_DRQ(void) */
/* 函数功能 : 判断DREQ引脚状态 */
/*-----------------------------------------------------------*/
bool CheckVS1003B_DRQ(void)
{
bool bResult;
bResult =GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_4);
return(bResult);
}
|
这个芯片是哪个公司的,有没有公司的网址链接