在线时间372 小时
UID3135871
注册时间2016-10-9
NXP金币20
TA的每日心情 | 怒 2024-2-5 12:06 |
---|
签到天数: 627 天 [LV.9]以坛为家II
版主
- 积分
- 4429
- 最后登录
- 2024-2-5
|
本帖最后由 胤幻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:
- SWM_SetMovablePinSelect(SWM0, kSWM_SPI1_MISO, kSWM_PortPin_P0_26);
复制代码 然后读写FLASH ,一且正常,然后到运行OLED时,我想把P0_26切回到普通GPIO模块上:
- //DC-->P0-26
- gpio_pin_config_t gpio0_pin0_26 = {
- .pinDirection = kGPIO_DigitalOutput,
- .outputLogic = 0U,
- };
- // Initialize GPIO functionality on pin PIO0_26 (pin )
- GPIO_PinInit(GPIO, 0U, 26U, &gpio0_pin0_26);
- //DC P0_26
- IOCON->PIO[22] = ((IOCON->PIO[22] &
- /* Mask bits to zero which are setting */
- (~(IOCON_PIO_MODE_MASK)))
- /* Selects function mode (on-chip pull-up/pull-down resistor control).: Inactive. Inactive (no
- * pull-down/pull-up resistor enabled). */
- | IOCON_PIO_MODE(PIO0_26_MODE_PULLUP));
复制代码 时钟均已使能,但是OLED就是无反应。感觉P0_26仍在SPI1_MOSI上面,咋办,发现库里没有松绑的这个函数:
结合参考手册和原库里面绑定的代码,进行修改:
寄存器操作说明:
我们知道低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就复活了~
|
|