单片机 > 单片机程序设计 > 详情

STM32 的SPI总线配置

发布时间:2024-07-25 发布时间:
|

     项目中经常会用到多路SPI,但是各路的配置又不尽相同,其中SPI3默认状态是JLINK模式,所以如果想正常使用SPI3,就需要对其重映射。下面给出SPI2和SPI3的配置程序,该配置已验证。

   验证MCU:STM32F107  

   1、SPI2配置

     void SPI_Init(void)
{
uint32_t cnt;
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef  SPI_InitStructure;

/* 使能 SPI2 时钟 */                         
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOE, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);

/* ---------通信I/O初始化----------------
* PB13-SPI2-SCK 
* PB14-SPI2-MISO
* PB15-SPI2-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);


/* -------- 片选I/O初始化----------------*/
/* PB12-SPI2-NSS:ENC28J60_CS */ 
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  // 推挽输出
      GPIO_Init(GPIOB, &GPIO_InitStructure);  
      GPIO_SetBits(GPIOB, GPIO_Pin_12); // 先把片选拉高,真正用的时候再拉低

/* ---------复位I/O初始化----------------*/
/* PE6_RST */ 
     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  // 推挽输出
     GPIO_Init(GPIOE, &GPIO_InitStructure);  
     GPIO_SetBits(GPIOE, GPIO_Pin_6);// 先把复位拉高,真正用的时候再拉低复位

/* SPI2 配置 */ 
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_Low;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI2, &SPI_InitStructure);

/* 使能 SPI2  */
SPI_Cmd(SPI2, ENABLE);
}


2、SPI3配置

   需要注意的是:

 (1)开启AFIO时钟: RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); 

 (2)使能SWD :GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE) ;

void SPI3_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef  SPI_InitStructure; 

/* 使能 SPI3时钟 */                         
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOA |        RCC_APB2Periph_GPIOC, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); 
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE) ;

/* ---------通信I/O初始化----------------
* PB3-SPI3-SCK 
* PB4-SPI3-MISO
* PB5-SPI3-MOSI 
*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3| GPIO_Pin_4 | GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   // 复用输出
GPIO_Init(GPIOB, &GPIO_InitStructure);


/* --------- 片选I/O初始化----------------*/
/* PB12-SPI2-NSS:ENC28J60_CS */ 
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   // 推挽输出  GPIO_Mode_Out_PP
      GPIO_Init(GPIOA, &GPIO_InitStructure);  
      GPIO_SetBits(GPIOA, GPIO_Pin_15); // 先把片选拉高,真正用的时候再拉低

/* ---------复位I/O初始化----------------*/
/* PE6-ENC28J60_RST */ //复位引脚
       GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
       GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   // 推挽输出
       GPIO_Init(GPIOC, &GPIO_InitStructure);  
       GPIO_SetBits(GPIOC, GPIO_Pin_9); // 先把复位拉高,真正用的时候再拉低复位

/* SPI3 配置 */ 
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_Low;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI3, &SPI_InitStructure);

/* 使能 SPI3  */
SPI_Cmd(SPI3, ENABLE); 
}



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
快速学Arm(37)--定时器和计数器(1)