极海半导体APM32F030_SPI半双工模式_MISO、SCLK、CSS能否复用成其他功能?
极海半导体-APM32F030的SPI半双工模式下,仅使用MOSI管脚输出,其他管脚(MISO,SCLK,CSS)能否正常复用成其他功能。
背景:项目只需要用MOSI管脚输出的信号控制RGB,其他IO用做其他功能。
  • 基于APM32F0xx_SDK_V1.6    APM32F051开发板、APM32F030开发板
  • 使用SPI1对应的GPIO为MOSI-PA7、MISO-PA6、SCLK-PA5、CSS-PA4,将SPI初始化代码配置成半双工模式,代码如下。
  • void APM_MINI_SPIInit(void)
  • {
    GPIO_Config_T gpioConfig;
    SPI_Config_T spiConfig;

    /** Enable related clock*/
    RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_SPI1);
    RCM_EnableAHBPeriphClock(RCM_AHB_PERIPH_GPIOA);
    RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_SYSCFG);

    /*屏蔽MISO、SCLK的IO配置*/  
    //    GPIO_ConfigPinAF(GPIOA, GPIO_PIN_SOURCE_5, GPIO_AF_PIN0);
    //    GPIO_ConfigPinAF(GPIOA, GPIO_PIN_SOURCE_6, GPIO_AF_PIN0);
    GPIO_ConfigPinAF(GPIOA, GPIO_PIN_SOURCE_7, GPIO_AF_PIN0);
    /** config PIN_5->SCK , PIN_7->MOSI*/
    gpioConfig.pin = GPIO_PIN_7;   
    gpioConfig.mode = GPIO_MODE_AF;
    gpioConfig.outtype = GPIO_OUT_TYPE_PP;
    gpioConfig.speed = GPIO_SPEED_50MHz;
    gpioConfig.pupd = GPIO_PUPD_PU;
    GPIO_Config(GPIOA, &gpioConfig);

    //     /** config PIN_4->NSS*/
    //    gpioConfig.pin =  GPIO_PIN_4;
    //    gpioConfig.outtype = GPIO_OUT_TYPE_PP;
    //    gpioConfig.speed = GPIO_SPEED_50MHz;
    //    gpioConfig.pupd = GPIO_PUPD_PU;
    //    gpioConfig.mode = GPIO_MODE_OUT;
    //    GPIO_Config(GPIOA, &gpioConfig);
    //    GPIO_SetBit(GPIOA, GPIO_PIN_4);
    //
    //    /** config PIN_6  MISO*/
    //    gpioConfig.pin = GPIO_PIN_6;
    //    gpioConfig.mode = GPIO_MODE_AF;
    //    gpioConfig.pupd = GPIO_PUPD_PU;
    //    gpioConfig.speed = GPIO_SPEED_50MHz;
    //    GPIO_Config(GPIOA, &gpioConfig);
    /** SPI RESET*/
    SPI_Reset(SPI1);
    SPI_ConfigStructInit(&spiConfig);

    /** SPI configuration*/
    spiConfig.polarity = SPI_CLKPOL_LOW;
    spiConfig.direction = SPI_DIRECTION_1LINE_TX;/*单线 发送*/
    spiConfig.mode = SPI_MODE_MASTER;/*主模式*/
    spiConfig.phase = SPI_CLKPHA_1EDGE;
    spiConfig.slaveSelect = SPI_SSC_ENABLE;
    spiConfig.baudrateDiv = SPI_BAUDRATE_DIV_64;
    spiConfig.length = SPI_DATA_LENGHT_8B;
    SPI1->CTRL1_B.ISS = SET;
    SPI_Config(SPI1, &spiConfig);
    SPI_Enable(SPI1);/*SPI使能*/

    }
  •  
  • 主函数代码
  • int main(void)
    {
        APM_MINI_LEDInit(LED2);/*LED2 GPIOA_PIN_5 */
        APM_MINI_LEDInit(LED3);/*LED2 GPIOA_PIN_6 */7
        APM_MINI_SPIInit();
        while(1)
        {
            SPI_TxData8(SPI1,0xAA);
            Delay(0xff);
            SPI_TxData8(SPI1,0x0A);
            Delay(0xff);
            APM_MINI_LEDToggle(LED2);
            APM_MINI_LEDToggle(LED3);
            GPIOA->DOUT ^= GPIO_PIN_4;
        }
    }
  •  
  • 测试结果:MISO,SCLK,CSS用做GPIO翻转测试正常,同时不影响SPI的MOSI输出数据。(除IO翻转外,验证了其他复用功能,都能正常使用)