OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3243|回复: 2

stm32f373中SPI3的配置问题

[复制链接]

1

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2019-4-26
在线时间
14 小时
发表于 2019-5-6 17:51:37 | 显示全部楼层 |阅读模式
2金钱
那个大佬可以帮我看看我的SPI3配置还差什么,或者哪里出了问题, 程序一直卡在 while (SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE) == RESET) 这条语句中



void SPI_FLASH_Iint()
{
    GPIO_InitTypeDef  GPIO_InitStruc;
    SPI_InitTypeDef   SPI_InitStruc;

    //初始化GPIOC 时钟
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);

    //初始化GPIOA 时钟
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);

    //初始化SPI3  时钟
    RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI3, ENABLE);

    //配置复用引脚
    GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_6);  
    GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_6);
    GPIO_PinAFConfig(GPIOC, GPIO_PinSource12, GPIO_AF_6);

    GPIO_InitStruc.GPIO_Pin   = GPIO_Pin_10| GPIO_Pin_11| GPIO_Pin_12;
    GPIO_InitStruc.GPIO_Mode  = GPIO_Mode_AF;
    GPIO_InitStruc.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStruc.GPIO_Speed = GPIO_Speed_Level_3;
    GPIO_InitStruc.GPIO_PuPd  = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOC, &GPIO_InitStruc);

    GPIO_InitStruc.GPIO_Pin   = SPI_FLASH_CS;              //片选引脚  PA15 -- 片选引脚
    GPIO_InitStruc.GPIO_Mode  = GPIO_Mode_OUT;             //输出模式
    GPIO_Init(GPIOA, &GPIO_InitStruc);

    SPI_I2S_DeInit(SPI3);
    SPI_InitStruc.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;           //设置为2分频(速度最快)
    SPI_InitStruc.SPI_CPHA              = SPI_CPOL_High;                     //设置时钟极性
    SPI_InitStruc.SPI_CPOL              = SPI_CPHA_2Edge;                    //设置时钟相位, 选择第几个时钟跳变沿数据被采样
    SPI_InitStruc.SPI_CRCPolynomial     = 7;                                 //设置 CRC 校验多项式,提高通信可靠性,大于 1 即可
    SPI_InitStruc.SPI_DataSize          = SPI_DataSize_8b;                   //数据为 8 位还是 16 位帧格式选择项
    SPI_InitStruc.SPI_Direction         = SPI_Direction_2Lines_FullDuplex;   //SPI设置为双线双向全双工
    SPI_InitStruc.SPI_FirstBit          = SPI_FirstBit_MSB;                  //设置数据传输是 MSB 还是 LSB (MSB 高位在前)
    SPI_InitStruc.SPI_Mode              = SPI_Mode_Master;                   //设置SPI的主从模式(这里是主模式)
    SPI_InitStruc.SPI_NSS               = SPI_NSS_Soft;                      //设置 NSS 信号由硬件(NSS 管脚)还是软件控制 (这里是软件控制)
    SPI_Init(SPI3, &SPI_InitStruc);    //初始化结构体

    SPI_RxFIFOThresholdConfig(SPI3, SPI_RxFIFOThreshold_QF);

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

    W25Q32_CS_H;
}



u16 SPI3_ReadWriteByte(u8 TxData)
{
    SPITimeout = SPIT_FLAG_TIMEOUT;

    //等待发送区空
    while (SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE) == RESET)
    {
        if ((SPITimeout--) == 0) return SPI_TIMEOUT_UserCallback(0);
    }

    SPI_SendData8(SPI3, TxData);          //通过外设SPIx发送一个 byte 数据

    //重新装载超时值
    SPITimeout = SPIT_FLAG_TIMEOUT;

    //等待接收完一个byte
    while (SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_RXNE) == RESET)   
    {
        if ((SPITimeout--) == 0) return SPI_TIMEOUT_UserCallback(1);
    }

    return SPI_ReceiveData8(SPI3);         //返回通过SPIx最近接收的数据

}

最佳答案

查看完整内容[请看2#楼]

问题已经找到了 , 是使能是时钟的语句写错了,写成复位的语句了 正确的是这样: RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE);
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2019-4-26
在线时间
14 小时
 楼主| 发表于 2019-5-6 17:51:38 | 显示全部楼层
问题已经找到了 , 是使能是时钟的语句写错了,写成复位的语句了
正确的是这样: RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE);
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165508
金钱
165508
注册时间
2010-12-1
在线时间
2115 小时
发表于 2019-5-8 02:37:03 | 显示全部楼层
帮顶
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-15 07:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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