返回该小组首页 回复主题
sibright

sibright

小组等级:     E币:172  (E币换礼)

#1楼主:SPI2和USART3冲突?

文章发表于:2008-09-04 01:21

SPI2   :PB13-SPI2_SCK、PB14-SPI2_MISO、PB15-SP12_MOSI,

                用来跟SD卡通信。
  USART3 :PB10-USART3_TX、PB12-USART3_CK,

                 用来跟智能卡通信。
  请问这样设置,SPI2和USART3是否硬件内部有冲突?
  在程序运行的时候,当运行到这一句后:

RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE)。
  USART3工作就不正常了。

STM32

   小组等级:    E币:4155  (E币换礼)

#2

文章发表于:2008-09-04 13:37

因为PB12还对应于SPI2_NSS,你试试看把SPI2_NSS的功能关闭:

  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;

sibright

   小组等级:    E币:172  (E币换礼)

#3

文章发表于:2008-09-04 14:11

SPI_InitStructure.SPI_Direction   = SPI_Direction_2Lines_FullDuplex;
 SPI_InitStructure.SPI_Mode    = SPI_Mode_Master;
 SPI_InitStructure.SPI_DataSize   = SPI_DataSize_8b;
 SPI_InitStructure.SPI_CPOL    = SPI_CPOL_High;
 SPI_InitStructure.SPI_CPHA    = SPI_CPHA_2Edge;
 SPI_InitStructure.SPI_NSS    = SPI_NSS_Soft;
 SPI_InitStructure.SPI_BaudRatePrescaler = speed;
 SPI_InitStructure.SPI_FirstBit   = SPI_FirstBit_MSB;
 SPI_InitStructure.SPI_CRCPolynomial  = 7;

我的SPI2是这样设置的。看来不关SPI2_NSS的事。

sibright

   小组等级:    E币:172  (E币换礼)

#4

文章发表于:2008-09-04 14:13

还有点奇怪的就是,我做了个简单的测试,程序开头初始化完USART3后,正常工作,但只要RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE)。一运行,接下来的USART3就不正常了。

lut1lut

   小组等级:    E币:65  (E币换礼)

#5

文章发表于:2008-09-04 15:18

冲突的原因是PB12:

PB.12   SPI2_NSS    USART3_CK
PB.13   SPI2_SCK   (USART3_CTS)
PB.14   SPI2_SO      (USART3_RTS)
PB.15   SPI2_SI  

PB12被配置成AF-PP,如果没有使能SPI2时钟的时候,PB12是作为USART3的时钟引脚,USART工作正常。

但是当一使能SPI2时钟,可以从示波器上看到USART3就没有时钟输出了。这个时候需要SSOutputCmd(SPI2,enable)就可以了。我在哪里看到过一句话,哪里看到的忘了,意思就是说要PB12要作为“其他”外设功能使用时,要使能NSS输出。

sibright

   小组等级:    E币:172  (E币换礼)

#6

文章发表于:2008-09-04 17:14

使能SPI2时钟后,我加了这句SSOutputCmd(SPI2,enable),结果还是USART3 时钟不正常。谢谢lut1lut 和STM32 两位高手,看来我还是要改硬件了,把SPI2改成SPI1。

lut1lut

   小组等级:    E币:65  (E币换礼)

#7

文章发表于:2008-09-05 09:35

不会吧?我就这样用过的啊。同时使用作为master的SPI1以及USART2的异步功能(使用CK)

PA.4 SPI1_NSS USART2_CK   (may confilct~~~)
PA.5 SPI1_SCK 
PA.6 SPI1_MI
PA.7 SPI1_MO

1.配置SPI1所占GPIO

 GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_5/6/7;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

2.配置SPI IP

  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  SPI_Init(SPI1, &SPI_InitStructure);

  SPI_SSOutputCmd(SPI1, ENABLE);

3.配置USART2

  /* Configure USART2 Tx (PA2) and USART2 CK(PA4 as alternate function push-pull */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_4;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  /* Configure USART2 Rx (PA.03) as input floating */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

4.当然还有使能SPI1和USART2的时钟。

sibright

   小组等级:    E币:172  (E币换礼)

#8

文章发表于:2008-09-05 11:30

我是这样配置的: 

1、配置SPI1所占GPIO
   /* Configure SPI2 pins: NSS, SCK, MISO and MOSI       */
 GPIO_InitStructure.GPIO_Pin    = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
 GPIO_InitStructure.GPIO_Speed   = GPIO_Speed_50MHz;
 GPIO_InitStructure.GPIO_Mode   = GPIO_Mode_AF_PP;
 GPIO_Init(GPIOB, &GPIO_InitStructure);
2.配置SPI IP 
  /* SPI2 Config               */
 SPI_InitStructure.SPI_Direction   = SPI_Direction_2Lines_FullDuplex;
 SPI_InitStructure.SPI_Mode    = SPI_Mode_Master;
 SPI_InitStructure.SPI_DataSize   = SPI_DataSize_8b;
 SPI_InitStructure.SPI_CPOL    = SPI_CPOL_High;
 SPI_InitStructure.SPI_CPHA    = SPI_CPHA_2Edge;
 SPI_InitStructure.SPI_NSS    = SPI_NSS_Soft;
 SPI_InitStructure.SPI_BaudRatePrescaler = speed;
 SPI_InitStructure.SPI_FirstBit   = SPI_FirstBit_MSB;
 SPI_InitStructure.SPI_CRCPolynomial  = 7;
 
 SPI_SSOutputCmd(SPI2, ENABLE);
 /* SPI2 enable               */
 SPI_Cmd(SPI2, ENABLE);
 
3.配置USART3
  /* Configure USART3 CK(PB12) as alternate function push-pull */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
 
  /* Configure USART3 Tx (PB10) as alternate function open-drain */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
 
4、RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);

sibright

   小组等级:    E币:172  (E币换礼)

#9

文章发表于:2008-09-05 11:33

  /* Enable USART3 */
  USART_Cmd(USART3, ENABLE);

STM32

   小组等级:    E币:4155  (E币换礼)

#10

文章发表于:2008-09-05 14:23

请#8把你的第4步移到第1步之前,使能时钟应该是第一个步骤,否则其他的初始化会有问题。

sibright

   小组等级:    E币:172  (E币换礼)

#11

文章发表于:2008-09-05 14:41

没错,我是这样做的,第4步在开机后的RCC设置里首先设置了。

2【下一页】总共 , 当前 /

快速回复主题--如果想加入编辑器功能,建议使用 [高级回复]

您目前还不是小组成员,请先加入

回复贴子区

用户名:    您没有注册?

密码:    忘记了密码?

内容:

  • DesignDesign
  • HTMLHTML

浏览该小组的用户还看过...

设计资源与分销

所有小组精华文章