|
使用FB_CS0和FB_CS2,2个外部器件,用FSDK 1.2的FLEXBUS_DRV_Init()初始化时发现只能初始化FB_CS0,后经分析FSDK源码发现如下问题:
flexbus_status_t FLEXBUS_DRV_Init(uint32_t instance, const flexbus_user_config_t *fb_config)
{
assert(instance < FB_INSTANCE_COUNT);
FB_Type* fbbase = g_fbBase[instance];
if(!fb_config)
{
return kStatus_FLEXBUS_InvalidArgument;
}
/* clock setting initialization.*/
CLOCK_SYS_EnableFlexbusClock(instance);
/* Reset all the register to default state.*/
FLEXBUS_HAL_Init(fbbase);
/* Configure all the register to a known state */
FLEXBUS_HAL_Configure(fbbase, fb_config);
return kStatus_FLEXBUS_Success;
}
每次FLEXBUS_DRV_Init()均会调用FLEXBUS_HAL_Init(),其代码如下:
void FLEXBUS_HAL_Init(FB_Type* base)
{
int chip = 0;
uint32_t reg_value = 0x0;
for (chip = 0; chip < FB_CSAR_COUNT; chip++)
{
/* Reset CSMR register, all chips not valid (disabled).*/
FB_WR_CSMR(base, chip, 0x0U);
/* Set default base addr */
FB_BWR_CSAR_BA(base, chip, 0x0000U);
/* Reset FB_CSCRx register */
FB_WR_CSCR(base, chip, 0x00U);
}
/* Set FB_CSPMCR register*/
/* FlexBus signal group 1 multiplex control.*/
reg_value |= kFlexbusMultiplexGroup1_FB_ALE << FB_CSPMCR_GROUP1_SHIFT;
/* FlexBus signal group 2 multiplex control.*/
reg_value |= kFlexbusMultiplexGroup2_FB_CS4 << FB_CSPMCR_GROUP2_SHIFT;
/* FlexBus signal group 3 multiplex control.*/
reg_value |= kFlexbusMultiplexGroup3_FB_CS5 << FB_CSPMCR_GROUP3_SHIFT;
/* FlexBus signal group 4 multiplex control.*/
reg_value |= kFlexbusMultiplexGroup4_FB_TBST << FB_CSPMCR_GROUP4_SHIFT;
/* FlexBus signal group 5 multiplex control.*/
reg_value |= kFlexbusMultiplexGroup5_FB_TA << FB_CSPMCR_GROUP5_SHIFT;
/* Write to CSPMCR register.*/
FB_WR_CSPMCR(base, reg_value);
}
可见,每次FLEXBUS_HAL_Init()均会清除CSMR, CSAR, CSCR等寄存器,因而导致第二次调用FLEXBUS_DRV_Init()时会清除上次的设置。
因此想问,如何使用FSDK1.2来分配FLEXBUS给多个CS?初始化第二个chip要用HAL层的函数吗?
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|