野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 15918|回复: 1

关于两块f4芯片用SPI通信的问题

[复制链接]
发表于 2020-9-24 20:31:03 | 显示全部楼层 |阅读模式
板子上有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);
}


回复

使用道具 举报

发表于 2020-9-25 17:31:49 | 显示全部楼层

回帖奖励 +5 火花

MISO是主机的输入、从机输出,MOSI是从机输入、主机输出,没看到程序配置有配置成输入的
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-5-21 14:59 , Processed in 0.028688 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表