zoukankan      html  css  js  c++  java
  • STM32F072标准库spi操作细节

    最好不要直接在标准库中直接查找(不够详细):

     1 /**
     2   * @brief  Writes data to the specified GPIO data port.
     3   * @param  GPIOx: where x can be (A, B, C, D, E or F) to select the GPIO peripheral.
     4   * @note   GPIOC, GPIOD, GPIOE and GPIOF  are available only for STM32F072 and STM32F091. 
     5   * @param  GPIO_PinSource: specifies the pin for the Alternate function.
     6   *          This parameter can be GPIO_PinSourcex where x can be (0..15) for GPIOA, GPIOB, GPIOD, GPIOE
     7   *          and (0..12) for GPIOC and (0, 2..5, 9..10) for GPIOF.    
     8   * @param  GPIO_AF: selects the pin to used as Alternate function.
     9   *          This parameter can be one of the following value:
    10   *            @arg GPIO_AF_0:  WKUP, EVENTOUT, TIM15, SPI1, TIM17, MCO, SWDAT, SWCLK,
    11   *                             TIM14, BOOT, USART1, CEC, IR_OUT, SPI2, TIM3, USART4,
    12   *                             CAN, USART2, CRS, TIM16, TIM1, TS, USART8 
    13   *            @arg GPIO_AF_1: USART2, CEC, TIM3, USART1, USART2, EVENTOUT, I2C1,
    14   *                            I2C2, TIM15, SPI2, USART3, TS, SPI1, USART7, USART8
    15   *                            USART5, USART4, USART6, I2C1   
    16   *            @arg GPIO_AF_2: TIM2, TIM1, EVENTOUT, TIM16, TIM17, USB, USART6, USART5,
    17   *                            USART8, USART7, USART6  
    18   *            @arg GPIO_AF_3: TS, I2C1, TIM15, EVENTOUT 
    19   *            @arg GPIO_AF_4: TIM14, USART4, USART3, CRS, CAN, I2C1, USART5
    20   *            @arg GPIO_AF_5: TIM16, TIM17, TIM15, SPI2, I2C2, USART6, MCO
    21   *            @arg GPIO_AF_6: EVENTOUT
    22   *            @arg GPIO_AF_7: COMP1 OUT, COMP2 OUT 
    23   * @note   The pin should already been configured in Alternate Function mode(AF)
    24   *         using GPIO_InitStruct->GPIO_Mode = GPIO_Mode_AF
    25   * @note   Refer to the Alternate function mapping table in the device datasheet 
    26   *         for the detailed mapping of the system and peripherals'alternate 
    27   *         function I/O pins.
    28   * @retval None
    29   */
    30 void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF)

    具体操作配置:

    // spi2 的初始化
    void SPI2_idev_Init( void)   
    {
        GPIO_InitTypeDef     GPIO_InitStructure;
        SPI_InitTypeDef            SPI_InitStructure;
         
        RCC_AHBPeriphClockCmd(    RCC_AHBPeriph_GPIOB, ENABLE );
        RCC_APB1PeriphClockCmd(    RCC_APB1Periph_SPI2,  ENABLE ); 
        
       GPIO_PinAFConfig(GPIOB, GPIO_PinSource10 , GPIO_AF_5); // 使用的引脚是  PORTB.10
       GPIO_PinAFConfig(GPIOB, GPIO_PinSource14 , GPIO_AF_0);
        GPIO_PinAFConfig(GPIOB, GPIO_PinSource15 , GPIO_AF_0);
         
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15 |GPIO_Pin_14|GPIO_Pin_10;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
       GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
     
        GPIO_Init(GPIOB, &GPIO_InitStructure);
        
        GPIO_SetBits(GPIOB, GPIO_Pin_15 |GPIO_Pin_14|GPIO_Pin_10);   
        
        SPI_I2S_DeInit( 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_2;      
        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;  
        SPI_InitStructure.SPI_CRCPolynomial = 7;  
        SPI_Init(SPI2, &SPI_InitStructure);  
        SPI_RxFIFOThresholdConfig( SPI2,SPI_RxFIFOThreshold_QF); // 与stm32f1xx 主要区别点
        
        SPI_Cmd(SPI2, ENABLE);  
    }
     
    // SPI 写8位
    void
    SPI2_WriteByte(uint8_t data) {     while((SPI2->SR&SPI_I2S_FLAG_TXE)==RESET); // 等待发送区为空       SPI_SendData8(SPI2,data); } // SPI 读写 uint8_t drv_spi_read_write_byte( uint8_t TxByte ) {     uint16_t retry=0;     while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET) // 等待发送区为空     {       retry++;       if(retry>400) {         return 0;       }     }       SPI_SendData8(SPI2, TxByte);       retry=0;     while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET) //等待接收缓冲区为空     {       retry++;       if(retry>400)       {         return 0;        }     }       return SPI_ReceiveData8(SPI2); }

    这样就基本没有什么问题的啦

  • 相关阅读:
    UVA
    把.apk传到站点server下载
    2014腾讯实习生面试经历(重庆站)
    Phalcon 訪问控制列表 ACL(Access Control Lists ACL)
    Regular Expression Matching
    改动Androidproject的名称(非Eclipse重命名)
    Cocos2d-x3.2 LayerMultiplex使用说明
    BAT解密:互联网技术发展之路(5)- 开发层技术剖析
    使用xftp连接VirtualBox中的centos6.5
    【C语言】二维数组中的查找,杨氏矩阵
  • 原文地址:https://www.cnblogs.com/xwtstudio/p/14505571.html
Copyright © 2011-2022 走看看