La biblioteca de hardware del sistema integrado en chip (HWLIB) puede configurar y controlar los controladores de interfaz periférica en serie (SPI) del sistema integrado en chip. El origen HWLIB de SPI se puede encontrar en el archivo /ip/altera/hps/altera_hps/hwlib/src/hwmgr/alt_spi.c.
El archivo alt_spi.c contiene una función, alt_spi_mw_config_set, que configura el tamaño del marco de control. Sin embargo, esto utiliza incorrectamente la macro ALT_SPIM_CTLR0_DFS_SET define. Esto hace que el tamaño del fotograma de control se escriba en el campo de bits Tamaño de fotograma de datos en el registro de control.
Para evitar este problema, reemplace el texto "ALT_SPIM_CTLR0_DFS_SET " dentro de la función alt_spi_mw_config_set en el archivo alt_spi.c con "ALT_SPIM_CTLR0_CFS_SET". La función actualizada debe ser:
//
Establezca los parámetros de configuración en los registros apropiados para el modo de microcable.
//
ALT_STATUS_CODE alt_spi_mw_config_set(ALT_SPI_DEV_t *spi_dev,
const ALT_SPI_MW_CONFIG_t* CFG)
{
ALT_STATUS_CODE estado = ALT_E_SUCCESS;
if (alt_spi_is_enabled(spi_dev) == ALT_E_TRUE)
{
devolver ALT_E_ERROR;
}
if (alt_spi_checking(spi_dev) == ALT_E_FALSE)
{
devolver ALT_E_BAD_ARG;
}
if ( cfg->ctl_frame_size > ALT_SPI_MW_CTL_FRAME_SIZE_MAX
|| > ALT_SPI_MW_SEQUENTIAL en modo > CFG
|| cfg->dir > ALT_SPI_MW_DIR_TX)
{
devolver ALT_E_ARG_RANGE;
}
Establecer los parámetros de configuración en los registros apropiados
uint32_t mwcr_register;
uint32_t mwcr_mask;
Conmutador (spi_dev->op_mode)
{
Caso ALT_SPI_OP_MODE_MASTER:
mwcr_register = ALT_SPIM_MWCR_MWMOD_SET(cfg->modo)
| 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->ubicación), mwcr_mask, mwcr_register);
alt_replbits_word(ALT_SPIM_CTLR0_ADDR(spi_dev->ubicación),
ALT_SPIM_CTLR0_CFS_SET_MSK,
ALT_SPIM_CTLR0_CFS_SET(cfg->ctl_frame_size));
Romper;
Caso ALT_SPI_OP_MODE_SLAVE:
mwcr_register = ALT_SPIS_MWCR_MWMOD_SET(cfg->modo)
| 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->ubicación), mwcr_mask, mwcr_register);
alt_replbits_word(ALT_SPIS_CTLR0_ADDR(spi_dev->ubicación),
ALT_SPIS_CTLR0_CFS_SET_MSK,
ALT_SPIS_CTLR0_CFS_SET(cfg->ctl_frame_size));
Romper;
}
estado de retorno;
}
Esto se solucionó a partir de la versión 15.1 del Altera SoC Embedded Design Suite.