一、硬件介绍
本项目一共使用两个SPI,一个SPI用来给打印机传输数据,一个SPI用来驱动W25Q64读取字库信息。
![image.png](//file.elecfans.com/web2/M00/92/53/poYBAGPx39SANmd5AAAU44QrU0Y346.png)
![image.png](//file.elecfans.com/web2/M00/92/D6/pYYBAGPx39uAezKpAACMxs7z0LU583.png)
引脚关系如下:
DI--》PB15
SCLK--》PB13
CS--》PA4
SCLK--》PA5
MISO--》PA6
MOSI--》PA7
二、软件部分
void bsp_spi1_gpioConfig(void)
{
GPIO_InitType GPIO_InitStructure;
RCC_EnableAPB2PeriphClk(BSP_SPI1_GPIO_RCU, ENABLE);
GPIO_InitStruct(&GPIO_InitStructure);
GPIO_InitStructure.Pin = BSP_SPI1_SCK_PIN;
GPIO_InitStructure.GPIO_Alternate = GPIO_AF0_SPI1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitPeripheral(BSP_SPI1_SCK_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = BSP_SPI1_MISO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Input;
GPIO_InitPeripheral(BSP_SPI1_MISO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = BSP_SPI1_MOSI_PIN;
GPIO_InitStructure.GPIO_Alternate = GPIO_AF0_SPI1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitPeripheral(BSP_SPI1_MOSI_PORT, &GPIO_InitStructure);
}
void bsp_spi1_spiConfig(void)
{
SPI_InitType SPI_InitStructure;
RCC_ConfigPclk2(RCC_HCLK_DIV2);
RCC_EnableAPB2PeriphClk(BSP_SPI1_RCU|RCC_APB2_PERIPH_AFIO, ENABLE);
SPI_InitStructure.DataDirection = SPI_DIR_DOUBLELINE_FULLDUPLEX;
SPI_InitStructure.SpiMode = SPI_MODE_MASTER;
SPI_InitStructure.DataLen = SPI_DATA_SIZE_8BITS;
SPI_InitStructure.CLKPOL = SPI_CLKPOL_LOW;
SPI_InitStructure.CLKPHA = SPI_CLKPHA_FIRST_EDGE;
SPI_InitStructure.NSS = SPI_NSS_SOFT;
SPI_InitStructure.BaudRatePres = SPI_BR_PRESCALER_256;
SPI_InitStructure.FirstBit = SPI_FB_MSB;
SPI_InitStructure.CRCPoly = 7;
SPI_Init(SPI1, &SPI_InitStructure);
SPI_Enable(SPI1, ENABLE);
}
uint8_t bsp_spi1_readWriteByte(uint8_t byte)
{
while (SPI_I2S_GetStatus(SPI1, SPI_I2S_TE_FLAG) == RESET);
SPI_I2S_TransmitData(SPI1, byte);
while (SPI_I2S_GetStatus(SPI1, SPI_I2S_RNE_FLAG) == RESET);
return SPI_I2S_ReceiveData(SPI1);
}
void bsp_spi2_gpioConfig(void)
{
GPIO_InitType GPIO_InitStructure;
RCC_EnableAPB2PeriphClk(BSP_SPI2_GPIO_RCU, ENABLE);
GPIO_InitStruct(&GPIO_InitStructure);
GPIO_InitStructure.Pin = BSP_SPI2_SCK_PIN;
GPIO_InitStructure.GPIO_Alternate = GPIO_AF0_SPI2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitPeripheral(BSP_SPI2_SCK_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = BSP_SPI2_MISO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Input;
GPIO_InitPeripheral(BSP_SPI2_MISO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = BSP_SPI2_MOSI_PIN;
GPIO_InitStructure.GPIO_Alternate = GPIO_AF0_SPI2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitPeripheral(BSP_SPI2_MOSI_PORT, &GPIO_InitStructure);
}
void bsp_spi2_spiConfig(void)
{
SPI_InitType SPI_InitStructure;
RCC_EnableAPB2PeriphClk(BSP_SPI2_RCU|RCC_APB2_PERIPH_AFIO, ENABLE);
SPI_InitStructure.DataDirection = SPI_DIR_DOUBLELINE_FULLDUPLEX;
SPI_InitStructure.SpiMode = SPI_MODE_MASTER;
SPI_InitStructure.DataLen = SPI_DATA_SIZE_8BITS;
SPI_InitStructure.CLKPOL = SPI_CLKPOL_HIGH;
SPI_InitStructure.CLKPHA = SPI_CLKPHA_SECOND_EDGE;
SPI_InitStructure.NSS = SPI_NSS_SOFT;
SPI_InitStructure.BaudRatePres = SPI_BR_PRESCALER_256;
SPI_InitStructure.FirstBit = SPI_FB_MSB;
SPI_InitStructure.CRCPoly = 7;
SPI_Init(SPI2, &SPI_InitStructure);
SPI_Enable(SPI2, ENABLE);
}
uint8_t bsp_spi2_readWriteByte(uint8_t byte)
{
while (SPI_I2S_GetStatus(SPI2, SPI_I2S_TE_FLAG) == RESET);
SPI_I2S_TransmitData(SPI2, byte);
while (SPI_I2S_GetStatus(SPI2, SPI_I2S_RNE_FLAG) == RESET);
return SPI_I2S_ReceiveData(SPI2);
}
三、效果
在上面使能了SPI1和SPI2之后,我们可以进行简单的测试,发送一两个字节的数据,然后用逻辑分析仪抓取看看数据是否移植。
|