小学生
最后登录1970-1-1
在线时间 小时
注册时间2020-8-1
|
板子上有F407和F405两块芯片,其中407的SPI1的GPIO口与405的SPI3连接。我想用SPI进行通信,从机发送数据到主机然后主机串口打印,但是好几天了一点现象没有。
已经改过很多次了,但是一点现象也没有(串口连个乱码都不打印),我想我肯定有一些我疏忽的错误,特来求大家指出。
主机 主函数
uint16_t SPI1_Rx;
int main(void)
{
USART_Config();
SPI1_Init();
printf("SPI主机接收测试");
while(1)
{
SPI_FLASH_CS_LOW();
SPI1_Rx = SPI1_SendByte(0xaa);
SPI_FLASH_CS_HIGH();
printf("%d",SPI1_Rx);
SysTick_Delay_ms(1000);
}
}
SPI1配置
#include "spi.h"
static void SPI1_GPIO_Config(void)
{
GPIO_InitTypeDef SPI_GPIO_InitStructure;
/* 使能 SPI1 相关引脚的时钟 */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
GPIO_PinAFConfig(GPIOA, SPI_SCK_GPIO_PIN, GPIO_AF_SPI1);
GPIO_PinAFConfig(GPIOA, SPI_MISO_GPIO_PIN, GPIO_AF_SPI1);
GPIO_PinAFConfig(GPIOA, SPI_MOSI_GPIO_PIN, GPIO_AF_SPI1);
SPI_GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //SCLK时钟为复用推挽输出
SPI_GPIO_InitStructure.GPIO_Pin = SPI_SCK_GPIO_PIN; //SCL -PA5
SPI_GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
SPI_GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
SPI_GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(SPI_SCK_GPIO_PORT, &SPI_GPIO_InitStructure);
SPI_GPIO_InitStructure.GPIO_Pin = SPI_MOSI_GPIO_PIN; //MOSI - PA6
GPIO_Init(SPI_MOSI_GPIO_PORT, &SPI_GPIO_InitStructure);
SPI_GPIO_InitStructure.GPIO_Pin = SPI_MISO_GPIO_PIN; //MISO - PA7
GPIO_Init(SPI_MISO_GPIO_PORT, &SPI_GPIO_InitStructure);
/*!< 配置 SPI_FLASH_SPI 引脚: CS */
SPI_GPIO_InitStructure.GPIO_Pin = SPI_CS_GPIO_PIN;
SPI_GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_Init(SPI_CS_GPIO_PORT, &SPI_GPIO_InitStructure);
/* 停止信号 FLASH: CS引脚高电平*/
SPI_FLASH_CS_HIGH();
}
static void SPI1_Mode_Config(void)
{
SPI_InitTypeDef SPI_InitStructure;
/* 使能外设 SPI1 的时钟 */
RCC_SPI_ClockCmd(RCC_SPI1_CLK, ENABLE);
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //全双工模式
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //模式 3
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //软件控制CS引脚
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
/* 初始化配置 */
SPI_Init(SPIx, &SPI_InitStructure);
/* 使能外设 SPI1 */
SPI_Cmd(SPIx, ENABLE);
}
void SPI1_Init(void)
{
SPI1_GPIO_Config();
SPI1_Mode_Config();
}
uint8_t SPI1_SendByte(uint8_t byte)
{
/* 等待发送缓冲区为空,TXE事件 */
while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE) == RESET);
/* 写入数据寄存器,把要写入的数据写入发送缓冲区 */
SPI_I2S_SendData(SPIx, byte);
/* 等待接收缓冲区非空,RXNE事件 */
while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE) == RESET);
/* 读取数据寄存器,获取接收缓冲区数据 */
return SPI_I2S_ReceiveData(SPIx);
}
从机 主函数
uint16_t SPI1_Tx;
int main(void)
{
SPIx_Init();
USART_Config();
LED_GPIO_Config();
SPI_FLASH_CS_LOW();
SPI_SendByte(99);
SPI_FLASH_CS_HIGH();
while (1)
{
}
}
从机 SPI3配置
#include "spi.h"
static void SPI_GPIO_Config(void)
{
GPIO_InitTypeDef SPI_GPIO_InitStructure;
/* 使能 SPI1 相关引脚的时钟 */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
GPIO_PinAFConfig(GPIOC, SPI_SCK_GPIO_PIN, GPIO_AF_SPI3);
GPIO_PinAFConfig(GPIOC, SPI_MISO_GPIO_PIN, GPIO_AF_SPI3);
GPIO_PinAFConfig(GPIOC, SPI_MOSI_GPIO_PIN, GPIO_AF_SPI3);
SPI_GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //SCLK时钟为复用推挽输出
SPI_GPIO_InitStructure.GPIO_Pin = SPI_SCK_GPIO_PIN; //SCL -PA5
SPI_GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
SPI_GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
SPI_GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(SPI_SCK_GPIO_PORT, &SPI_GPIO_InitStructure);
SPI_GPIO_InitStructure.GPIO_Pin = SPI_MOSI_GPIO_PIN; //MOSI - PA6
GPIO_Init(SPI_MOSI_GPIO_PORT, &SPI_GPIO_InitStructure);
SPI_GPIO_InitStructure.GPIO_Pin = SPI_MISO_GPIO_PIN; //MISO - PA7
GPIO_Init(SPI_MISO_GPIO_PORT, &SPI_GPIO_InitStructure);
/*!< 配置 SPI_FLASH_SPI 引脚: CS */
SPI_GPIO_InitStructure.GPIO_Pin = SPI_CS_GPIO_PIN;
SPI_GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_Init(SPI_CS_GPIO_PORT, &SPI_GPIO_InitStructure);
/* 停止信号 FLASH: CS引脚高电平*/
SPI_FLASH_CS_HIGH();
}
static void SPI_Mode_Config(void)
{
SPI_InitTypeDef SPI_InitStructure;
/* 使能外设 SPI1 的时钟 */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE);
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //全双工模式
SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //模式 3
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //软件控制CS引脚
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
/* 初始化配置 */
SPI_Init(SPIx, &SPI_InitStructure);
/* 使能外设 SPI1 */
SPI_Cmd(SPIx, ENABLE);
}
void SPIx_Init(void)
{
SPI_GPIO_Config();
SPI_Mode_Config();
}
uint8_t SPI_SendByte(uint8_t byte)
{
/* 等待发送缓冲区为空,TXE事件 */
while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE) == RESET);
/* 写入数据寄存器,把要写入的数据写入发送缓冲区 */
SPI_I2S_SendData(SPIx, byte);
/* 等待接收缓冲区非空,RXNE事件 */
while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE) == RESET);
/* 读取数据寄存器,获取接收缓冲区数据 */
return SPI_I2S_ReceiveData(SPIx);
}
|
|