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

STM32F030 CubeMX中SPI的问题。

[复制链接]
laphy122221 提问时间:2018-6-23 10:26 /
最近用上了F030,在使用SPI的时候出现了一个问题,主模式中断读SX1276,一字节读没问题。两字节以上就直接进hardfault:void Sx1276_ReadNbytes(uint8_t addr, uint8_t *buffer, uint8_t size)
{
        uint8_t SendData=addr&0x7f;
        uint8_t i=0;
        RF_CS0;  
        HAL_SPI_Transmit_IT(&hspi1,&SendData,1);
        while (HAL_SPI_GetState(&hspi1) != HAL_SPI_STATE_READY);
//       HAL_SPI_Receive_IT(&hspi1,buffer,size);                                    
//       while (HAL_SPI_GetState(&hspi1) != HAL_SPI_STATE_READY);
        for(i=0;i<size;i++)
        {
                HAL_SPI_Receive_IT(&hspi1,buffer++,1);
                while (HAL_SPI_GetState(&hspi1) != HAL_SPI_STATE_READY);
        }
        RF_CS1;  
}

上面程序注释部分是一次读多字节,这样会进hardfault,下面未注释的是一次读一字节,没有问题。
经过调试发现出问题在下面这个地方。

/* Check if packing mode is enabled and if there is more than 2 data to receive */
  if ((hspi->Init.DataSize > SPI_DATASIZE_8BIT) || (hspi->RxXferCount >= 2U))
  {
    /* Set fiforxthresold according the reception data length: 16 bit */
    CLEAR_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD);        //运行到此处,立马进hardfault。
  }
  else
  {
    /* Set fiforxthresold according the reception data length: 8 bit */
    SET_BIT(hspi->Instance->CR2, SPI_RXFIFO_THRESHOLD);
  }


以前用L1都没有问题。有谁对F0比较熟的,能指点下是什么问题么,另外用了freeRTOS.

收藏 评论8 发布时间:2018-6-23 10:26

举报

8个回答
废鱼 回答时间:2018-6-23 10:36:18
楼主Sx1276_ReadNbytes入口的指针数组大小是多少?是否读取个数超出了这个数组。

评分

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

查看全部评分

laphy122221 回答时间:2018-6-23 10:39:37
安 发表于 2018-6-23 10:36
楼主Sx1276_ReadNbytes入口的指针数组大小是多少?是否读取个数超出了这个数组。 ...

不会超,100多的buffer,我试过只读2字节都有问题。
uint8_t SX1276Regs[0x70];  
Sx1276_ReadNbytes(REG_LR_OPMODE,&SX1276Regs[1],(0x70-1));
废鱼 回答时间:2018-6-23 13:30:19
HAL_SPI_Receive_IT,是不是这里用错了。你应该用不带IT的?
laphy122221 回答时间:2018-6-23 14:23:43
安 发表于 2018-6-23 13:30
HAL_SPI_Receive_IT,是不是这里用错了。你应该用不带IT的?

没错啊,是这样用的,中断方式接收,接收1个字节都是可以的,大于等于2个字节的设置跟一个字节的设置的区别就在CR2寄存器的 FRXTH位清0或者置位,现在看来置位没问题,一清0就hardfault.
七哥 回答时间:2018-6-23 23:04:19
把完整的中煌初始化和中断服务程序发出来吧。
一般情况是用法不对,这么成熟的片片,官方不至于不知道有BUG吧。我初始认为,首先得从自身找问题。

评分

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

查看全部评分

laphy122221 回答时间:2018-6-25 15:52:20
toofree 发表于 2018-6-23 23:04
把完整的中煌初始化和中断服务程序发出来吧。
一般情况是用法不对,这么成熟的片片,官方不至于不知道有BUG ...

CubeMX生成的代码,没有使用中断回调函数,能贴的已经完全贴出来了。
中断和初始化代码都是CubeMX自己生成的,没动过。
废鱼 回答时间:2018-6-27 09:28:39
HAL_SPI_Receive_IT(&hspi1,buffer++,1);你的用法也是有问题的。这里可以直接写多个地址。
HAL_SPI_Receive_IT(&hspi1,buffer,20);

评分

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

查看全部评分

dreamfly239 回答时间:2018-6-28 08:36:57
谢谢分享

评分

参与人数 1ST金币 -2 收起 理由
zero99 -2 再次警告

查看全部评分

所属标签

相似问题

官网相关资源

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