Project

General

Profile

Работа с UART (ASM) » History » Version 23

krufter_multiclet, 06/12/2013 12:23 PM

1 1 krufter_multiclet
h1. Работа с UART (ASM)
2 1 krufter_multiclet
3 2 krufter_multiclet
Рассмотрим передачу и приём сообщений посредством интерфейса UART подробнее(на ассемблере).
4 2 krufter_multiclet
В приведённых ниже примерах кода используется список констант, который необходимо подключить директивой " .include "
5 2 krufter_multiclet
<pre>
6 2 krufter_multiclet
.include "HDL50001_pcf.inc"
7 2 krufter_multiclet
</pre>
8 2 krufter_multiclet
9 2 krufter_multiclet
10 10 krufter_multiclet
h2. а) Передача по UART
11 7 krufter_multiclet
12 10 krufter_multiclet
h3. 1. Разрешаем алтернативные функции порта. 
13 2 krufter_multiclet
14 4 krufter_multiclet
В настоящее время выпущены две отладочные платы, в которых задействованы UART0(HW1-MCp04) и UART3(LDM-MCp04).
15 2 krufter_multiclet
Рассмотрим команды ассемблера для разрешения алтернативных функций порта.
16 2 krufter_multiclet
Для UART0:
17 2 krufter_multiclet
<pre>
18 5 krufter_multiclet
getl 0x00000F00
19 5 krufter_multiclet
wrl @1, GPIOB_BPS
20 5 krufter_multiclet
</pre>
21 5 krufter_multiclet
22 5 krufter_multiclet
Для UART3:
23 5 krufter_multiclet
<pre>
24 5 krufter_multiclet
getl 0x00000F00
25 5 krufter_multiclet
wrl @1, GPIOD_BPS
26 2 krufter_multiclet
</pre>
27 6 krufter_multiclet
28 10 krufter_multiclet
h3. 2. Настраиваем UART на передачу, устанавливаем скорость работы.
29 6 krufter_multiclet
30 6 krufter_multiclet
Для настройки UART на передачу запишем следующее значение в регистр управления:
31 6 krufter_multiclet
Для UART0:
32 6 krufter_multiclet
<pre>
33 6 krufter_multiclet
getl 0x00000002
34 6 krufter_multiclet
wrl @1, UART0_CR
35 6 krufter_multiclet
</pre>
36 6 krufter_multiclet
37 6 krufter_multiclet
Для UART3:
38 6 krufter_multiclet
<pre>
39 6 krufter_multiclet
getl 0x00000002
40 6 krufter_multiclet
wrl @1, UART3_CR
41 6 krufter_multiclet
</pre>
42 11 krufter_multiclet
43 11 krufter_multiclet
Для установки скорости используется коэффициент деления BRDIV = Fsys/(8*Fuart - 1)
44 12 krufter_multiclet
Для скорости 38400 кбит/с:
45 12 krufter_multiclet
46 12 krufter_multiclet
Для UART0:
47 12 krufter_multiclet
<pre>
48 12 krufter_multiclet
 getl 0x00000104
49 12 krufter_multiclet
 wrl @1, UART0_BDR
50 12 krufter_multiclet
</pre>
51 12 krufter_multiclet
52 12 krufter_multiclet
Для UART3:
53 12 krufter_multiclet
<pre>
54 12 krufter_multiclet
 getl 0x00000104
55 12 krufter_multiclet
 wrl @1, UART3_BDR
56 12 krufter_multiclet
</pre>
57 13 krufter_multiclet
58 13 krufter_multiclet
h3. 3. Проверка буфера передатчика на полноту.
59 13 krufter_multiclet
60 13 krufter_multiclet
Для UART0:
61 13 krufter_multiclet
<pre>
62 13 krufter_multiclet
fifo_tx_full:
63 13 krufter_multiclet
    rdl UART0_ST
64 13 krufter_multiclet
    getl 0x00000200
65 13 krufter_multiclet
    and @1, @2
66 13 krufter_multiclet
    je @1, fifo_tx_full
67 14 krufter_multiclet
    jne @2, send_byte
68 13 krufter_multiclet
complete
69 13 krufter_multiclet
</pre>
70 1 krufter_multiclet
71 14 krufter_multiclet
Для UART3:
72 14 krufter_multiclet
<pre>
73 14 krufter_multiclet
fifo_tx_full:
74 14 krufter_multiclet
    rdl UART3_ST
75 14 krufter_multiclet
    getl 0x00000200
76 14 krufter_multiclet
    and @1, @2
77 14 krufter_multiclet
    je @1, fifo_tx_full
78 14 krufter_multiclet
    jne @2, send_byte
79 14 krufter_multiclet
complete
80 14 krufter_multiclet
</pre>
81 14 krufter_multiclet
82 14 krufter_multiclet
83 13 krufter_multiclet
h3. 4. Передача байта по UART.
84 13 krufter_multiclet
85 13 krufter_multiclet
Для UART0:
86 13 krufter_multiclet
<pre>
87 13 krufter_multiclet
    getb 0xAB 
88 13 krufter_multiclet
    wrb @1, UART0_DATA
89 13 krufter_multiclet
</pre>
90 13 krufter_multiclet
91 13 krufter_multiclet
Для UART3:
92 13 krufter_multiclet
<pre>
93 13 krufter_multiclet
    getb 0xAB 
94 1 krufter_multiclet
    wrb @1, UART3_DATA
95 14 krufter_multiclet
</pre>
96 14 krufter_multiclet
97 14 krufter_multiclet
В результате можно получить простой пример по отправке байта по UART со скоростью 38400 Кбит/с:
98 14 krufter_multiclet
99 14 krufter_multiclet
Для UART0:
100 14 krufter_multiclet
<pre>
101 21 krufter_multiclet
102 21 krufter_multiclet
.include "HDL50001_pcf.inc"
103 21 krufter_multiclet
104 21 krufter_multiclet
.text
105 21 krufter_multiclet
106 14 krufter_multiclet
preset_UART0:
107 14 krufter_multiclet
    getl 0x00000F00
108 14 krufter_multiclet
    wrl @1, GPIOB_BPS
109 14 krufter_multiclet
    getl 0x00000104
110 14 krufter_multiclet
    wrl @1, UART0_BDR
111 14 krufter_multiclet
    getl 0x00000002
112 14 krufter_multiclet
    wrl @1, UART0_CR
113 14 krufter_multiclet
    jmp fifo_tx_full
114 14 krufter_multiclet
complete
115 14 krufter_multiclet
116 14 krufter_multiclet
fifo_tx_full:
117 14 krufter_multiclet
    rdl UART0_ST
118 14 krufter_multiclet
    getl 0x00000200
119 14 krufter_multiclet
    and @1, @2
120 14 krufter_multiclet
    je @1, fifo_tx_full
121 14 krufter_multiclet
    jne @2, paragraph
122 14 krufter_multiclet
complete
123 14 krufter_multiclet
124 14 krufter_multiclet
send_byte:
125 14 krufter_multiclet
    getb 0xAB 
126 14 krufter_multiclet
    wrb @1, UART0_DATA
127 14 krufter_multiclet
complete
128 13 krufter_multiclet
</pre>
129 15 krufter_multiclet
130 15 krufter_multiclet
Для UART3 всё будет аналогично. Ознакомиться с другими примерами работы с UART можно в Хранилище, интересующие вопросы по всем интерфейсам можно задать на форуме.
131 16 krufter_multiclet
132 16 krufter_multiclet
h2. б) Приём по UART
133 17 krufter_multiclet
134 17 krufter_multiclet
Для приёма байта по UART необходимо:
135 18 krufter_multiclet
136 18 krufter_multiclet
h3. 1. Разрешить алтернативные функции портов (аналогично пункту 1 в "передаче")
137 17 krufter_multiclet
138 17 krufter_multiclet
h3. 2. Настраиваем UART на приём, устанавливаем скорость работы.
139 17 krufter_multiclet
140 22 krufter_multiclet
Для настройки UART на приём запишем следующее значение в регистр управления:
141 17 krufter_multiclet
Для UART0:
142 17 krufter_multiclet
<pre>
143 17 krufter_multiclet
getl 0x00000001
144 17 krufter_multiclet
wrl @1, UART0_CR
145 17 krufter_multiclet
</pre>
146 17 krufter_multiclet
147 17 krufter_multiclet
Для UART3:
148 17 krufter_multiclet
<pre>
149 17 krufter_multiclet
getl 0x00000001
150 17 krufter_multiclet
wrl @1, UART3_CR
151 17 krufter_multiclet
</pre>
152 17 krufter_multiclet
153 17 krufter_multiclet
Настройка скорости работы аналогично пункту 2 в "передаче".
154 19 krufter_multiclet
155 19 krufter_multiclet
h3. 3. Проверить наличие новых данных в буфере приёма
156 19 krufter_multiclet
157 19 krufter_multiclet
Для UART0:
158 19 krufter_multiclet
<pre>
159 19 krufter_multiclet
fifo_rx_newb:
160 19 krufter_multiclet
    rdl UART0_ST
161 19 krufter_multiclet
    getl 0x00000001
162 19 krufter_multiclet
    and @1, @2
163 19 krufter_multiclet
    je @1, fifo_rx_newb
164 19 krufter_multiclet
    jne @2, get_byte
165 19 krufter_multiclet
complete
166 19 krufter_multiclet
</pre>
167 19 krufter_multiclet
168 19 krufter_multiclet
Для UART3:
169 19 krufter_multiclet
<pre>
170 19 krufter_multiclet
fifo_rx_newb:
171 19 krufter_multiclet
    rdl UART3_ST
172 19 krufter_multiclet
    getl 0x00000001
173 19 krufter_multiclet
    and @1, @2
174 19 krufter_multiclet
    je @1, fifo_rx_newb
175 19 krufter_multiclet
    jne @2, get_byte
176 19 krufter_multiclet
complete
177 19 krufter_multiclet
</pre>
178 20 krufter_multiclet
179 20 krufter_multiclet
h3. 4. Принять байт
180 20 krufter_multiclet
181 20 krufter_multiclet
Для UART0:
182 20 krufter_multiclet
<pre>
183 23 krufter_multiclet
rdb UART0_DATA
184 20 krufter_multiclet
</pre>
185 20 krufter_multiclet
186 20 krufter_multiclet
Для UART3:
187 20 krufter_multiclet
<pre>
188 23 krufter_multiclet
rdb UART3_DATA
189 20 krufter_multiclet
</pre>