Описание библиотеки микросхемы 5023ВС016 процессора "Спутник"
tmtx_test.c
См. документацию.
1 
30 #include "tmtx_test.h"
31 
32 
33 const uint32_t sys_freq = 80000000; // Системная частота
34 char dbg_buffer[256]; // Отладочный буфер
35 #define TEST_TMTX // Включаем тест tmtx
36 #define CCSDS_TERMINAL // Включаем работу с терминалом!
37 
38 #ifdef TEST_TMTX
39 
40 #define DUAL_BASIS 1 // 1 - включение dual basis в кодере Рида-Соломона
41 #define FRAME_SIZE_NO_CODING 2048
42 
43 #define NEXT_VAL c++; \
44  if (c == 0) \
45  c = 1
46 
47 #define INIT_FRAME(index) for(unsigned int i=0; i<Frame_size; i++) \
48  { \
49  frame ## index ## [i] = NEXT_VAL; \
50  } \
51  TMTX->DSCR ## index ## _FLAG_SIZE = ((unsigned int)1<<31) | (Frame_size-1)
52 
53 
54 unsigned char tmtx_test_failed;
55 unsigned int Frame_size;
56 unsigned int FramesTotalCount; // Счетчик фреймов
57 unsigned int FramesSendedCount; // Счетчик отправленных фреймов
58 unsigned char frame1 [2048];
59 unsigned char frame2 [2048];
60 unsigned int tmtx_cur_dscr; // индекс dscr
61 unsigned char c; // Счетчик фреймов
62 unsigned int Irq_counter; // Переменная для отладки
63 TMTX_T * tmtx = (TMTX_T *)TMTX; // Для отладки
64 
68 unsigned int GetFrameSize()
69 {
70  switch (TMTX->CODER_SEL & 0x3)
71  {
72  case 0:
73  return FRAME_SIZE_NO_CODING;
74  case TMTX_CODER_SEL_LDPC: // выбор LDPC-энкодера
75  return 892;
76  case TMTX_CODER_SEL_TURBO: // выбор Turbo-энкодера
77  return 223;
78  case TMTX_CODER_SEL_RS: // выбор RS-энкодера
79  if (((TMTX->CODERS_CONFIG >> 16) & 1) == 0)
80  return 239;
81  else
82  return 223;
83  }
84  return 0;
85 }
86 
87 unsigned int BitFrameSizeOut()
88 {
89  switch (TMTX->CODER_SEL & 0x3)
90  {
91  case 0:
92  return FRAME_SIZE_NO_CODING * 8;
93  case TMTX_CODER_SEL_LDPC: // выбор LDPC-энкодера
94  if (((TMTX->CODERS_CONFIG >> 24) & 1) == 0)
95  return 8160;
96  else
97  return 8176;
98  case TMTX_CODER_SEL_TURBO: // выбор Turbo-энкодера
99  switch ((TMTX->CODERS_CONFIG >> 8) & 3)
100  {
101  case 0:
102  return 3576;
103  case 1:
104  return 5364;
105  case 2:
106  return 7152;
107  case 3:
108  return 10728;
109  }
110  case TMTX_CODER_SEL_RS: // выбор RS-энкодера
111  return 255*8;
112  }
113  return 0;
114 }
115 
120 {
121  TMTX->MARKER_AND_FRAME_SIZE = (192<<16) | BitFrameSizeOut(); // Размер фрейма и размер синхромаркера
122  TMTX->MARKER1 = 0xFFFFFFFF; // Содержимое синхромаркера 1
123  TMTX->MARKER2 = 0x77777777; // Содержимое синхромаркера 2
124  TMTX->MARKER3 = 0xBBBBBBBB; // Содержимое синхромаркера 3
125  TMTX->MARKER4 = 0x33333333; // Содержимое синхромаркера 4
126  TMTX->MARKER5 = 0xDDDDDDDD; // Содержимое синхромаркера 5
127  TMTX->MARKER6 = 0x55555555; // Содержимое синхромаркера 6
128  FramesTotalCount = 10;
129  FramesSendedCount = 2;
130 
131  c = 1;
132  Frame_size = GetFrameSize(); // Получить размер фрейма
133 
134  if (FramesTotalCount >= 1)
135  {
136  TMTX->DSCR1_PTR = (unsigned int)&frame1[0]; // Дескриптор 1: указатель на область памяти
137  INIT_FRAME(1);
138  }
139  if (FramesTotalCount >= 2)
140  {
141  TMTX->DSCR2_PTR = (unsigned int)&frame2[0]; // Дескриптор 2: указатель на область памяти
142  INIT_FRAME(2);
143  }
144 
145  tmtx_cur_dscr = 0;
146  Irq_counter = 0;
147 
148  TMTX->GLOBAL_ENABLE=TMTX_GLOBAL_ENABLE; // включение всех модулей, ответственных за передачу данных
149  for(int i=0; i<100; i++);
150  TMTX->PHY_FIFO_UNDERRUN=TMTX_PHY_FIFO_UNDERRUN; // флаг опустошения асинхронного FIFO
151 
152  while(1)
153  {
154  if (((TMTX->PHY_FIFO_UNDERRUN&TMTX_PHY_FIFO_UNDERRUN)==1)) // флаг опустошения асинхронного FIFO
155  {
157  {
158  PRINT("\tERROR: FIFO was empty in wrong time\n");
159  DBG_TX_Flush(); // Вывод всех данных, накопленных в кольцевом буфере, в отладочный UART
160  tmtx_test_failed = 1;
161  break;
162  }
163  else
164  {
165  PRINT("\tTest progress: ok\n");
166  DBG_TX_Flush(); // Вывод всех данных, накопленных в кольцевом буфере, в отладочный UART
167  break;
168  }
169  }
170  tmtx->MARKER6 = 0;
171  };
172  TMTX->GLOBAL_ENABLE=0x00;
173 }
174 
178 void TMTX_IRQ (void)
179 {
180  if (tmtx_cur_dscr == 0)
181  {
183  {
184  INIT_FRAME(1);
185  }
186  tmtx_cur_dscr = 1;
187  }
188  else
189  {
191  {
192  INIT_FRAME(2);
193  }
194 
195  tmtx_cur_dscr = 0;
196  }
198  Irq_counter++;
199 }
200 
205 {
206  PWR_CLK_Enable(TMTX_CTRL_NUM); // Подача тактового сигнала на модуль
207  PWR_RST_Disable(TMTX_CTRL_NUM); // Вывод модуля из асинхронного сброса
208 }
209 
214 {
215  CMN_REG->ALT_FUNCTION_CTRL[6] |= 0; // Для GPIO_G
216  GPIO_G->ALTFUNCSET = (1<<12) | (1<<13) | (1<<14); // Настроили GPIO
217 }
218 
223 {
224  PRINT("\n********** TMTX test start **********\n");
225  DBG_TX_Flush(); // Вывод всех данных, накопленных в кольцевом буфере, в отладочный UART
226 
227  TMTX_Gpio_Init(); // Настроили GPIO
228  TMTX_Clock_init(); // Подача тактовых сигналов
229 
230 #ifdef CCSDS_TERMINAL
231  PRINT("COMMAND=TMTX_START\n");
232  DBG_TX_Flush(); // Вывод всех данных, накопленных в кольцевом буфере, в отладочный UART
233 # ifdef EXT
234  for(unsigned int i=0; i<1000000; i++);
235 # else
236  for(unsigned int i=0; i<6000000; i++);
237 # endif
238 #endif
239  unsigned int errors = 0;
240 
241  TMTX->GLOBAL_ENABLE = 0x00; // Включение блока в режим передачи (ВЫКЛЮЧЕНО!)
242  tmtx_test_failed = 0;
243  NVIC_EnableIRQ(TMTX_NUM,18); // Разрешение прерывания
244 
245  for (int k = 0; k < 10000000; k++);
246 
247  PRINT("\tsubtest#0 Codec=none, Randomizer=OFF, Convolution rate=none\n");
248  DBG_TX_Flush(); // Вывод всех данных, накопленных в кольцевом буфере, в отладочный UART
249  TMTX->CODER_SEL = 0; TMTX->CODERS_CONFIG = 0; // Без кодирования
250  SendingProcess(); // Процесс отпаравки
251  if (tmtx_test_failed)
252  {
253  errors++;
254  goto tmtx_test_end;
255  }
256 
257  PRINT(" subtest#1 Codec=LDPC_7136, Randomizer=ON, Convolution rate=1/2\n");
258  DBG_TX_Flush(); // Вывод всех данных, накопленных в кольцевом буфере, в отладочный UART
259  TMTX->CODER_SEL = TMTX_CODER_SEL_LDPC; TMTX->CODERS_CONFIG = 0<<24; // LDPC 7136
260  TMTX->CODER_SEL |= 1 << 3; // Randomizer ON
261  TMTX->CODER_SEL |= 1 << 2; TMTX->CODERS_CONFIG |= 1; // Conv ON, rate 1/2
262  SendingProcess(); // Процесс отпаравки
263  if (tmtx_test_failed)
264  {
265  errors++;
266  goto tmtx_test_end;
267  }
268 
269  PRINT(" subtest#2 Codec=LDPC_7156, Randomizer=OFF, Convolution rate=2/3\n");
270  DBG_TX_Flush(); // Вывод всех данных, накопленных в кольцевом буфере, в отладочный UART
271  TMTX->CODER_SEL = TMTX_CODER_SEL_LDPC;
272  TMTX->CODERS_CONFIG = 1<<24; // LDPC 7156
273  TMTX->CODER_SEL |= 1 << 2; TMTX->CODERS_CONFIG |= 2; // Conv ON, rate 2/3
274  SendingProcess(); // Процесс отпаравки
275  if (tmtx_test_failed)
276  {
277  errors++;
278  goto tmtx_test_end;
279  }
280 
281  PRINT(" subtest#3 Codec=Turbo_1/2, Randomizer=ON, Convolution rate=3/4\n");
282  DBG_TX_Flush(); // Вывод всех данных, накопленных в кольцевом буфере, в отладочный UART
283  TMTX->CODER_SEL = TMTX_CODER_SEL_TURBO; TMTX->CODERS_CONFIG = 0<<8; // Turbo 1/2
284  TMTX->CODER_SEL |= 1 << 3; // Randomizer ON
285  TMTX->CODER_SEL |= 1 << 2; TMTX->CODERS_CONFIG |= 3; // Conv ON, rate 3/4
286  SendingProcess(); // Процесс отпаравки
287  if (tmtx_test_failed)
288  {
289  errors++;
290  goto tmtx_test_end;
291  }
292 
293  PRINT(" subtest#4 Codec=Turbo_1/3, Randomizer=OFF, Convolution rate=5/6\n");
294  DBG_TX_Flush(); // Вывод всех данных, накопленных в кольцевом буфере, в отладочный UART
295  TMTX->CODER_SEL = TMTX_CODER_SEL_TURBO; TMTX->CODERS_CONFIG = 1<<8; // Turbo 1/3
296  TMTX->CODER_SEL |= 1 << 2; TMTX->CODERS_CONFIG |= 5; // Conv ON, rate 5/6
297  SendingProcess(); // Процесс отпаравки
298  if (tmtx_test_failed)
299  {
300  errors++;
301  goto tmtx_test_end;
302  }
303 
304  PRINT(" subtest#5 Codec=Turbo_1/4, Randomizer=ON, Convolution rate=7/8\n");
305  DBG_TX_Flush(); // Вывод всех данных, накопленных в кольцевом буфере, в отладочный UART
306  TMTX->CODER_SEL = TMTX_CODER_SEL_TURBO; TMTX->CODERS_CONFIG = 2<<8; // Turbo 1/4
307  TMTX->CODER_SEL |= 1 << 3; // Randomizer ON
308  TMTX->CODER_SEL |= 1 << 2; TMTX->CODERS_CONFIG |= 7; // Conv ON, rate 7/8
309  SendingProcess(); // Процесс отпаравки
310  if (tmtx_test_failed)
311  {
312  errors++;
313  goto tmtx_test_end;
314  }
315 
316  PRINT(" subtest#6 Codec=Turbo_1/6, Randomizer=OFF, Convolution rate=1/2\n");
317  DBG_TX_Flush();
318  TMTX->CODER_SEL = TMTX_CODER_SEL_TURBO; TMTX->CODERS_CONFIG = 3<<8; //Turbo 1/6
319  TMTX->CODER_SEL |= 1 << 2; TMTX->CODERS_CONFIG |= 1; //Conv ON, rate 1/2
320  SendingProcess(); // Вывод всех данных, накопленных в кольцевом буфере, в отладочный UART
321  if (tmtx_test_failed)
322  {
323  errors++;
324  goto tmtx_test_end;
325  }
326 
327  PRINT(" subtest#7 Codec=RS_239, Randomizer=ON, Convolution rate=2/3\n");
328  DBG_TX_Flush(); // Вывод всех данных, накопленных в кольцевом буфере, в отладочный UART
329  TMTX->CODER_SEL = TMTX_CODER_SEL_RS; TMTX->CODERS_CONFIG = (0<<16) | (DUAL_BASIS << 17); //RS 239
330  TMTX->CODER_SEL |= 1 << 3; // Randomizer ON
331  TMTX->CODER_SEL |= 1 << 2; TMTX->CODERS_CONFIG |= 2; // Conv ON, rate 2/3
332  SendingProcess(); // Процесс отпаравки
333  if (tmtx_test_failed)
334  {
335  errors++;
336  goto tmtx_test_end;
337  }
338 
339  PRINT(" subtest#8 Codec=RS_223, Randomizer=OFF, Convolution rate=3/4\n");
340  DBG_TX_Flush(); // Вывод всех данных, накопленных в кольцевом буфере, в отладочный UART
341  TMTX->CODER_SEL = TMTX_CODER_SEL_RS; TMTX->CODERS_CONFIG = (1<<16) | (DUAL_BASIS << 17); //RS 223
342  TMTX->CODER_SEL |= 1 << 2; TMTX->CODERS_CONFIG |= 3; // Conv ON, rate 3/4
343  SendingProcess(); // Процесс отпаравки
344  if (tmtx_test_failed)
345  {
346  errors++;
347  goto tmtx_test_end;
348  }
349 
350 #ifdef CCSDS_TERMINAL
351 
352  for(unsigned int i=0; i<1000000; i++);
353  PRINT("COMMAND=TMTX_COMPLETE\n");
354  DBG_TX_Flush(); // Вывод всех данных, накопленных в кольцевом буфере, в отладочный UART
355 #endif
356 
357  PWR_CLK_Disable(TMTX_CTRL_NUM); // Отключение тактового сигнала от модуля
358  PWR_RST_Enable(TMTX_CTRL_NUM); // Ввод модуля в асинхронный сброс
359 
360 tmtx_test_end:
361 
362  PRINT("\tTMTX test complete. Errors count = %d\n", errors);
363  DBG_TX_Flush(); // Вывод всех данных, накопленных в кольцевом буфере, в отладочный UART
364 
365  if (errors > 0)
366  return RESULT_FAIL;
367  else
368  return RESULT_OK;
369 }
370 #endif //TEST_TMTX
TMTX_T * tmtx
Definition: tmtx_test.c:63
#define PRINT(...)
Макросы для использования отладочного выхода
Definition: debug_uart.h:48
unsigned int BitFrameSizeOut()
Definition: tmtx_test.c:87
T_TEST_RESULT
Результаты теста
Definition: tmtx_test.h:44
void TMTX_Clock_init()
Настройка подачи тактового сигнала на модуль TMTX.
Definition: tmtx_test.c:204
void PWR_RST_Enable(CTRL_T CTRLn)
Ввод модуля в асинхронный сброс
Definition: system.c:309
void NVIC_EnableIRQ(IRQn_T IRQn, uint32_t vec)
Разрешение прерывания
Definition: system.c:74
unsigned int Frame_size
Definition: tmtx_test.c:55
#define FRAME_SIZE_NO_CODING
Definition: tmtx_test.c:41
#define DUAL_BASIS
Definition: tmtx_test.c:40
unsigned char frame1[2048]
Definition: tmtx_test.c:58
unsigned int Irq_counter
Definition: tmtx_test.c:62
unsigned char frame2[2048]
Definition: tmtx_test.c:59
#define GPIO_G
Указатель на структуру GPIO_G.
void PWR_CLK_Disable(CTRL_T CTRLn)
Отключение тактового сигнала от модуля
Definition: system.c:328
#define INIT_FRAME(index)
Definition: tmtx_test.c:47
unsigned char tmtx_test_failed
Definition: tmtx_test.c:54
Этот файл содержит структуры, макросы и функции необходимые необходимые для тестовой программы для ап...
unsigned int FramesTotalCount
Definition: tmtx_test.c:56
unsigned int GetFrameSize()
Получение размеров фрейма
Definition: tmtx_test.c:68
T_TEST_RESULT Test_TMTX()
Тест TMTX.
Definition: tmtx_test.c:222
#define TMTX_PHY_FIFO_UNDERRUN
Макросы для PHY_FIFO_UNDERRUN.
Definition: tmtx.h:86
const uint32_t sys_freq
Системная частота
Definition: tmtx_test.c:33
unsigned int FramesSendedCount
Definition: tmtx_test.c:57
Структура для доступа к регистрам модуля передатчика телеметрической информации
Definition: tmtx.h:44
void PWR_RST_Disable(CTRL_T CTRLn)
Вывод модуля из асинхронного сброса
Definition: system.c:318
void PWR_CLK_Enable(CTRL_T CTRLn)
Подача тактового сигнала на модуль
Definition: system.c:337
unsigned int tmtx_cur_dscr
Definition: tmtx_test.c:60
#define TMTX_GLOBAL_ENABLE
Макросы для GLOBAL_ENABLE.
Definition: tmtx.h:81
__RW uint32_t MARKER6
Definition: tmtx.h:59
void TMTX_Gpio_Init()
Иницилизация GPIO для работы с модулем TMTX.
Definition: tmtx_test.c:213
unsigned char c
Definition: tmtx_test.c:61
#define CMN_REG
Указатель на структуру CMN_REG.
void DBG_TX_Flush(void)
Вывод всех данных, накопленных в кольцевом буфере, в отладочный UART.
Definition: debug_uart.c:80
#define TMTX
Указатель на структуру TMTX.
void SendingProcess()
Процесс отпаравки
Definition: tmtx_test.c:119
void TMTX_IRQ(void)
Обработчик прерывания
Definition: tmtx_test.c:178
char dbg_buffer[256]
Отладочный буфер
Definition: tmtx_test.c:34