2017-07-19 4 views
-1

J'essaie de lire l'octet de RFID qui représente le numéro de version de l'appareil. En utilisant le protocole SPI, j'obtiens 0x92 octet (RC522 version 2.0), et l'octet de demande est 0x37. Tout fonctionne bien sauf les positions de l'octet. Avant que j'obtienne le bon (0x92) comme prévu pour obtenir ce que je ne sais pas pourquoi il est imprimé. La sortie:Récupérer les données parasites avant que l'octet de droite n'arrive. SPID RFID

 Hello, world 
received: 1 
received: 92 
= v2.0 
received: 0 
received: 92 
= v2.0 
received: 0 
received: 92 
= v2.0 
received: 0 
received: 92 
= v2.0 
received: 0 
received: 92 
= v2.0 

je l'ai dit, bien Ok, laissez-moi simplement supprimer la printf("received: %x\n", data); \ linefrom la bibliothèque spi.h. Mais alors je n'ai rien imprimé (sauf Hello World). Une autre fonction qui devrait imprimer seulement "version 2.0" quand 92h retourné ne le fera pas, pourquoi- parce que la variable v retournée est 9f au lieu de 92 et toutes les précédentes sont différentes. Peut-être que je devrais placer un peu d'attente ou de retarder la fonction afin de laisser le RC522 exécuter la commande? Et juste après l'avoir laissé imprimer. Mais même si cela se produisait, pourquoi la suppression printf brise toute la sortie? Voici le code où SPI_READ est en appelé de:

static uint8_t 
read_register_rfid(uint8_t dev_cmd) 
{ 
    uint8_t ret = 0; 
    GPIO_CLR_PIN(GPIO_C_BASE, GPIO_PIN_1); 
    SPI_WRITE(((dev_cmd << 1) & 0x7e) | 0x80); 
    SPI_READ(ret); 
    GPIO_SET_PIN(GPIO_C_BASE, GPIO_PIN_1); 
    return ret; 
} 

et la fonction de vérification de la version:

void 
test_ver() 
{ 
    uint8_t reg=1; 
    // Get the MFRC522 firmware version 
    uint8_t v = 0; 
    while(reg!=0xa){ 
    v = read_register_rfid(0x37); 
    //printf("%x\n", v); 
    // Lookup which version 
    switch(v) { 
     case 0x88: printf(" = (clone)"); break; 
     case 0x90: printf(" = v0.0");  break; 
     case 0x91: printf(" = v1.0");  break; 
     case 0x92: printf(" = v2.0\n");  break; 
     // default: printf(" = (unknown)\n"); 
    } 
    reg++; 
    //When 0x00 or 0xFF is returned, communication probably failed 
    } 
    if ((v == 0x00) || (v == 0xFF)) 
    printf("WARNING: Communication failure?\n"); 
} 
+0

N'utilisez jamais une macro qu'une fonction fera aussi bien! Et nous ne savons même pas que le matériel est correct, moins ce que les appareils sont censés transmettre. Utilisez le débogueur et un analyseur de portée ou logique. – Olaf

+0

@Olaf pourriez-vous me conseiller un débogueur pour cela? –

+0

Poser des questions sur les outils est explicitement hors sujet. Mais vous devriez utiliser le débogueur qui vient avec votre toolchain ou celui qui est sutable pour cela. Pour une portée/LA voir google. – Olaf

Répondre

0

Ici, je partage des fonctions mises à jour pour la lecture et l'écriture à RC522 en utilisant la bibliothèque SPI:

void 
writeMFRC522(uint8_t adr, uint8_t val) 
{ 
    GPIO_CLR_PIN(GPIO_C_BASE, GPIO_PIN_1); 
    GPIO_CLR_PIN(GPIO_C_BASE, GPIO_PIN_1); 
    SPI_WRITE((adr << 1) & 0x7e); 
    SPI_WRITE(val); 
    SPI_FLUSH(); 
    //printf("456\n"); 
    GPIO_SET_PIN(GPIO_C_BASE, GPIO_PIN_1); 
} 


static uint8_t 
readMFRC522(uint8_t dev_cmd) 
{ 
    uint8_t ret = 0x0; 
    GPIO_CLR_PIN(GPIO_C_BASE, GPIO_PIN_1); 
    GPIO_CLR_PIN(GPIO_C_BASE, GPIO_PIN_1); 

    SPI_WRITE(((dev_cmd << 1) & 0x7e) | 0x80); 
    SPI_READ(ret); 

    ret = 0; 
    SPI_WRITE(0x00); 
    SPI_READ(ret); 

    GPIO_SET_PIN(GPIO_C_BASE, GPIO_PIN_1); 
    return ret; 
} 
+0

J'ai supprimé tous les changements 'printf();' dans la macro –