« Micro contrôleurs AVR/Travail pratique/Télécommande NRF24L01 pour Robot » : différence entre les versions

Contenu supprimé Contenu ajouté
Ligne 698 :
=== Exercice 6 ===
L'objectif de cet exercice est de réaliser une communication fonctionnelle entre la télécommande donnée et votre crircuit. Pour cela vous réaliserez :
* utiliser la définition de certaines constantes en les disposant en début de programme ou mieux dans un fichier .h
* un sous-programme capable d'écrire et lire un octet SPI dans la NRF24L01 qui est similaire à ce qu'on a fait pour le SPI mais ne gère pas la sélection de l'esclave '''CSN''' :
<syntaxhighlight lang="C">
#define CONFIG 0x00
// ne gère pas CSN
#define EN_AA 0x01
uint8_t SPI_NRF24_RW(uint8_t data);
#define EN_RXADDR 0x02
#define SETUP_AW 0x03
#define SETUP_RETR 0x04
#define RF_CH 0x05
#define RF_SETUP 0x06
#define STATUS 0x07
#define OBSERVE_TX 0x08
#define CD 0x09
#define RX_ADDR_P0 0x0A
#define RX_ADDR_P1 0x0B
#define RX_ADDR_P2 0x0C
#define RX_ADDR_P3 0x0D
#define RX_ADDR_P4 0x0E
#define RX_ADDR_P5 0x0F
#define TX_ADDR 0x10
#define RX_PW_P0 0x11
#define RX_PW_P1 0x12
#define RX_PW_P2 0x13
#define RX_PW_P3 0x14
#define RX_PW_P4 0x15
#define RX_PW_P5 0x16
#define FIFO_STATUS 0x17
/* Instruction Mnemonics */
#define R_REGISTER 0x00
#define W_REGISTER 0x20
#define REGISTER_MASK 0x1F
#define R_RX_PAYLOAD 0x61
#define W_TX_PAYLOAD 0xA0
#define FLUSH_TX 0xE1
#define FLUSH_RX 0xE2
#define REUSE_TX_PL 0xE3
#define NOP 0xFF
 
#define TX_ADR_WIDTH 5 // send address length, the maxium length is 5 5*8=40 bit
#define RX_ADR_WIDTH 5 // receive date length
#define TX_PLOAD_WIDTH 4 // send bytes length
#define RX_PLOAD_WIDTH 4 // Receive bytes length
uint8_t TX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; //send address
uint8_t RX_ADDRESS[RX_ADR_WIDTH]={'s','e','r','v','1'}; //receive address
 
</syntaxhighlight>
* un sous-programme capable de passer le NRF24 en mode réception :
<syntaxhighlight lang="C">
// passage en mode reception du NRF24
void SetRX_Mode(void);
</syntaxhighlight>
 
* un sous-programme capable d'écrire dans un registre "reg" une valeur "value" :
<syntaxhighlight lang="C">
// lecture des 32 bits reçus si c'est le cas
// écriture d'une valeur dans un registre : ajouter W_REGISTER dans reg
uint8_t SPI_NRF24_W_RegnRF24L01_RxPacket(uint8_t* reg, uint8_t valuerx_buf);
</syntaxhighlight>
====Indications pour l'exercice 6====
Il va vous falloir rentrer dans la documentation pour réaliser cet exercice.
 
Commençons par documenter le sous-programme setRX_Mode. Voilà les opérations qu'il doit exécuter pour être compatible avec la télécomande et sa bibliothèque MIRF :
* passage de CE ('''PB0''') en sortie
* passage de CE à 0
* écriture dans RX_ADDR_P1 de l'adresse de réception qui se trouve dans le tableau RX_ADDRESS
<syntaxhighlight lang="C">
uint8_t RX_ADDRESS[RX_ADR_WIDTH]={'s','e','r','v','1'}; //receive address
</syntaxhighlight>
* écriture dans RX_ADDR_P1 de l'adresse d'émission qui se trouve dans le tableau TX_ADDRESS
<syntaxhighlight lang="C">
uint8_t TX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; //send address
</syntaxhighlight>
* écriture dans le registre RF_CH de la valeur 1
* écriture dans le registre RX_PW_P0 de la valeur 4 (4 octets reçus)
* écriture dans le registre RX_PW_P1 de la valeur 4 (4 octets envoyés)
* mise en route de la réception : écriture dans le registre CONFIG des bits EN_CRC,PWR_UP et PRIM_RX (valeur 0x0B en tout)
* passage de CE à 1
* écriture dans le registre STATUS des bits TX_DS et MAX_RT
* écriture de l'instruction flushRx avec un SPIMasterSend
 
 
Ligne 848 ⟶ 914 :
}
 
// EcritureÉcriture de données dans un registre
uint8_t SPI_NRF24_W_Reg_Buf(uint8_t reg, uint8_t *pBuf, uint8_t bytes)
{