SoC 硬件库 (HWLIB) 可以配置和控制 SoC 串行外设接口 (SPI) 控制器。SPI HWLIB 源代码可以在 /ip/altera/hps/altera_hps/hwlib/src/hwmgr/alt_spi.c 文件中找到。
alt_spi.c 文件包含一个函数 alt_spi_mw_config_set,用于配置控制帧大小。但是,这会错误地使用ALT_SPIM_CTLR0_DFS_SET定义宏。这会导致控制帧大小被写入控制寄存器中的数据帧大小位字段。
要变通解决此问题,请将 alt_spi.c 文件中的alt_spi_mw_config_set函数中的“ALT_SPIM_CTLR0_DFS_SET”文本替换为“ALT_SPIM_CTLR0_CFS_SET”。更新后的函数应为:
//
将配置参数设置为适用于微线模式的寄存器。
//
ALT_STATUS_CODE alt_spi_mw_config_set(ALT_SPI_DEV_t *spi_dev,
const ALT_SPI_MW_CONFIG_t* cfg)
{
ALT_STATUS_CODE状态 = ALT_E_SUCCESS;
if (alt_spi_is_enabled(spi_dev) == ALT_E_TRUE)
{
返回ALT_E_ERROR;
}
if (alt_spi_checking(spi_dev) == ALT_E_FALSE)
{
返回ALT_E_BAD_ARG;
}
if ( cfg->ctl_frame_size > ALT_SPI_MW_CTL_FRAME_SIZE_MAX
||cfg->mode > ALT_SPI_MW_SEQUENTIAL
||cfg->dir > ALT_SPI_MW_DIR_TX)
{
返回ALT_E_ARG_RANGE;
}
将配置参数设置为适当的寄存器
uint32_t mwcr_register;
uint32_t mwcr_mask;
交换机 (spi_dev->op_mode)
{
案例ALT_SPI_OP_MODE_MASTER:
mwcr_register = ALT_SPIM_MWCR_MWMOD_SET(cfg->模式)
|ALT_SPIM_MWCR_MDD_SET(CFG->目录)
|ALT_SPIM_MWCR_MHS_SET(CFG->handshake_enabled);
mwcr_mask = ALT_SPIM_MWCR_MWMOD_SET_MSK
|ALT_SPIM_MWCR_MDD_SET_MSK
|ALT_SPIM_MWCR_MHS_SET_MSK;
alt_replbits_word(ALT_SPIM_MWCR_ADDR(spi_dev->位置), mwcr_mask, mwcr_register);
alt_replbits_word(ALT_SPIM_CTLR0_ADDR(spi_dev->位置),
ALT_SPIM_CTLR0_CFS_SET_MSK,
ALT_SPIM_CTLR0_CFS_SET(CFG->ctl_frame_size));
打破;
案例 ALT_SPI_OP_MODE_SLAVE:
mwcr_register = ALT_SPIS_MWCR_MWMOD_SET(cfg->模式)
|ALT_SPIS_MWCR_MDD_SET(CFG->目录);
mwcr_mask = ALT_SPIS_MWCR_MWMOD_SET_MSK
|ALT_SPIS_MWCR_MDD_SET_MSK;
alt_replbits_word(ALT_SPIS_MWCR_ADDR(spi_dev->位置), mwcr_mask, mwcr_register);
alt_replbits_word(ALT_SPIS_CTLR0_ADDR(spi_dev->位置),
ALT_SPIS_CTLR0_CFS_SET_MSK,
ALT_SPIS_CTLR0_CFS_SET(CFG->ctl_frame_size));
打破;
}
返回状态;
}
从 Altera SoC 嵌入式设计套件版本 15.1 开始,此问题已修复。