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

想用SPI从模式,总是调不成功

[复制链接]
any012 提问时间:2016-5-12 15:52 /
悬赏5ST金币已解决
本帖最后由 any012 于 2016-5-12 15:54 编辑

想用stm32作为spi的从设备,用的是spi2,spi2接收中断后,将接收到的数通过串口发送出来。
结果调不通,请大家帮看下是哪里设置错了?用示波器测量SCK和MOSI管脚,是有波形的。

SPI设置部分:
  1. void SPI2_Init(void)
  2. {
  3.         GPIO_InitTypeDef GPIO_InitStructure;
  4.         SPI_InitTypeDef SPI_InitStructure;
  5.         
  6.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
  7.         RCC_APB2PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
  8.         
  9.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_14;                //PB12 - SPI2_CS, PB14 - SPI2_MISO
  10.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  11.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  12.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  13.         
  14.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_15;                //PB13 - SPI2_SCK, PB15 - SPI2_MOSI
  15.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  16.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  17.         
  18.         SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
  19.         SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;
  20.         SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
  21.         SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
  22.         SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
  23.         SPI_InitStructure.SPI_NSS =SPI_NSS_Soft;
  24.         SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
  25.         SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  26.         SPI_InitStructure.SPI_CRCPolynomial = 7;
  27.         SPI_Init(SPI2, &SPI_InitStructure);
  28.         
  29.         SPI_I2S_ITConfig(SPI2, SPI_I2S_IT_RXNE, ENABLE);
  30.         SPI_Cmd(SPI2, ENABLE);
  31. }

  32. void SPI2_IRQHandler(void)
  33. {
  34.         u8 spiTemp;
  35.         spiTemp = SPI_I2S_ReceiveData(SPI2);
  36.         printf("spirecive: %d", spiTemp);
  37. }
复制代码

主函数部分:
  1. int main(void)
  2. {
  3.         Init();

  4.         TIM_Cmd(TIM3, ENABLE);                                                      
  5.         
  6.         while(1)
  7.         {
  8.                 if(flag_1ms)
  9.                 {
  10.                         flag_1ms = 0;
  11.                         printf("\r\n1s¶¨Ê±µ½¡£");
  12.                 }
  13.         }
  14. }

  15. void Init(void)
  16. {
  17.         GPIO_Config();                                                            
  18.         SPI2_Init();
  19.         USART1_Config();                                                      
  20.         TIM3_Config(9999, 7199);                                       
  21.         NVIC_Configuration();
  22. }
复制代码

中断配置部分:
  1. void NVIC_Configuration(void)
  2. {
  3.         NVIC_InitTypeDef NVIC_InitStructure;
  4.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  5.         
  6.         NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  7.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
  8.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
  9.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  10.         NVIC_Init(&NVIC_InitStructure);
  11.         
  12.         NVIC_InitStructure.NVIC_IRQChannel = SPI2_IRQn;
  13.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  14.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
  15.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  16.         NVIC_Init(&NVIC_InitStructure);
  17.         
  18.         NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
  19.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
  20.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
  21.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  22.         NVIC_Init(&NVIC_InitStructure);
  23. }
复制代码




最佳答案

查看完整内容

" RCC_APB2PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE); " SPI时钟开启错误,根本没开启时钟! 你打字打错了 , 请改一下 :RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
收藏 评论19 发布时间:2016-5-12 15:52

举报

19个回答
Dylan疾风闪电 回答时间:2016-5-12 15:52:51
" RCC_APB2PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE); "

SPI时钟开启错误,根本没开启时钟!

你打字打错了 , 请改一下 :RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);

评分

参与人数 1ST金币 +2 收起 理由
沐紫 + 2

查看全部评分

wtliu 回答时间:2016-5-13 09:59:38
看看端口有没有设置上拉。

评分

参与人数 1ST金币 +2 收起 理由
沐紫 + 2

查看全部评分

sfee2002 回答时间:2016-5-13 10:20:41
看了你的问题,你SPI工作 在从模式下,SCk肯定没时钟信号。你看下你到底是要工作在主模式下还是从模式下,如果确定工作在从模式下,那就看你那个主机的设备是否发了时钟信号

评分

参与人数 1ST金币 +2 收起 理由
沐紫 + 2

查看全部评分

any012 回答时间:2016-5-13 11:00:45
wtliu 发表于 2016-5-13 09:59
看看端口有没有设置上拉。

三个管脚均有10K上拉电阻。
yuazhang 回答时间:2016-5-13 11:01:03
SCk有信号应该也没错,那是主节点发出来的,不是从节点发出来的。SPI要主从配合,从节点的配置要要主节点的配置相互要匹配才行。

评分

参与人数 1ST金币 +2 收起 理由
沐紫 + 2

查看全部评分

any012 回答时间:2016-5-13 11:01:56
sfee2002 发表于 2016-5-13 10:20
看了你的问题,你SPI工作 在从模式下,SCk肯定没时钟信号。你看下你到底是要工作在主模式下还是从模式下, ...

需要工作在从模式下。
主设备发送了时钟信号,因为可以在本电路的SCK和MOSI管脚上测到波形。
yuazhang 回答时间:2016-5-13 11:03:18
可以用示波器观察一下SCk和MOSI两个信号是不是符合时序啊

评分

参与人数 1ST金币 +2 收起 理由
沐紫 + 2

查看全部评分

wenyangzeng 回答时间:2016-5-13 11:27:49
从模式的时钟由主模式方提供。
SPI中断里最好不要进行printf数据处理。

评分

参与人数 1ST金币 +2 收起 理由
沐紫 + 2

查看全部评分

power568 回答时间:2016-5-13 14:31:49
看看你的参数配置是否一致,特别是SPI_CPOL、SPI_CPHA...

评分

参与人数 1ST金币 +2 收起 理由
沐紫 + 2

查看全部评分

12下一页

所属标签

相似问题

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