AvrIO  1.4.5
Bibliothèque C modulaire pour ATMEL AVR
afsk.h
1 
21 #ifndef _AVRIO_AFSK_H_
22 #define _AVRIO_AFSK_H_
23 
24 #include <avrio/defs.h>
25 
26 __BEGIN_C_DECLS
27 /* ========================================================================== */
28 #include <stdio.h>
29 #include <avrio/hdlc.h>
30 
57 /* constants ================================================================ */
72 #define AFSK_RXFIFO_OVERRUN -2
73 
87 #define AFSK_MODE_NOBLOCK 0x80
88 
90 /* public variables ========================================================= */
104 extern FILE xAfskPort;
105 
106 /* internal public functions ================================================ */
107 
108 #if defined(__DOXYGEN__)
109 /*
110  * __DOXYGEN__ defined
111  * Partie documentation ne devant pas être compilée.
112  * ===========================================================================*/
113 
114 
115 /* internal public functions ================================================ */
116 
126 void vAfskInit (uint8_t ucMode);
127 
131 bool bAfskSending (void);
132 
136 bool bAfskReceiving (void);
137 
141 bool bAfskDcd (void);
142 
146 uint8_t ucAfskGetRssi (void);
147 
151 void vAfskSetRssiTh (uint8_t ucRssi);
152 
156 uint8_t ucAfskGetRssiTh (void);
157 
170 void vAfskToneSet (uint16_t usTxPhaseInc);
171 
178 void vAfskToneToggle (void);
179 
180 
195 #define CONFIG_AFSK_RX_BUFLEN
196 
202 #define CONFIG_AFSK_TX_BUFLEN
203 
211 #define CONFIG_AFSK_PREAMBLE_LEN
212 
220 #define CONFIG_AFSK_TRAILER_LEN
221 
222 
238 /* constants ================================================================ */
244 #define AFSK_BAUDRATE 1200L
245 
251 #define AFSK_MARK_FREQ 1200L
252 
258 #define AFSK_SPACE_FREQ 2200L
259 
269 #define AFSK_SAMPLES_PER_BIT 8L
270 
276 #define AFSK_DAC_RESOLUTION 4
277 
285 #define AFSK_TXONLY_vect
286 
294 void vAfskHwInit (void);
295 
306 void vAfskHwDacWrite (uint16_t usValue);
307 
315 void vAfskHwTxEnable (void);
316 
324 void vAfskHwTxDisable (void);
325 
326 
338 int8_t iAfskHwAdcRead (void);
339 
348 void vAfskHwDcdOn (void);
349 
358 void vAfskHwDcdOff (void);
359  // Fin du Driver
366 /* ========================================================================== */
367 #else
368 /*
369  * __DOXYGEN__ not defined
370  * Partie ne devant pas être documentée.
371  * =============================================================================
372  */
373 #include <string.h>
374 #include <util/atomic.h>
375 #include <avrio/queue.h>
376 #include "avrio-board-afsk.h"
377 
378 #if defined(AFSK_TX_DISABLE) && defined(AFSK_RX_DISABLE)
379 #error "AFSK_TX_DISABLE and AFSK_RX_DISABLE can not be defined at the same time !"
380 #endif
381 
382 #if !defined(AFSK_RX_DISABLE) && (AFSK_SAMPLES_PER_BIT != 8)
383 #warning "AFSK_RX_DISABLE not defined: AFSK_SAMPLES_PER_BIT was redefined to 8"
384 #undef AFSK_SAMPLES_PER_BIT
385 #define AFSK_SAMPLES_PER_BIT 8L
386 #endif
387 
388 /* constants ================================================================ */
389 // Nombre d'échantillon de la sinusoide par le module
390 #define AFSK_SINWAVE_LEN 512L
391 
392 // Codage sinus entre 0 et 255
393 #define AFSK_SINWAVE_RESOLUTION 8
394 
395 // Macro pour la mise à l'échelle de la valeur envoyée au DAC
396 #if AFSK_SINWAVE_RESOLUTION > AFSK_DAC_RESOLUTION
397 #define AFSK_DAC_VALUE(_v) ((_v)>>(AFSK_SINWAVE_RESOLUTION-AFSK_DAC_RESOLUTION))
398 #elif AFSK_SINWAVE_RESOLUTION < AFSK_DAC_RESOLUTION
399 #define AFSK_DAC_VALUE(_v) ((_v)<<(AFSK_DAC_RESOLUTION-AFSK_SINWAVE_RESOLUTION))
400 #else
401 #define AFSK_DAC_VALUE(_v) (_v)
402 #endif
403 
404 /* macros =================================================================== */
405 #define AFSK_PHASE_INC(_freq) (((_freq)*AFSK_SINWAVE_LEN)/AFSK_BAUDRATE/AFSK_SAMPLES_PER_BIT)
406 
407 // Incrément de phase pour la MARK
408 #define AFSK_MARK_INC AFSK_PHASE_INC(AFSK_MARK_FREQ)
409 
410 // Incrément de phase pour la SPACE
411 #define AFSK_SPACE_INC AFSK_PHASE_INC(AFSK_SPACE_FREQ)
412 
413 /* structures =============================================================== */
414 typedef struct xAfsk {
415 
416 #ifndef AFSK_TX_DISABLE
417  // Transmetteur
418  uint16_t usTxPhase; // Phase de la sinusoide
419  uint16_t usTxPhaseInc; // Incrément de phase de la sinusoide
420  uint8_t ucTxSampleCnt; // Compteur du nombre d'échantillons par temps de bit
421  uint8_t ucTxByte; // Octet en cours de transmission
422  uint8_t ucTxBit; // Masque sur le bit en cours de transmission
423  uint8_t ucTxStuffCnt; // Compteur du nombre de bit successifs à 1
424  uint8_t ucPreambleCnt; // Compteur du nombre de HDLC_FLAG à tramsmettre avant la trame
425  uint8_t ucTrailerCnt; // Compteur du nombre de HDLC_FLAG à tramsmettre après la trame
426 
427  xQueue xTxFifo; // Pile des octets à transmettre
428  uint8_t ucTxBuffer[CONFIG_AFSK_TX_BUFLEN]; // Buffer de la pile de transmission
429 #endif
430 
431 #ifndef AFSK_RX_DISABLE
432  // Récepteur
433  uint8_t ucRxBitCnt;
434  uint8_t ucRxBitStream;
435  uint8_t ucRxByte;
436  uint8_t ucCarrierCnt;
437  /*
438  * Accumulateur de phase actuelle
439  * Permet de savoir quand le bit doit être échantillonné
440  */
441  int8_t iRxPhaseAcc;
442 
443  /*
444  * Bits trouvés à la vitesse de modulation correcte
445  */
446  uint8_t ucDataBits;
447 
448  xQueue xRxFifo; // Pile des octets reçus
449  uint8_t ucRxBuffer[CONFIG_AFSK_RX_BUFLEN]; // Buffer de la pile de réception
450 
451  /*
452  * Buffer circulaires des échantillons du signal audio et son index
453  * Utilisé pour la démodulation du signal par filtrage numérique
454  */
455  int8_t iSample[AFSK_SAMPLES_PER_BIT];
456  uint8_t ucSampleIdx;
457  /*
458  * Bits échantilloné par le discriminateur
459  * Comme la fréquence d'échantillonage de l'ADC est plus grande que la vitesse
460  * de transmission, il faut pouvoir stocker AFSK_SAMPLES_PER_BIT ucLastBits.
461  * TODO: modifier la taille en fonction de AFSK_SAMPLES_PER_BIT
462  */
463  uint8_t ucSampleBits;
464 
465 #ifdef AVRIO_AFSK_USE_RSSI
466  uint8_t ucSampleCnt;
467  // Dernière qualité de signal mesurée
468  uint8_t ucRssi;
469  // Seuil de qualité satisfaisante du signal
470  uint8_t ucRssiTh;
471 #endif /* AVRIO_AFSK_USE_RSSI defined */
472 #endif /* AFSK_RX_DISABLE not defined */
473 
474  // Common
475  int iError;
476  uint8_t ucMode;
477  union {
478  volatile uint8_t ucFlag;
479  struct {
480  volatile uint8_t bTxEnable : 1; // Transmission en cours
481  volatile uint8_t bStuffEnable : 1; // Le bit stuffing est activé
482  volatile uint8_t bFrameStarted : 1; // Début de trame détectée
483  volatile uint8_t bDcd : 1; // La porteuse correcte a été détectée
484  volatile uint8_t bTestEnable : 1; // Le mode test est activé
485  };
486  };
487 
488 } xAfsk;
489 
490 /* public variables ========================================================= */
491 extern xAfsk af; // for inline funcs only !
492 
493 /* inline public functions ================================================ */
494 
495 // -----------------------------------------------------------------------------
496 INLINE void
497 vAfskInit (uint8_t ucMode) {
498 
499  memset (&af, 0, sizeof (af));
500  af.ucMode = ucMode;
501  vAfskDebugInit();
502  vAfskHwInit();
503 
504 #ifndef AFSK_TX_DISABLE
505  vQueueSetBuffer (&af.xTxFifo, af.ucTxBuffer, sizeof (af.ucTxBuffer));
506  af.usTxPhaseInc = AFSK_MARK_INC;
507  vAfskHwDacWrite (AFSK_DAC_VALUE (128)); // sin(0) -> VREF_DAC/2
508 #endif
509 
510 #ifndef AFSK_RX_DISABLE
511 
512 #ifdef AVRIO_AFSK_USE_RSSI
513 // Seuil de qualité satisfaisante du signal
514  af.ucRssiTh = AFSK_RSSI_DEFAULT_TH;
515 #endif
516 
517  vQueueSetBuffer (&af.xRxFifo, af.ucRxBuffer, sizeof (af.ucRxBuffer));
518 #endif
519 }
520 
521 #ifndef AFSK_RX_DISABLE
522 // -----------------------------------------------------------------------------
523 INLINE bool
524 bAfskReceiving (void) {
525 
526  bool bValue;
527 
528  ATOMIC_BLOCK (ATOMIC_RESTORESTATE) {
529 
530  bValue = (af.bFrameStarted ? true : false);
531  }
532  return bValue;
533 }
534 
535 // -----------------------------------------------------------------------------
536 INLINE bool
537 bAfskDcd (void) {
538  bool bValue;
539 
540  ATOMIC_BLOCK (ATOMIC_RESTORESTATE) {
541 
542  bValue = (af.bFrameStarted ? true : false);
543  }
544  return bValue;
545 }
546 
547 #ifdef AVRIO_AFSK_USE_RSSI
548 // -----------------------------------------------------------------------------
549 
550 // -----------------------------------------------------------------------------
551 INLINE uint8_t
552 ucAfskGetRssi (void) {
553  uint8_t ucRssi;
554 
555  ATOMIC_BLOCK (ATOMIC_RESTORESTATE) {
556 
557  ucRssi = af.ucRssi;
558  }
559  return ucRssi;
560 }
561 
562 // -----------------------------------------------------------------------------
563 INLINE void
564 vAfskSetRssiTh (uint8_t ucRssi) {
565 
566  ATOMIC_BLOCK (ATOMIC_RESTORESTATE) {
567 
568  af.ucRssiTh = ucRssi;
569  }
570 }
571 
572 // -----------------------------------------------------------------------------
573 INLINE uint8_t
574 ucAfskGetRssiTh (void) {
575  uint8_t ucRssi;
576 
577  ATOMIC_BLOCK (ATOMIC_RESTORESTATE) {
578 
579  ucRssi = af.ucRssiTh;
580  }
581  return ucRssi;
582 }
583 
584 #endif /* AVRIO_AFSK_USE_RSSI defined */
585 #endif /* AFSK_RX_DISABLE not defined */
586 
587 #ifndef AFSK_TX_DISABLE
588 // -----------------------------------------------------------------------------
589 INLINE bool
590 bAfskSending (void) {
591 
592  bool bValue;
593 
594  ATOMIC_BLOCK (ATOMIC_RESTORESTATE) {
595 
596  bValue = (af.bTxEnable ? true : false);
597  }
598  return bValue;
599 }
600 
601 // -----------------------------------------------------------------------------
602 INLINE void
603 vAfskToneSet (uint16_t usTxPhaseInc) {
604 
605  ATOMIC_BLOCK (ATOMIC_RESTORESTATE) {
606 
607  af.usTxPhaseInc = usTxPhaseInc;
608  af.bTestEnable = 1;
609  af.bTxEnable = 1;
610  }
611 }
612 
613 // -----------------------------------------------------------------------------
614 INLINE void
615 vAfskToneToggle (void) {
616 
617  (af.usTxPhaseInc == AFSK_MARK_INC) ? vAfskToneSet (AFSK_SPACE_INC) :
618  vAfskToneSet (AFSK_MARK_INC);
619 }
620 #endif // AFSK_TX_DISABLE not defined
621 
622 /* ========================================================================== */
623 #endif /* __DOXYGEN__ not defined */
624 
625 /* ========================================================================== */
626 __END_C_DECLS
627 #endif /* _AVRIO_AFSK_H_ not defined */
void vAfskToneSet(uint16_t usTxPhaseInc)
Modifie la tonalité en sortie du modulateur.
void vAfskHwDacWrite(uint16_t usValue)
Ecriture DAC.
int8_t iAfskHwAdcRead(void)
Lecture ADC.
bool bAfskDcd(void)
FILE xAfskPort
Fichier permettant l&#39;utilisation du modem avec les fonctions de la libc.
void vAfskHwDcdOff(void)
Détection absence porteuse.
Pile FIFO.
void vAfskHwTxEnable(void)
Validation transmetteur.
void vAfskToneToggle(void)
Bascule la tonalité en sortie du modulateur.
#define CONFIG_AFSK_TX_BUFLEN
Taille buffer émission.
Definition: afsk.h:202
uint8_t ucAfskGetRssi(void)
bool bAfskSending(void)
void vAfskInit(uint8_t ucMode)
void vAfskHwDcdOn(void)
Détection de présence porteuse.
void vAfskHwInit(void)
Initialisation du driver.
void vQueueSetBuffer(struct xQueue *pxQueue, uint8_t *pucBuffer, size_t xBufferSize)
Initialise la pile avec le buffer.
void vAfskSetRssiTh(uint8_t ucRssi)
#define AFSK_SAMPLES_PER_BIT
Nombre d&#39;échantillons de sinusoide par temps de bit.
Definition: afsk.h:269
#define CONFIG_AFSK_RX_BUFLEN
Taille buffer réception.
Definition: afsk.h:195
bool bAfskReceiving(void)
uint8_t ucAfskGetRssiTh(void)
void vAfskHwTxDisable(void)
Dévalidation transmetteur.