La bibliothèque matérielle SoC (HWLIB) peut configurer et contrôler les contrôleurs d’interface périphérique série (SPI) SoC. La source HWLIB SPI se trouve dans le fichier /ip/altera/hps/altera_hps/hwlib/src/hwmgr/alt_spi.c.
Le fichier alt_spi.c contient une fonction, alt_spi_mw_config_set, qui configure la taille de trame de contrôle. Toutefois, cela utilise de manière incorrecte la macro ALT_SPIM_CTLR0_DFS_SET définition. Cela entraîne l’écriture de la taille de la trame de contrôle dans le champ de bits Taille de la trame de données dans le registre de contrôle à la place.
Pour contourner ce problème, remplacez le texte « ALT_SPIM_CTLR0_DFS_SET » dans la fonction alt_spi_mw_config_set dans le fichier alt_spi.c par « ALT_SPIM_CTLR0_CFS_SET ». La fonction mise à jour doit être :
//
Définissez les paramètres de configuration sur les registres appropriés pour le mode microfil.
//
ALT_STATUS_CODE alt_spi_mw_config_set(ALT_SPI_DEV_t *spi_dev,
const ALT_SPI_MW_CONFIG_t* cfg)
{
ALT_STATUS_CODE statut = ALT_E_SUCCESS;
if (alt_spi_is_enabled(spi_dev) == ALT_E_TRUE)
{
retourner ALT_E_ERROR;
}
if (alt_spi_checking(spi_dev) == ALT_E_FALSE)
{
retourner ALT_E_BAD_ARG;
}
if ( cfg->ctl_frame_size > ALT_SPI_MW_CTL_FRAME_SIZE_MAX
|| > ALT_SPI_MW_SEQUENTIAL cfg->mode
|| cfg->dir > ALT_SPI_MW_DIR_TX)
{
retourner ALT_E_ARG_RANGE;
}
Définir les paramètres de configuration sur les registres appropriés
uint32_t mwcr_register;
uint32_t mwcr_mask;
Commutateur (spi_dev->op_mode)
{
Cas ALT_SPI_OP_MODE_MASTER :
mwcr_register = ALT_SPIM_MWCR_MWMOD_SET(cfg->mode)
| 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->emplacement), mwcr_mask, mwcr_register);
alt_replbits_word(ALT_SPIM_CTLR0_ADDR(spi_dev->localisation),
ALT_SPIM_CTLR0_CFS_SET_MSK,
ALT_SPIM_CTLR0_CFS_SET(CFG->ctl_frame_size));
Pause;
Cas ALT_SPI_OP_MODE_SLAVE :
mwcr_register = ALT_SPIS_MWCR_MWMOD_SET(cfg->mode)
| 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->emplacement), mwcr_mask, mwcr_register);
alt_replbits_word(ALT_SPIS_CTLR0_ADDR(spi_dev->emplacement),
ALT_SPIS_CTLR0_CFS_SET_MSK,
ALT_SPIS_CTLR0_CFS_SET(CFG->ctl_frame_size));
Pause;
}
l’état du retour;
}
Ce problème est résolu à partir de la version 15.1 de la suite Altera SoC Embedded Design.