社区导航

 
快捷导航
  • 首页
  • 论坛
  • 查看新帖
  • 最新回复
  • 精华区
  • 社区活动
  • 联系管理员
  • 消灭零回复
  • E金币兑换
搜索
查看: 1288|回复: 14

[求助] STM32F429的SPI很特殊吗?

[复制链接]

1万

TA的帖子

33

TA的资源

版主

Rank: 6Rank: 6

发表于 2017-2-7 11:43:56 | 显示全部楼层 |阅读模式
做到STM32F429的SPI了,调了两天没调好

本来,STM32的SPI搞过很多的。这次开始用MX生成的东西,不工作(SCK等没有输出),后来又用以前可以工作的SPI代码,也不行,
没办法了,就看手册,一个寄存器一个寄存器地设置,结果仍然不工作。示波器看不到SPI的任何波形
这是现在设置的代码:


void SPI2_Init(void)
{
    RCC->APB1ENR |= 1 << 14U;       // SPI2   Clock EN
    GPIOB->MODER &= 0x00FFFFFF;
    GPIOB->MODER |= 0xA9000000;     // PB12 GPIO_O, PB13,14,15 =AF
    GPIOB->OTYPER &= 0xEFFF;        // PB12 Output push-pull
    GPIOB->PUPDR &= 0xFCFFFFFF;     // PB12 No pull-up, pull-down
    GPIOB->AFR[1] &= 0x000FFFFF;    // Clear PB13,14,15
    GPIOB->AFR[1] |= 0x55500000;    // PB13,14,15 =AF5

    __HAL_RCC_SPI2_CLK_ENABLE();

    SPI2->CR1 = 0;
    SPI2->CR2 = 0;

    while ( SPI2->SR & 0x80 ){}     // wait for not busy

    SPI2->CR1 = /* 1 << 11 |   Data frame format ######  16bit  */
                /* 0 << 7  |   Frame format, MSB transmitted first */
                3 << 3  |   /* Baud rate control, 1/16  ######### ------  APB1 37.5MHz , 1/16 = 2.343375MHz */
                1 << 2  ;   /* Master mode */
    SPI2->I2SCFGR = 0;      /* SPI mode  */

    SPI2->CR1 = 1<< 6 ;     /*   Enable     */
}

此帖出自stm32/stm8论坛

回复

使用道具 举报

3788

TA的帖子

8

TA的资源

五彩晶圆(中级)

Rank: 8Rank: 8

测评达人

发表于 2017-2-7 12:02:35 | 显示全部楼层
在spi初始化之前,对spi所在的gpio有初始化,还有引脚复用功能打开了吗?

点评

这是复用功能设置: GPIOB->MODER |= 0xA9000000; // PB12 GPIO_O, PB13,14,15 =AF GPIOB->OTYPER &= 0xEFFF; // PB12 Output push-pull GPIOB->PUPDR &= 0xFCFFFFFF; // PB12 No pull-u  详情 回复 发表于 2017-2-7 12:06

回复

使用道具 举报

663

TA的帖子

0

TA的资源

纯净的硅(高级)

Rank: 6Rank: 6

发表于 2017-2-7 12:05:14 | 显示全部楼层
如果我换一个新的STM32型号,我会照着手册把I/O配置、Clock配置重新写。不过我还没用过F429, 帮顶了。
另外,楼主的SDRAM调好了吗?

点评

SDRAM调好了,原来认为MX生成的就能工作,实际上不是的。加入了例程的SDRAM_Initialization_Sequence函数就能正常工作了。  详情 回复 发表于 2017-2-7 12:10

回复

使用道具 举报

1万

TA的帖子

33

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2017-2-7 12:05:42 | 显示全部楼层
SPI2->CR1 = 1<< 6 ;
实际为: SPI2->CR1 |= 1<< 6 ;

回复

使用道具 举报

1万

TA的帖子

33

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2017-2-7 12:06:35 | 显示全部楼层
huaiqiao 发表于 2017-2-7 12:02
在spi初始化之前,对spi所在的gpio有初始化,还有引脚复用功能打开了吗?

这是复用功能设置:
GPIOB->MODER |= 0xA9000000;     // PB12 GPIO_O, PB13,14,15 =AF
    GPIOB->OTYPER &= 0xEFFF;        // PB12 Output push-pull
    GPIOB->PUPDR &= 0xFCFFFFFF;     // PB12 No pull-up, pull-down
    GPIOB->AFR[1] &= 0x000FFFFF;    // Clear PB13,14,15
    GPIOB->AFR[1] |= 0x55500000;    // PB13,14,15 =AF5

点评

GPIO所在的总线时钟有使能么? 一般来说,如果经常换cpu的话,虽然寄存器比较直观,为了程序的兼容性,我个人的看法是不建议用寄存器配置。http://bbs.eeworld.com.cn/thread-511356-1-1.html 还有看楼下,楼  详情 回复 发表于 2017-2-7 12:25

回复

使用道具 举报

1万

TA的帖子

33

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2017-2-7 12:10:18 | 显示全部楼层
cruelfox 发表于 2017-2-7 12:05
如果我换一个新的STM32型号,我会照着手册把I/O配置、Clock配置重新写。不过我还没用过F429, 帮顶了。
另 ...

SDRAM调好了,原来认为MX生成的就能工作,实际上不是的。加入了例程的SDRAM_Initialization_Sequence函数就能正常工作了。

回复

使用道具 举报

1万

TA的帖子

33

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2017-2-7 12:15:09 | 显示全部楼层
调试时发现,执行 SPI2->CR1 |= 1<< 6 ;后SR1的内容为 0x18

即SPI2允许后,仍为禁止
a1.jpg

点评

说明在的SPI2->CR1 |= 1  详情 回复 发表于 2017-2-7 12:29

回复

使用道具 举报

3788

TA的帖子

8

TA的资源

五彩晶圆(中级)

Rank: 8Rank: 8

测评达人

发表于 2017-2-7 12:25:53 | 显示全部楼层
dontium 发表于 2017-2-7 12:06
这是复用功能设置:
GPIOB->MODER |= 0xA9000000;     // PB12 GPIO_O, PB13,14,15 =AF
    GPIOB->OT ...

GPIO所在的总线时钟有使能么?

一般来说,如果经常换cpu的话,虽然寄存器比较直观,为了程序的兼容性,我个人的看法是不建议用寄存器配置。http://bbs.eeworld.com.cn/thread-511356-1-1.html

还有看楼下,楼主的回复,您是用MX工具是吗?  这个的话,建议Cube库可以参考正点原子新出的阿波罗的例程的(库函数和寄存器都有的)。我没有下载429的手册

点评

GPIO的时钟,不会影响SPI寄存器,只会影响SPI的输出。现在发现的是寄存器有问题。  详情 回复 发表于 2017-2-7 13:37

回复

使用道具 举报

3788

TA的帖子

8

TA的资源

五彩晶圆(中级)

Rank: 8Rank: 8

测评达人

发表于 2017-2-7 12:29:56 | 显示全部楼层
dontium 发表于 2017-2-7 12:15
调试时发现,执行 SPI2->CR1 |= 1

说明在的SPI2->CR1 |= 1<< 6这个操作,并没有使得CR1寄存器的第6位的SPI功能使能

回复

使用道具 举报

1万

TA的帖子

33

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2017-2-7 13:37:35 | 显示全部楼层
huaiqiao 发表于 2017-2-7 12:25
GPIO所在的总线时钟有使能么?

一般来说,如果经常换cpu的话,虽然寄存器比较直观,为了程序的兼容性 ...

GPIO的时钟,不会影响SPI寄存器,只会影响SPI的输出。现在发现的是寄存器有问题。

点评

我看到了你在7楼的回复。 是不是还是手册的问题,因为我之前记得你在有个帖子中,我们发现了,英文手册最新版本是支持F429的。 但是中文手册不行。。。 或者你可以这样试试:操作某一位之前,可以先通过按位  详情 回复 发表于 2017-2-7 14:09

回复

使用道具 举报

3788

TA的帖子

8

TA的资源

五彩晶圆(中级)

Rank: 8Rank: 8

测评达人

发表于 2017-2-7 14:09:09 | 显示全部楼层
dontium 发表于 2017-2-7 13:37
GPIO的时钟,不会影响SPI寄存器,只会影响SPI的输出。现在发现的是寄存器有问题。

我看到了你在7楼的回复。

是不是还是手册的问题,因为我之前记得你在有个帖子中,我们发现了,英文手册最新版本是支持F429的。
但是中文手册不行。。。

或者你可以这样试试:操作某一位之前,可以先通过按位与运算清零某一位,然后再通过按位或运算将某一位置位。

点评

就是这样设置的。 本来,CR1的内容是0X1C,当置第六位时,应该成为0x5C才是,却变为0x18了,把MASTER位也清了。  详情 回复 发表于 2017-2-7 15:03

回复

使用道具 举报

1万

TA的帖子

33

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2017-2-7 15:03:18 | 显示全部楼层
huaiqiao 发表于 2017-2-7 14:09
我看到了你在7楼的回复。

是不是还是手册的问题,因为我之前记得你在有个帖子中,我们发现了,英文手 ...

就是这样设置的。
本来,CR1的内容是0X1C,当置第六位时,应该成为0x5C才是,却变为0x18了,把MASTER位也清了。

点评

是啊,看起来真的好奇怪啊。手里没有429的板子,要不还能用你的工程看看呢  详情 回复 发表于 2017-2-7 16:10

回复

使用道具 举报

3788

TA的帖子

8

TA的资源

五彩晶圆(中级)

Rank: 8Rank: 8

测评达人

发表于 2017-2-7 16:10:59 | 显示全部楼层
dontium 发表于 2017-2-7 15:03
就是这样设置的。
本来,CR1的内容是0X1C,当置第六位时,应该成为0x5C才是,却变为0x18了,把MASTER位 ...

是啊,看起来真的好奇怪啊。手里没有429的板子,要不还能用你的工程看看呢

点评

现在暂用IO实现。以后再研究它吧,搞了两天搞不好。该收工了。  详情 回复 发表于 2017-2-7 18:37

回复

使用道具 举报

1万

TA的帖子

33

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2017-2-7 18:37:49 | 显示全部楼层
huaiqiao 发表于 2017-2-7 16:10
是啊,看起来真的好奇怪啊。手里没有429的板子,要不还能用你的工程看看呢

现在暂用IO实现。以后再研究它吧,搞了两天搞不好。该收工了。

点评

哦哦  详情 回复 发表于 2017-2-7 23:29

回复

使用道具 举报

3788

TA的帖子

8

TA的资源

五彩晶圆(中级)

Rank: 8Rank: 8

测评达人

发表于 2017-2-7 23:29:36 | 显示全部楼层
dontium 发表于 2017-2-7 18:37
现在暂用IO实现。以后再研究它吧,搞了两天搞不好。该收工了。

哦哦

回复

使用道具 举报

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

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456

GMT+8, 2017-9-20 10:09 , Processed in 0.467641 second(s), 18 queries , Redis On.

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