[APM32F0] APM32F0_SPI半双工模式_MISO、SCLK、CSS能否复用成其他功能?

[复制链接]
 楼主| Fordhs168 发表于 2022-4-22 17:00 | 显示全部楼层 |阅读模式
#申请原创# #技术资源#
Q:APM32F0的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初始化代码配置成半双工模式,代码如下。
    1. void APM_MINI_SPIInit(void)
    2. {
    3. GPIO_Config_T gpioConfig;
    4. SPI_Config_T spiConfig;

    5. /** Enable related clock*/
    6. RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_SPI1);
    7. RCM_EnableAHBPeriphClock(RCM_AHB_PERIPH_GPIOA);
    8. RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_SYSCFG);

    9. /*屏蔽MISO、SCLK的IO配置*/  
    10. //    GPIO_ConfigPinAF(GPIOA, GPIO_PIN_SOURCE_5, GPIO_AF_PIN0);
    11. //    GPIO_ConfigPinAF(GPIOA, GPIO_PIN_SOURCE_6, GPIO_AF_PIN0);
    12. GPIO_ConfigPinAF(GPIOA, GPIO_PIN_SOURCE_7, GPIO_AF_PIN0);
    13. /** config PIN_5->SCK , PIN_7->MOSI*/
    14. gpioConfig.pin = GPIO_PIN_7;   
    15. gpioConfig.mode = GPIO_MODE_AF;
    16. gpioConfig.outtype = GPIO_OUT_TYPE_PP;
    17. gpioConfig.speed = GPIO_SPEED_50MHz;
    18. gpioConfig.pupd = GPIO_PUPD_PU;
    19. GPIO_Config(GPIOA, &gpioConfig);

    20. //     /** config PIN_4->NSS*/
    21. //    gpioConfig.pin =  GPIO_PIN_4;
    22. //    gpioConfig.outtype = GPIO_OUT_TYPE_PP;
    23. //    gpioConfig.speed = GPIO_SPEED_50MHz;
    24. //    gpioConfig.pupd = GPIO_PUPD_PU;
    25. //    gpioConfig.mode = GPIO_MODE_OUT;
    26. //    GPIO_Config(GPIOA, &gpioConfig);
    27. //    GPIO_SetBit(GPIOA, GPIO_PIN_4);
    28. //
    29. //    /** config PIN_6  MISO*/
    30. //    gpioConfig.pin = GPIO_PIN_6;
    31. //    gpioConfig.mode = GPIO_MODE_AF;
    32. //    gpioConfig.pupd = GPIO_PUPD_PU;
    33. //    gpioConfig.speed = GPIO_SPEED_50MHz;
    34. //    GPIO_Config(GPIOA, &gpioConfig);
    35. /** SPI RESET*/
    36. SPI_Reset(SPI1);
    37. SPI_ConfigStructInit(&spiConfig);

    38. /** SPI configuration*/
    39. spiConfig.polarity = SPI_CLKPOL_LOW;
    40. spiConfig.direction = SPI_DIRECTION_1LINE_TX;/*单线 发送*/
    41. spiConfig.mode = SPI_MODE_MASTER;/*主模式*/
    42. spiConfig.phase = SPI_CLKPHA_1EDGE;
    43. spiConfig.slaveSelect = SPI_SSC_ENABLE;
    44. spiConfig.baudrateDiv = SPI_BAUDRATE_DIV_64;
    45. spiConfig.length = SPI_DATA_LENGHT_8B;
    46. SPI1->CTRL1_B.ISS = SET;
    47. SPI_Config(SPI1, &spiConfig);
    48. SPI_Enable(SPI1);/*SPI使能*/

    49. }


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




您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

29

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

17

主题

29

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部