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

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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版