2010-11-24 43 views
0

Je rencontre des problèmes avec le contrôle de flux USART sur l'Atxmega256. Je communique avec un modem qui utilise RTS/CTS pour le contrôle de flux. Une fois que le modem a mis CTS à bas, je veux arrêter d'envoyer des données jusqu'à ce qu'il redevienne élevé. J'utilise actuellement des routines USART interrompues et je n'arrive pas à trouver un bon moyen d'arrêter l'envoi. Si j'arrête juste d'envoyer quand CTS devient bas, les données déjà dans les tampons d'envoi seront toujours envoyées et donc perdues.Atxmega Contrôle de flux USART

J'ai essayé le suivi de désactiver/activer l'envoi:

if(false == clearToSend()) { 
    USART_TxdInterruptLevel_Set(data->usart, USART_TXCINTLVL_OFF_gc); 
    while(false == clearToSend()) {} 
    USART_TxdInterruptLevel_Set(data->usart, USART_TXCINTLVL_LO_gc); 
} 

Malheureusement, cela semble désactiver l'envoi en permanence. Des idées?

Meilleures salutations Fredrik

Répondre

1

Une fois que le bit de démarrage est envoyé au fil, vous devez envoyer le reste des bits y compris le bit d'arrêt ou bien vous corrompre les données. Il n'est pas possible d'arrêter l'envoi de données instantanément lorsque CTS est désactivé, et il est courant d'autoriser quelques octets supplémentaires avant que l'envoi ne soit interrompu. La série XMEGA n'a pas de FIFO USART profond, juste le registre à décalage de transmission et un registre de maintien de transmission, donc si votre code arrête d'écrire sur l'USART dès que le CTS est désactivé, ça devrait aller.

1

J'ai eu le même problème que vous avez décrit, mais avec un atxmega128a1. Je l'ai implémenté uniquement pour l'émetteur USART en utilisant des transferts DMA et en surveillant la broche RTS de la boucle principale. Je sais que j'ai 32 octets dans le FIFO de mon USART < -> Interface USB lorsque la broche RTS affirme.

Lorsque la broche s'affirme, je change la source de déclenchement DMA (DMA.CH0.TRIGSRC) de DMA_CH_TRIGSRC_USARTC0_DRE_gc à DMA_CH_TRIGSRC_OFF_gc. De cette façon, le DMA n'est plus déclenché et interrompt la transmission. Lorsque la broche RTS redevient basse, je redéfinis la source de déclenchement sur DMA_CH_TRIGSRC_USARTC0_DRE_gc.

Cette méthode nécessite une surveillance par interrogation de la ligne RTS et l'utilisation de transferts DMA USART. Je l'utilise avec un FT232H FTDI fonctionnant à 2MHz en bauds.