STM32F407VET6 SPI2

2019-07-20 12:01发布


使用STM32F407VET6时,使用SPI2时,程序卡在SPI_WR函数中。SPI的4中模式全部试了,不行,求各位大神指导!

#define RES          GPIO_Pin_0  //-----PB0----35
#define SS           GPIO_Pin_1        //----PB1----36
#define SCLK           GPIO_Pin_10 //----PB10---47

#define MISO          GPIO_Pin_1  //---PC2----17
#define MOSI          GPIO_Pin_3  //---PC3----18

void SPI2_Init(void)
{                 
        GPIO_InitTypeDef  GPIO_InitStructure;
        SPI_InitTypeDef  SPI_InitStructure;

        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB |RCC_AHB1Periph_GPIOC, ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);//使能SPI2时钟
       
        //RES
        GPIO_InitStructure.GPIO_Pin = RES;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
        GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化
       

        //SCLK初始化设置
        GPIO_InitStructure.GPIO_Pin = SCLK;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//100MHz
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
        GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化
       
        //MISO、MOSI
        GPIO_InitStructure.GPIO_Pin = MISO | MOSI;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//100MHz
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
        GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化

        GPIO_PinAFConfig(GPIOB,SCLK,GPIO_AF_SPI2); //PB3复用为 SPI2
        GPIO_PinAFConfig(GPIOC,MISO,GPIO_AF_SPI2); //PB4复用为 SPI2
        GPIO_PinAFConfig(GPIOC,MOSI,GPIO_AF_SPI2); //PB5复用为 SPI2


        //这里只针对SPI口初始化
        RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2,ENABLE);//复位SPI2
        RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2,DISABLE);//停止复位SPI2

        SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工
        SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                //设置SPI工作模式:设置为主SPI
        SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                //设置SPI的数据大小:SPI发送接收8位帧结构
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;                //串行同步时钟的空闲状态为低电平
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;        //串行同步时钟的第一个跳变沿(上升或下降)数据被采样
        SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;                //定义波特率预分频的值:波特率预分频值为256
        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;        //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
        SPI_InitStructure.SPI_CRCPolynomial = 7;        //CRC值计算的多项式
        SPI_Init(SPI2, &SPI_InitStructure);  //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器

        SPI_Cmd(SPI2, ENABLE); //使能SPI外设       
}



//SPI2 读写一个字节
//TxData:要写入的字节
//返回值:读取到的字节
unsigned char SPI_WR(unsigned char TxData)
{                                          
        while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET){}//等待发送区空  
        SPI_I2S_SendData(SPI2, TxData); //通过外设SPIx发送一个byte  数据
        while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET){} //等待接收完一个byte  
        return SPI_I2S_ReceiveData(SPI2); //返回通过SPIx最近接收的数据                                    
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
正点原子
1楼-- · 2019-07-20 16:47
 精彩回答 2  元偷偷看……
快乐之路
2楼-- · 2019-07-20 16:56
正点原子 发表于 2017-8-31 01:02
驱动什么东西

驱动W5500网络芯片,之前使用过飞思卡尔单片机驱动过W5500网络芯片。把程序移植到stm32中发现SPI现在无法通信
STM32初学~zy
3楼-- · 2019-07-20 18:03
 精彩回答 2  元偷偷看……

一周热门 更多>