该如何使用STM8L的硬件SPI去驱动VS1003B?这个问题分两部分来思考,一是STM8L的SPI部分该如何配置以及与VS1003B相连的控制管脚该如何配置,二是关于VS1003B的时序以及指令使用。
由于STM8L的SPI部分与VS1003B的SPI部分进行相互通信,先看看VS1003B的SPI特性,才能对STM8L进行配置。
在VS1003B中SPI模式定义如下:
其中XDCS为发送MP3数据是的芯片控制管脚,XCS为发送VS1003B指令的控制管脚,在手册中亦有对SPI通信速度的说明,见下图:
上图中CLKI在手册中为:36.864Mhz
故上面SPI的通信速率在6.144MHz-9.216MHz之间,但在本例中根据6.144MHz来配置,在STM8L中主频最高为16MHz,故可以4分频得到4M的SPI速率,但在实际测试中,发现4分频后通信有时会失败,于是改为8分频降低通信速率,故SPI以及VS1003的控制管脚的配置如下: [cpp] view plain copy
- CLK_PeripheralClockConfig(CLK_Peripheral_SPI1, ENABLE);
- //SPI_CLOCK:PB5, SPI_MOSI: PB6, SPI_MISO: PB7
- GPIO_Init(GPIOB, GPIO_Pin_5, GPIO_Mode_Out_PP_High_Fast);
- GPIO_Init(GPIOB, GPIO_Pin_6, GPIO_Mode_Out_PP_High_Fast);
- //主机模式,配置为输入
- GPIO_Init(GPIOB, GPIO_Pin_7, GPIO_Mode_In_PU_No_IT);
- /* 初始化SPI */
- SPI_Init(SPI1, SPI_FirstBit_MSB, SPI_BaudRatePrescaler_8, SPI_Mode_Master,\
- SPI_CPOL_Low, SPI_CPHA_1Edge, \
- SPI_Direction_2Lines_FullDuplex, SPI_NSS_Soft, 0x07);
- SPI_Cmd(SPI1, ENABLE); /* 使能SPI */
- /* 输入 */
- GPIO_Init(VS_1003_DREQ_PORT, VS_1003_DREQ_PIN, GPIO_Mode_In_PU_No_IT);
- GPIO_Init(VS_1003_XRST_PORT, VS_1003_XRST_PIN, GPIO_Mode_Out_PP_High_Fast);
- /* 推挽输出 */
- GPIO_Init(VS_1003_XDCS_PORT, VS_1003_XDCS_PIN, GPIO_Mode_Out_PP_High_Fast);
- /* 推挽输出 */
- GPIO_Init(VS_1003_XCS_PORT, VS_1003_XCS_PIN, GPIO_Mode_Out_PP_High_Fast);
当数据总线传送的是指令数据时,此时的通信协议在VS1003B中称为SCI,该协议的发送时序图如下:
|