ini
[aversive.git] / modules / comm / uart / doc / interface.txt
1 Configuration statique :
2
3 UART_MCU_QUARTZ
4
5 UARTx_TX_ENABLED
6 UARTx_RX_ENABLED
7
8 UARTx_DONT_LOOSE_DATA 
9
10 UARTx_TX_FIFO_SIZE uint8_t
11 UARTx_RX_FIFO_SIZE uint8_t
12
13
14 UARTx_DEFAULT_BAUDRATE uint32_t
15
16 UARTx_DEFAULT_9BITS/UARTx_DEFAULT_8BITS/UARTx_DEFAULT_7BITS/UARTx_DEFAULT_6BITS/UARTx_DEFAULT_5BITS
17
18 UARTx_DEFAULT_NO_PARITY/UARTx_DEFAULT_PARITY_ODD/UARTx_DEFAULT_PARITY_EVEN
19
20 UARTx_DEFAULT_1_STOP_BIT/UARTx_DEFAULT_2_STOP_BIT
21
22
23
24 ------------------------------------------------------
25
26 Configuration dynamique :
27
28
29
30 Modification et lecture de la vitesse de transmission. Le set retourne
31 0 en cas de succès, ou un code d'erreur si la vitesse ne peut être
32 atteinte. 
33
34 uint8_t uart_set_baudrate(uint32_t)
35 uint32_t uart_get_baudrate()
36
37
38
39 Modification de la parité. Elle est exécutée en hard sur les USART
40 mais elle devra être effectuée en soft sur les uart (9e
41 bit). set_parity retourne 0 en cas de succès.
42
43 uint8_t uart_set_parity(NO_PARITY/PARITY_ODD/PARITY_EVEN)
44 uint8_t uart_get_parity()
45
46
47
48 Modification du nombre de bits de stop. Executé en hard sur les USART,
49 il doit être effectué en soft sinon. Il est à savoir qu'il n'est pas
50 possible avec un uart d'avoir plus d'une de ces options :9bits,
51 2bits_stop, parité, car tout est géré avec le 9e bit. Il est par
52 contre envisageable d'avoir une combinaison : 7bits + parité + 2 bits
53 stop. En même temps, les AVR avec uart sont de plus en plus rare, il
54 n'est peut-etre pas nécessaire de s'embeter avec ça.
55
56 uint8_t uart_set_1_stop_bit()
57 uint8_t uart_set_2_stop_bit()
58 uint8_t uart_get_stop_bit()
59
60
61 Ajoute une fonction appelée sur un évènement tx ou rx. Si on l'appelle
62 avec un pointeur nul, aucune fonction n'est appelée. data_size est un
63 uint8_t ou un uint16_t, selon la taille des données.
64
65 uint8_t uart_register_tx_event(void (*f)(data_size))
66 uint8_t uart_register_rx_event(void (*f)(data_size))
67
68 ------------------------------------------------------------------
69
70 Initialisation :
71
72 Voici un apperçu des caractéristiques de quelques AVR:
73
74 at90s2313 et at90s8515 :
75 uart
76 8 bits
77 9bits ou parité ou stop supplémentaire
78 UCR (uart control register) et USR (status)
79
80 pareil
81
82 at90int16_t3 :
83 pareil, mais avec en plus double speed
84 et comm multiprocesseur
85 UCSRA et UCSRB
86
87
88 atm32 et atm8515 :
89 usart
90 URSEL pour acceder à UBRRH ou UCSRC
91 5 6 7 8 9 bits
92 parité et bits stop natifs
93 opérations synchrones
94
95
96 atm128 :
97 pareil, mais en double, et sans le URSEL
98
99
100
101
102 Résultat des courses, pour la fonction d'init, il faut séparer
103 intelligemment.
104
105 D'abord, définissons des caractéristiques pour chaque processeur :
106
107 AT90s2313:
108 UART_SIMPLE
109 UART_UCR_USR
110
111
112 ATmega163:
113 UART_SIMPLE
114 UART_UCSR (implique U2X ?)
115 UART_U2X 
116
117
118 ATM32:
119 UART_USART (a priori, implique 56789 bits,parité et stop natifs + u2x) 
120 UART_URSEL
121
122
123 ATM128:
124 UART_USART
125 UART_DOUBLE 
126
127
128 Dans l'init, on a donc :
129
130 init générique : ports, fifos
131
132 #if defined(UART_SIMPLE) && defined(UART_UCR_USR)
133 uart_init_simple_ucr_usr()
134 #elif defined(UART_SIMPLE) && defined(UART_UCSR)
135 uart_init_simple_ucsr()
136 #elif !defined(UART_DOUBLE)
137 uart_init_usart()
138 #else
139 uart_init_double_usart()
140 #endif
141
142
143
144
145 puis dans chaque fonction d'init, on a :
146
147 #if defined(UART_TX_ENABLED) && defined(UART_RX_ENABLED)
148   config interruptions
149
150   config selon 5/6/7/8/9 bits + parité + stop
151
152   U2X si nécessaire
153
154   init baudrate
155
156
157
158
159 Concernant la parité, et les bits de stop : 
160 - Il faudra implémenter des fonctions sur les uC ne disposant pas de
161 ces options en natif. Pour l'instant, il me semble que ce n'est pas
162 hyper important : d'une part c'est peu utilisé, d'autre part, il faut
163 pouvoir être averti (en réception) qu'il y a eu une erreur (que ce
164 soit une erreur de parité, overrun ou frame error d'ailleurs). Je
165 pense qu'il serait bien de fournir des fonctions du genre :
166
167 uint8_t uart_udr_get() // lit le registre udr, bêtement <=> toto=UDR
168 uint8_t uart_udr_get_check_errors(&errors) // lit le registre udr, et
169                                        place un indicateur d'erreurs
170                                        dans error. 
171                                       
172 Voilà, il ne reste plus qu'à coder, le gros du boulot est fait.