最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

STM32F4学习笔记之SPI(使用固件库,非中断方式)

来源:动视网 责编:小OO 时间:2025-10-01 19:24:17
文档

STM32F4学习笔记之SPI(使用固件库,非中断方式)

1.使能对应SPI模块时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE)forSPI1RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE)forSPI2RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI3,ENABLE)forSPI3.2.使能对应GPIO的时钟RCC_AHB1PeriphClockCmd()function.(SCK,MOSI,MISOandN
推荐度:
导读1.使能对应SPI模块时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE)forSPI1RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE)forSPI2RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI3,ENABLE)forSPI3.2.使能对应GPIO的时钟RCC_AHB1PeriphClockCmd()function.(SCK,MOSI,MISOandN
1.使能对应SPI模块时钟

     RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE) for SPI1

   RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE) for SPI2

    RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI3, ENABLE) for SPI3.

2.使能对应GPIO的时钟

RCC_AHB1PeriphClockCmd() function. (SCK, MOSI, MISO and NSS ).

3.配置对应引脚的复用功能

        GPIO_PinAFConfig(GPIOx, GPIO_PinSourcex, GPIO_AF_SPIx); //引脚映射

        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;                    // 设置为推挽输出

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;                       //复用模式

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_x ;                              //引脚选择

        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_xxMHz;                 //速度选择 

        GPIO_Init(GPIOx, &GPIO_InitStructure);                                        //写入配置信息

4.配置SPI信息

        SPI_InitStructure.SPI_Direction = xxx;//工作模式SPI_Direction_2Lines_FullDuplex,SPI_Direction_2Lines_RxOnly等

        SPI_InitStructure.SPI_Mode = xxx; //主从模式选择SPI_Mode_Master,SPI_Mode_Slave

        SPI_InitStructure.SPI_DataSize = xxx;//数据位选择SPI_DataSize_8b,SPI_DataSize_16b

        SPI_InitStructure.SPI_CPOL = xxx;//时钟空闲电平选择SPI_CPOL_High,SPI_CPOL_Low

        SPI_InitStructure.SPI_CPHA = xxx;//数据捕捉跳变沿选择SPI_CPHA_2Edge,SPI_CPHA_1Edge

        SPI_InitStructure.SPI_NSS = xxx;//NSS信号由硬件还是软件控制SPI_NSS_Soft,SPI_NSS_Hard

        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_x;//时钟分频选择

        SPI_InitStructure.SPI_FirstBit = xxx;//数据大小端选择SPI_FirstBit_MSB,SPI_FirstBit_LSB

        SPI_InitStructure.SPI_CRCPolynomial = 7;//CRC值计算的多项式

        SPI_Init(SPI1, &SPI_InitStructure);//写入配置信息

5.发送

           while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

         SPI_I2S_SendData(SPI1,u8 xxx);

6.接收

          while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);

              SPI_I2S_ReceiveData(SPI1);

程序举例:

本例是对交换机芯片KSZ8873的配置

宏定义:

#define KSZ8873_SPI                           SPI1

#define KSZ8873_SPI_CLK                       RCC_APB2Periph_SPI1

#define KSZ8873_SPI_SCK_PIN                   GPIO_Pin_3                  

#define KSZ8873_SPI_SCK_GPIO_PORT             GPIOB                      

#define KSZ8873_SPI_SCK_GPIO_CLK              RCC_AHB1Periph_GPIOB

#define KSZ8873_SPI_SCK_SOURCE                GPIO_PinSource3

#define KSZ8873_SPI_MISO_PIN                  GPIO_Pin_4                  

#define KSZ8873_SPI_MISO_GPIO_PORT            GPIOB                       

#define KSZ8873_SPI_MISO_GPIO_CLK             RCC_AHB1Periph_GPIOB

#define KSZ8873_SPI_MISO_SOURCE               GPIO_PinSource4

#define KSZ8873_SPI_MOSI_PIN                  GPIO_Pin_5                 

#define KSZ8873_SPI_MOSI_GPIO_PORT            GPIOB                       

#define KSZ8873_SPI_MOSI_GPIO_CLK             RCC_AHB1Periph_GPIOB

#define KSZ8873_SPI_MOSI_SOURCE               GPIO_PinSource5

#define KSZ8873_CS_PIN                        GPIO_Pin_15                 

#define KSZ8873_CS_GPIO_PORT                  GPIOA                      

#define KSZ8873_CS_GPIO_CLK                   RCC_AHB1Periph_GPIOA

#define KSZ8873_CS_LOW()       GPIO_ResetBits(KSZ8873_CS_GPIO_PORT, KSZ8873_CS_PIN)

#define KSZ8873_CS_HIGH()      GPIO_SetBits(KSZ8873_CS_GPIO_PORT, KSZ8873_CS_PIN)

#define KSZ8873_WRITE_CMD     0x02

#define KSZ8873_READ_CMD      0x03

程序:

void KSZ8873_SPI_Init(void)

{

        SPI_InitTypeDef  SPI_InitStructure;

        GPIO_InitTypeDef GPIO_InitStructure;

        

        RCC_AHB1PeriphClockCmd(KSZ8873_CS_GPIO_CLK, ENABLE);

        

        GPIO_InitStructure.GPIO_Pin = KSZ8873_CS_PIN;

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;

        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;

        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

        GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;

        GPIO_Init(KSZ8873_CS_GPIO_PORT, &GPIO_InitStructure);

        

        RCC_AHB1PeriphClockCmd(KSZ8873_SPI_SCK_GPIO_CLK | KSZ8873_SPI_MISO_GPIO_CLK |

                                                                KSZ8873_SPI_MOSI_GPIO_CLK,  ENABLE);

        RCC_APB2PeriphClockCmd(KSZ8873_SPI_CLK, ENABLE); 

        

        GPIO_PinAFConfig(KSZ8873_SPI_SCK_GPIO_PORT, KSZ8873_SPI_SCK_SOURCE, GPIO_AF_SPI1);

        GPIO_PinAFConfig(KSZ8873_SPI_MISO_GPIO_PORT, KSZ8873_SPI_MISO_SOURCE, GPIO_AF_SPI1);

        GPIO_PinAFConfig(KSZ8873_SPI_MOSI_GPIO_PORT, KSZ8873_SPI_MOSI_SOURCE, GPIO_AF_SPI1);

        

        GPIO_InitStructure.GPIO_Pin = KSZ8873_SPI_SCK_PIN;

        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;

        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

        GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;

        GPIO_Init(KSZ8873_SPI_SCK_GPIO_PORT, &GPIO_InitStructure);

        GPIO_InitStructure.GPIO_Pin = KSZ8873_SPI_MISO_PIN;

        GPIO_Init(KSZ8873_SPI_MISO_GPIO_PORT, &GPIO_InitStructure);

        GPIO_InitStructure.GPIO_Pin = KSZ8873_SPI_MOSI_PIN;

        GPIO_Init(KSZ8873_SPI_MOSI_GPIO_PORT, &GPIO_InitStructure);

        

        KSZ8873_CS_HIGH();

        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( KSZ8873_SPI , &SPI_InitStructure);

        

        SPI_Cmd(SPI1, ENABLE);

}

void KSZ8873_SPI_SendByte(u8 addr,u8 byte)

{

                KSZ8873_CS_LOW();

          while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

          SPI_I2S_SendData( KSZ8873_SPI , KSZ8873_WRITE_CMD);

          while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);

          SPI_I2S_ReceiveData( KSZ8873_SPI );

          while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

          SPI_I2S_SendData( KSZ8873_SPI , addr);

                 while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);

          SPI_I2S_ReceiveData( KSZ8873_SPI );

                while (SPI_I2S_GetFlagStatus( KSZ8873_SPI , SPI_I2S_FLAG_TXE) == RESET);

          SPI_I2S_SendData(SPI1, byte);

                 while (SPI_I2S_GetFlagStatus( KSZ8873_SPI , SPI_I2S_FLAG_RXNE) == RESET);

          SPI_I2S_ReceiveData( KSZ8873_SPI );

                KSZ8873_CS_HIGH();

}

u8 KSZ8873_SPI_ReceiveByte(u8 byte)

{

        u8 i;

        KSZ8873_CS_LOW();

          while (SPI_I2S_GetFlagStatus( KSZ8873_SPI , SPI_I2S_FLAG_TXE) == RESET);

          SPI_I2S_SendData(SPI1, KSZ8873_READ_CMD);

                while (SPI_I2S_GetFlagStatus( KSZ8873_SPI , SPI_I2S_FLAG_RXNE) == RESET);

          SPI_I2S_ReceiveData(SPI1);

          while (SPI_I2S_GetFlagStatus( KSZ8873_SPI , SPI_I2S_FLAG_TXE) == RESET);

          SPI_I2S_SendData(SPI1, byte);

                while (SPI_I2S_GetFlagStatus( KSZ8873_SPI , SPI_I2S_FLAG_RXNE) == RESET);

          SPI_I2S_ReceiveData(SPI1);

                

        while (SPI_I2S_GetFlagStatus( KSZ8873_SPI , SPI_I2S_FLAG_TXE) == RESET);

          SPI_I2S_SendData(SPI1, byte);

          while (SPI_I2S_GetFlagStatus( KSZ8873_SPI , SPI_I2S_FLAG_RXNE) == RESET);

          i=SPI_I2S_ReceiveData(SPI1);

                KSZ8873_CS_HIGH();

        return i;

}

文档

STM32F4学习笔记之SPI(使用固件库,非中断方式)

1.使能对应SPI模块时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE)forSPI1RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE)forSPI2RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI3,ENABLE)forSPI3.2.使能对应GPIO的时钟RCC_AHB1PeriphClockCmd()function.(SCK,MOSI,MISOandN
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top