STM32 的SPI总线配置

     项目中经常会用到多路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); 

}

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32F108C8是一款基于ARM Cortex-M3内核的低功耗微控制器,它具有丰富的外设功能,包括多个SPI接口。下面是一个简单的配置STM32F108C8的SPI接口的步骤: 1. 引脚配置:根据SPI接口规格,选择与SPI相关的引脚,例如SCK、MISO、MOSI和片选引脚。通过GPIO模块将这些引脚配置SPI功能。 2. RCC配置:通过RCC模块使能SPI的时钟。SPI接口通常通过APB1总线连接到内核,因此需要打开APB1总线的时钟。 3. SPI模式配置:选择SPI接口的工作模式,例如主机模式(Master Mode)或从机模式(Slave Mode)。还需要选择SPI的数据传输模式,例如全双工模式或半双工模式。 4. SPI时钟配置配置SPI的时钟分频。根据需求选择适当的分频参数,以确保SPI时钟与外设通信的频率匹配。 5. SPI片选配置:如果需要与多个外设通信,可以配置多个片选引脚。SPI接口通常使用片选信号选择要与之通信的外设。 6. SPI数据格式配置:选择数据帧的位数和传输顺序。SPI支持数据帧位数的选择,例如8位或16位。还可以选择数据传输的位顺序,如高位优先或低位优先。 7. SPI使能:通过SPI控制寄存器,使能SPI接口开始工作。 8. 数据传输:通过SPI发送和接收数据。数据的传输由SPI的发送和接收缓冲区控制。 以上是配置STM32F108C8的SPI接口的一般步骤。具体的配置参数以及初始化代码可以参考STM32F1系列的芯片手册和官方提供的开发工具库。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值