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;
}
만약에 ( 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->dir)
| 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->dir);
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 Embedded Design Suite 버전 15.1부터 해결되었습니다.