#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工作就不正常了。
#2
文章发表于:2008-09-04 13:37
因为PB12还对应于SPI2_NSS,你试试看把SPI2_NSS的功能关闭:
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
#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的事。
#4
文章发表于:2008-09-04 14:13
还有点奇怪的就是,我做了个简单的测试,程序开头初始化完USART3后,正常工作,但只要RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE)。一运行,接下来的USART3就不正常了。
#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输出。
#6
文章发表于:2008-09-04 17:14
使能SPI2时钟后,我加了这句SSOutputCmd(SPI2,enable),结果还是USART3 时钟不正常。谢谢lut1lut 和STM32 两位高手,看来我还是要改硬件了,把SPI2改成SPI1。
#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的时钟。
#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);
#9
文章发表于:2008-09-05 11:33
/* Enable USART3 */
USART_Cmd(USART3, ENABLE);
#10
文章发表于:2008-09-05 14:23
请#8把你的第4步移到第1步之前,使能时钟应该是第一个步骤,否则其他的初始化会有问题。
#11
文章发表于:2008-09-05 14:41
没错,我是这样做的,第4步在开机后的RCC设置里首先设置了。