J'utilise le uC pour recevoir et transmettre des données sur SPI2 en mode esclave avec la configuration suivante:STM32072RB ne reçoit pas/envoyer des données sur SPI en mode esclave
CR1 = 0x0078, CR2 = 0x0700, AFRH = 0x55353500 , MODER = 0xa2a0556a
L'APB1ENR est également configuré correctement.
Le programme en cours vérifie simplement l'indicateur RXNE, lit les données reçues de DR et envoie une valeur aléatoire à DR. Le registre d'état lorsque je reçois des données a la valeur suivante: SR = 0x1403 Le maître envoie les données correctement et j'ai vérifié les signaux sur les broches esclaves (phase d'horloge et la polarité sont identiques des deux côtés et le signal NSS est effacé avant d'envoyer SCK et des données sur MOSI). J'ai même configuré les broches comme entrées et je sais que je pourrais lire n'importe quel signal numérique que le maître pourrait envoyer. Avec la configuration actuelle, il semble que l'esclave reçoive quelque chose parce que le RXNE est activé lorsque le maître envoie des données mais que la valeur lue est toujours 0x00. J'ai essayé différentes configurations (logiciel/matériel NSS, différentes tailles de données ...) mais j'obtiens toujours 0x00. De plus, la valeur aléatoire que j'envoie après avoir lu DR n'est pas envoyée aux sorties. C'est ma fonction actuelle, qui est appelée en continu:
unsigned char spi_rx_slave(unsigned char spiPort, unsigned char *receiveBuffer)
{
uint8_t temp;
static unsigned long sr;
if (!spi_isOpen(spiPort))
{
sendDebug("%s() Error: spiPort not in use!\r\n",__func__);
return false;
}
if (spiDescriptor[spiPort]->powerdown == true)
{
sendDebug("%s() Error: spiPort in powerdown!\r\n",__func__);
return false;
}
/* wait till spi is not busy anymore */
while((spiDescriptor[spiPort]->spiBase->SR) & SPI_SR_BSY)
{
sendDebug("SPI is busy(1)\r\n");
vTaskDelay(2);
}
sendDebug("CR1 = 0x%04x, ", spiDescriptor[spiPort]->spiBase->CR1);
sendDebug("CR2 = 0x%04x, ", spiDescriptor[spiPort]->spiBase->CR2);
sendDebug("AFRH address = 0x%08x, AFRH value = %08x, ", (unsigned long*)(GPIOB_BASE+0x24), *(unsigned long*)(GPIOB_BASE+0x24));
sendDebug("MODER address = 0x%08x, MODER value = %08x\r\n", (unsigned long*)(GPIOB_BASE), *(unsigned long*)(GPIOB_BASE));
sr = spiDescriptor[spiPort]->spiBase->SR;
while(sr & SPI_SR_RXNE)
{
/* get rx byte */
temp = *(uint8_t *)&(spiDescriptor[spiPort]->spiBase->DR);
spiDescriptor[spiPort]->spiBase->DR = 0x53;
sendDebug("-------->DR address = 0x%08x, data received: 0x%02x\r\n", &spiDescriptor[spiPort]->spiBase->DR, temp);
sendDebug("SR = 0x%04x\r\n", sr);
vTaskDelay(1);
sr = spiDescriptor[spiPort]->spiBase->SR;
}
while((spiDescriptor[spiPort]->spiBase->SR) & SPI_SR_BSY)
{
sendDebug("SPI is busy(2)\r\n");
vTaskDelay(2);
}
return true;
}
Qu'est-ce que je fais mal? Y a-t-il quelque chose que je n'ai pas configuré correctement? Merci d'avance. Cordialement, Javier
_ "CR1 = 0x0078, CR2 = 0x0700, AFRH = 0x55353500, MODER = 0xa2a0556a" _ Tout d'abord rendre votre question et la configuration lisible par l'homme. Respectez notre temps. –
Votre maître génère-t-il l'horloge. Sinon, vous n'enverrez rien. Vous devez lancer DR en byte si vous voulez envoyer un octet. –
Oui, le maître génère correctement l'horloge et la réception de cette horloge fait que le SPI active le drapeau RXNE. – JaviC