如何使用stm32的spi3端口?是不是把spi1端口的配置修改一下就行了,还要什么 重映射吗?

2019-07-21 07:59发布

如何使用stm32的spi3端口?是不是把spi1端口的配置修改一下就行了,还要什么 重映射吗? 

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
16条回答
maximus811009
1楼-- · 2019-07-21 11:56
SPI3的端口因为有JTAG端口存在,因此在使用时候需要禁用JTAG端口,打开复用AFIO时钟,然后禁用JTAG,保留SWD即可。
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3, ENABLE);
  GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
正点原子
2楼-- · 2019-07-21 17:38
先做.
suqingxiao
3楼-- · 2019-07-21 20:36
注意SPI1是在APB2的,SPI2是在APB1的,SPI3是在APB1的,所以初始化外设时钟时注意一下就可以,其他的只要把SPI1改成SP3就可以正常工作,还有硬件的SPI3对应的IO口,呵,我有做过SP1改成SPI2的
void  SPI2_Initaize(void)
{  
SPI_InitTypeDef   SPI_InitStructure;
GPIO_InitTypeDef  GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);

/* Configure SPI2 pins: SCK, MISO and MOSI */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);


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 =  SPI_BaudRatePrescaler_4;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI2, &SPI_InitStructure);
SPI_Cmd(SPI2, ENABLE);  
}

//SPIx 读写一个字节
//TxData:要写入的字节
//返回值:读取到的字节
u8 SPI2_ReadWriteByte(u8 TxData)
{
u8 retry=0;  
/* Loop while DR register in not emplty */
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET) //检查指定的SPI标志位设置与否:发送缓存空标志位
{
retry++;
if(retry>200)return 0;
}   
/* Send byte through the SPI2 peripheral */
SPI_I2S_SendData(SPI2, TxData); //通过外设SPIx发送一个数据
retry=0;
/* Wait to receive a byte */
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET); //检查指定的SPI标志位设置与否:接受缓存非空标志位
{
retry++;
if(retry>200)return 0;
}        
/* Return the byte read from the SPI bus */
return SPI_I2S_ReceiveData(SPI2); //返回通过SPIx最近接收的数据     
}
esteem
4楼-- · 2019-07-21 21:48
回复【3楼】suqingxiao:
---------------------------------
spi3你试过吗?spi2我是调通了,貌似修改一下用到spi3上不工作。不知道什么原因?
suqingxiao
5楼-- · 2019-07-22 01:20
 精彩回答 2  元偷偷看……
正点原子
6楼-- · 2019-07-22 04:45
深回复【4楼】esteem:
---------------------------------

什么型号?

一周热门 更多>