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 開始修復。