你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

调试了两天了stm32f373中SPI3的一直卡死在发送区非空,求救!

[复制链接]
haocheng996 提问时间:2019-5-9 08:54 /
调试了两天了,stm32f373用官方固件库配置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最近接收的数据

}

收藏 评论12 发布时间:2019-5-9 08:54

举报

12个回答
songshiqun2010 回答时间:2019-5-9 09:15:49
   SPI_Init(SPI3, &SPI_InitStruc);    //初始化结构体

    SPI_RxFIFOThresholdConfig(SPI3, SPI_RxFIFOThreshold_QF);

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

    W25Q32_CS_H;
}


在这个位置加一句SPI3发送0xFF,如下代码,试试。
  1.    SPI_Init(SPI3, &SPI_InitStruc);    //初始化结构体

  2.     SPI_RxFIFOThresholdConfig(SPI3, SPI_RxFIFOThreshold_QF);

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

  4.     W25Q32_CS_H;
  5.     SPI_SendData8(SPI3, 0xFF);
  6. }
复制代码

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

haocheng996 回答时间:2019-5-9 09:29:15
不行,发送缓冲区还是一直为非空状态
澜月亮 回答时间:2019-5-9 09:51:16
调用此函数SPI3_ReadWriteByte发送数据前片选拉低了吗?给的代码有限看不出来有啥问题

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

haocheng996 回答时间:2019-5-9 09:58:24
//读 W25Q32 的 FLSH ID
u16 W25Q32_ReadID(void)
{
    u16 Temp = 0;

    W25Q32_CS_L;

    SPI3_ReadWriteByte(W25X_ManufactDeviceID); //0X90
    SPI3_ReadWriteByte(DUMMY);
    SPI3_ReadWriteByte(DUMMY);
    SPI3_ReadWriteByte(DUMMY);

    Temp |= SPI3_ReadWriteByte(0XFF) << 8;
    Temp |= SPI3_ReadWriteByte(0xFF);

    W25Q32_CS_H;

    return Temp;
}

然后在主程序中:
while(1)
{
    flag = W25Q32_ReadID();
}
zoomdy 回答时间:2019-5-9 15:21:02
对照参考手册,检查 SPI3的寄存器是不是配置正确

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

edmundlee 回答时间:2019-5-9 15:32:51
这种情况, 不外乎几个原因
一 spi时钟没Enable
二 spi 没便能
三 spi_tx没使能
在寄存器确认以上三条就应该可以把问题找出来了
别看自己的代码写了什么, 要看在寄存器里有什么, 这才是调试。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

songshiqun2010 回答时间:2019-5-9 16:24:04
//初始化SPI3  时钟
    RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI3, ENABLE);


这个是复位时钟吧,使能在哪里?
tanic 回答时间:2019-5-9 17:23:37
MOSI  MISO 引脚上啦

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

haocheng996 回答时间:2019-5-10 09:56:27
songshiqun2010 发表于 2019-5-9 16:24
这个是复位时钟吧,使能在哪里?

确实是这条语句错了,这是复位 SPI3 的时钟不是使能SPI3时钟,使能是这条语句 RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE);

谢谢你的回答
12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版