2017-06-21 1 views
2

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

+1

_ "CR1 = 0x0078, CR2 = 0x0700, AFRH = 0x55353500, MODER = 0xa2a0556a" _ Tout d'abord rendre votre question et la configuration lisible par l'homme. Respectez notre temps. –

+0

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. –

+0

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

Répondre

0

Je suis passé au logiciel NSS et j'ai copié les valeurs du registre à partir d'un exemple de CUBE trouvé en ligne. Je ne peux pas utiliser ces bibliothèques pour ce projet mais j'aimerais avoir le même comportement. Les nouvelles valeurs sont:

CR1 = 0x0278 ce qui signifie fPCLK/256 (le bon pour la vitesse de communication), SPI activé et SSM = 1 (logiciel NSS). Ce qui signifie que les données à 8 bits et l'événement RXNE sont générés si le niveau FIFO est supérieur ou égal à 1/4 (8 bits).

AFRH = 0x55303500, MODER = 0xa8a1556a ce qui signifie MISO, MOSI et SCK fonction alternative 5 (SPI2). NSS n'est pas configuré car il est maintenant en mode logiciel (l'esclave est toujours sélectionné).

Je reçois toujours les mêmes résultats et l'evalkit avec ces bibliothèques fonctionne bien avec SPI1 à la place. Par conséquent, il doit y avoir un autre problème qui n'a rien à voir avec les valeurs de registre ... peut-il y avoir un problème d'horloge, par exemple. les broches ont besoin d'une horloge? Merci!