Die SoC Hardware Library (HWLIB) kann die SoC Serial Peripheral Interface (SPI) Controller konfigurieren und steuern. Die SPI HWLIB-Quelle befindet sich in der Datei /ip/altera/hps/altera_hps/hwlib/src/hwmgr/alt_spi.c.
Die Datei alt_spi.c enthält die Funktion alt_spi_mw_config_set, mit der die Größe des Steuerungsrahmens konfiguriert wird. Dadurch wird jedoch fälschlicherweise das ALT_SPIM_CTLR0_DFS_SET define macro verwendet. Dies führt dazu, dass die Steuer-Frame-Größe stattdessen in das Bitfeld Datenrahmengröße im Steuerregister geschrieben wird.
Um dieses Problem zu umgehen, ersetzen Sie den Text "ALT_SPIM_CTLR0_DFS_SET " in der alt_spi_mw_config_set-Funktion in der Datei alt_spi.c durch "ALT_SPIM_CTLR0_CFS_SET". Die aktualisierte Funktion sollte wie folgt aussehen:
//
Stellen Sie die Konfigurationsparameter auf die entsprechenden Register für den Mikrodrahtmodus ein.
//
ALT_STATUS_CODE alt_spi_mw_config_set(ALT_SPI_DEV_t *spi_dev,
Const ALT_SPI_MW_CONFIG_t* CFG)
{
ALT_STATUS_CODE Status = ALT_E_SUCCESS;
if (alt_spi_is_enabled(spi_dev) == ALT_E_TRUE)
{
ALT_E_ERROR zurückgeben;
}
if (alt_spi_checking(spi_dev) == ALT_E_FALSE)
{
ALT_E_BAD_ARG zurückgeben;
}
if ( cfg->ctl_frame_size > ALT_SPI_MW_CTL_FRAME_SIZE_MAX
|| CFG->Modus > ALT_SPI_MW_SEQUENTIAL
|| cfg->dir > ALT_SPI_MW_DIR_TX)
{
ALT_E_ARG_RANGE zurückgeben;
}
Setzen Sie die Konfigurationsparameter auf die entsprechenden Register
uint32_t mwcr_register;
uint32_t mwcr_mask;
Switch (spi_dev->op_mode)
{
Fall ALT_SPI_OP_MODE_MASTER:
mwcr_register = ALT_SPIM_MWCR_MWMOD_SET(cfg->Modus)
| 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->Lage), mwcr_mask, mwcr_register);
alt_replbits_word(ALT_SPIM_CTLR0_ADDR(spi_dev->Lage),
ALT_SPIM_CTLR0_CFS_SET_MSK,
ALT_SPIM_CTLR0_CFS_SET(cfg->ctl_frame_size));
Brechen;
Fall ALT_SPI_OP_MODE_SLAVE:
mwcr_register = ALT_SPIS_MWCR_MWMOD_SET(cfg->Modus)
| 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->Lage), mwcr_mask, mwcr_register);
alt_replbits_word(ALT_SPIS_CTLR0_ADDR(spi_dev->Lage),
ALT_SPIS_CTLR0_CFS_SET_MSK,
ALT_SPIS_CTLR0_CFS_SET(cfg->ctl_frame_size));
Brechen;
}
Rückgabestatus;
}
Dieses Problem wurde ab Version 15.1 der Altera SoC Embedded Design Suite behoben.