查看: 1295|回复: 0

[讨论] 关于LPC845 GPIO的SWM功能的绑定和松绑~

[复制链接]
  • TA的每日心情

    2024-2-5 12:06
  • 签到天数: 627 天

    [LV.9]以坛为家II

    94

    主题

    1628

    帖子

    2

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    4429

    热心会员

    最后登录
    2024-2-5
    发表于 2021-1-15 14:18:09 | 显示全部楼层 |阅读模式
    本帖最后由 胤幻1988 于 2021-1-15 14:30 编辑

    之前不是画了个LPC845的板么,最近一直有空就在调了玩。其中SPI FLASH 和 OLED共用一个SPI,之前把LPC845的SWM分配功能理解成了类似STM32的引脚复用功能,但是后来发现却不是那么回事。当然也可能是我学的还不到位,没找到其中的玄机。
    W25Q64 SPI FLASH 的驱动,用到SPI的SCK MOSI MISO CS四个引脚,而OLED 使用到了 SCK MOSI 2个引脚,其中MISO(P0_27) 被我分配给了oled的DC,即命令/数据引脚。我原本的想法时,用到W25Q64时,就把P0_27通过SWM配置成SPI的MISO,然后用到oled时,再把P0_27配置成普通数字GPIO引脚,这样就可以分时复用了。这个方案在STM32上,用了好久了,没啥毛病。但是今天在LPC845上面却栽了个跟头~
    FLASH要先运行,所以初始化的时候就配置成了SPI 的 MISO:
    1. SWM_SetMovablePinSelect(SWM0, kSWM_SPI1_MISO, kSWM_PortPin_P0_26);
    复制代码
    然后读写FLASH ,一且正常,然后到运行OLED时,我想把P0_26切回到普通GPIO模块上:
    1. //DC-->P0-26
    2.         gpio_pin_config_t gpio0_pin0_26 = {
    3.                 .pinDirection = kGPIO_DigitalOutput,
    4.                 .outputLogic = 0U,
    5.         };
    6.         // Initialize GPIO functionality on pin PIO0_26 (pin )
    7.         GPIO_PinInit(GPIO, 0U, 26U, &gpio0_pin0_26);

    8. //DC P0_26
    9.         IOCON->PIO[22] = ((IOCON->PIO[22] &
    10.                                           /* Mask bits to zero which are setting */
    11.                                           (~(IOCON_PIO_MODE_MASK)))

    12.                                          /* Selects function mode (on-chip pull-up/pull-down resistor control).: Inactive. Inactive (no
    13.                                           * pull-down/pull-up resistor enabled). */
    14.                                          | IOCON_PIO_MODE(PIO0_26_MODE_PULLUP));
    复制代码
    时钟均已使能,但是OLED就是无反应。感觉P0_26仍在SPI1_MOSI上面,咋办,发现库里没有松绑的这个函数:
    结合参考手册和原库里面绑定的代码,进行修改:
    寄存器操作说明:
    M2.jpg
    我们知道低8位即可操作与SPI1_MISO绑定的对应引脚:
    原库绑定函数:void SWM_SetMovablePinSelect(SWM_Type *base, swm_select_movable_t func, swm_port_pin_type_t swm_port_pin)
    {
        /* Check arguments */
        assert(NULL != base);
        assert(func < kSWM_MOVABLE_NUM_FUNCS);

        uint32_t temp;
        uint32_t pinassign = 0;
        uint32_t shifter   = 0;

        pinassign = (uint32_t)func / 4U;
        shifter   = ((uint32_t)func % 4U) * 8U;

        temp = base->PINASSIGN_DATA[pinassign];
        temp &= ~(0xFFUL << (shifter));
        temp |= ((uint32_t)swm_port_pin << shifter);
        base->PINASSIGN_DATA[pinassign] = temp;
    }

    我们直接修改,把配置新引脚去掉,这样就没有绑定了:
    void SWM_ReleaseMovablePinSelect(SWM_Type *base, swm_select_movable_t func, swm_port_pin_type_t swm_port_pin)
    {

       /* Check arguments */
            assert(NULL != base);
            assert(func < kSWM_MOVABLE_NUM_FUNCS);

            uint32_t temp;
            uint32_t pinassign = 0;
            uint32_t shifter   = 0;

            pinassign = (uint32_t)func / 4U;
            shifter   = ((uint32_t)func % 4U) * 8U;

            temp = base->PINASSIGN_DATA[pinassign];
            temp &= ~(0xFFUL << (shifter));
            //temp |= ((uint32_t)swm_port_pin << shifter);

            //temp |= ((uint32_t)swm_port_pin << shifter);
            base->PINASSIGN_DATA[pinassign] = temp;

    }

    运行代码,能够完全切换过来,这样我的复用的SPI OLED就复活了~
    M3.jpg


    哎...今天够累的,签到来了~
    回复

    使用道具 举报

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

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-25 19:19 , Processed in 0.129129 second(s), 20 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表