Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: SSP 1986ВЕ92У
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
woofer46
Добрый день!
Может кому-то приходилось работать с российским контроллером ARM Cortex M3, не могу разобраться почему SSP (SPI Texas Instruments) в режиме slave, нестабильно работает.

Передаю данные с частотой 1.5 Мбит, но некоторые данные стабильно теряются, в чем может быть ошибка?
Код
void main()
{
.......................................................
    MDR_RST_CLK->PER_CLOCK|=(1<<20)|(1<<23)|(1<<24);
    MDR_PORTD->ANALOG|=(1<<2)|(1<<6);              
    MDR_PORTD->FUNC=0x2020;                                        
    MDR_PORTD->PWR|=0x3030;                           
    MDR_PORTD->OE|=(1<<6);                          
    // PS! PD5 is broken! Not work!
    MDR_PORTC->ANALOG|=1|(1<<1);                    
    MDR_PORTC->FUNC=0x0F;                    
    MDR_PORTC->PWR|=0x0F;                              
    MDR_RST_CLK->SSP_CLOCK|=(1<<25);                 // Enable SSP2
           MDR_SSP2->CR0=15|(1<<4);                        
    MDR_SSP2->CR1|=1<<2;                                 // Slave
    MDR_SSP2->CR1|=1<<1;                                 // Start SSP2
...................................................................
}


Код
    while (1)
    {
...............
    while((MDR_SSP2->SR&4)==0);
    tx=MDR_SSP2->DR;
    while((MDR_UART1->FR&64)!=0);
    MDR_UART1->DR=tx;
...............
         }


В SSP передаю счетчик от 0 до 63, на выходе UART получаю со сбоями:

CODE
0
1
2
3
4
5
6
7
8
9
10
11
12
13
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
0
1
36

37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
0
1
2
36

37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
0
1
2
37

38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
0
1
2
37

38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
0
1
36

37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
0
36

37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
0
1
2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
37
38
39
40
41
42
43
44
45
46
47

Спасибо!
adnega
Цитата(woofer46 @ Apr 1 2016, 19:55) *
Может кому-то приходилось работать с российским контроллером

С линиями JTAG не конфликтуете?
woofer46
Цитата(adnega @ Apr 1 2016, 20:30) *
С линиями JTAG не конфликтуете?

Вообще один из пинов предназначен для JTAG, но я использую SWD
adnega
Советую не нарушать.

Т.е. выполнять из flash нужно только при MODE=001.
woofer46
Цитата(adnega @ Apr 1 2016, 23:11) *
Советую не нарушать.

Т.е. выполнять из flash нужно только при MODE=001.

Спасибо, cейчас для прошивки использую PD1/TCK и PD0/TMS
PD2 используется для приема по SSP.
Соответственно если я линии программатора переопределю на JTAG A (MODE=001), то возможно проблема пропадет?
adnega
Цитата(woofer46 @ Apr 1 2016, 23:25) *
Соответственно если я линии программатора переопределю на JTAG A (MODE=001), то возможно проблема пропадет?

Скажем так - пока не переопределите на MODE=001 будут чудеса.
Я долго страдал за выходы таймера на PB при MODE=000.
Прошивал по UART и из него же стартовал - все изумительно работало.
Как только перезагружался в MODE=000 все работало около секунды, затем некоторые ШИМ-выходы таймера пропадали.
Но в проекте нужно и PB, и PD. Как стартануть из flash без JTAG и/или без потери альтернативного функционала на ногах JTAG?
Судя по документации - никак. Камень после STM32 - что-то с чем-то sm.gif
woofer46
Цитата(adnega @ Apr 1 2016, 23:34) *
Скажем так - пока не переопределите на MODE=001 будут чудеса.
Я долго страдал за выходы таймера на PB при MODE=000.
Прошивал по UART и из него же стартовал - все изумительно работало.
Как только перезагружался в MODE=000 все работало около секунды, затем некоторые ШИМ-выходы таймера пропадали.
Но в проекте нужно и PB, и PD. Как стартануть из flash без JTAG и/или без потери альтернативного функционала на ногах JTAG?
Судя по документации - никак. Камень после STM32 - что-то с чем-то sm.gif

Спасибо! После выходных попробую : )
woofer46
Цитата(adnega @ Apr 1 2016, 23:34) *
Скажем так - пока не переопределите на MODE=001 будут чудеса.
Я долго страдал за выходы таймера на PB при MODE=000.
Прошивал по UART и из него же стартовал - все изумительно работало.
Как только перезагружался в MODE=000 все работало около секунды, затем некоторые ШИМ-выходы таймера пропадали.
Но в проекте нужно и PB, и PD. Как стартануть из flash без JTAG и/или без потери альтернативного функционала на ногах JTAG?
Судя по документации - никак. Камень после STM32 - что-то с чем-то sm.gif

К сожалению не помогло, взял на другом контроллере другие ножки ввода вывода - PC0, PC1, PC2
Код
void main()
{
void main()
{
   int i;
  
   MDR_RST_CLK->HS_CONTROL=3;                                          
   while (MDR_RST_CLK->CLOCK_STATUS==0);  
   MDR_RST_CLK->PLL_CONTROL=(11<<8)|(1<<2);                                    
   MDR_RST_CLK->CPU_CLOCK=0x106;                                    //CPU_CLK=HSE+PLL


   MDR_RST_CLK->PER_CLOCK|=(1<<20)|(1<<23)|(1<<24); // Open clk for SSP2, PORTC, PORTD
   MDR_PORTC->ANALOG|=1|(1<<1)|(1<<2);              // PC0 - FSS, PC1 - CLK, PC2 - RX
   MDR_PORTC->FUNC=0x3F;                                    // ReAF - PC0, PC1, PC2
   MDR_PORTC->PWR=0x3F;                               //
   MDR_PORTC->OE=0;
   /*MDR_PORTD->ANALOG|=(1<<6);                     // PD6 - TX
   MDR_PORTD->FUNC=0x2000;                                  // AF - PD6
   MDR_PORTD->PWR|=0x3000;                            //
   MDR_PORTD->OE|=(1<<6);                           // PD6 - output
   */
   MDR_RST_CLK->SSP_CLOCK|=(1<<25);                 // Enable SSP2
   MDR_SSP2->CR0=15|(1<<4);                         // 16 bits, SPI TI page 339
   MDR_SSP2->CR1|=(1<<3)|(1<<2)|(1<<1);  
      
   MDR_RST_CLK->PER_CLOCK|=1<<21;                                        
   MDR_PORTA->ANALOG|=(1<<6)|(1<<7);  
   MDR_PORTA->FUNC|=(15<<12);                                                
   MDR_PORTA->PWR|=(15<<12);                                                    
   MDR_PORTA->OE|=1<<7;                                                    
   MDR_RST_CLK->PER_CLOCK|=(1<<6)|(1<<7);                                      
   MDR_RST_CLK->UART_CLOCK=(1<<24)|(1<<25);                                  
   MDR_UART1->IBRD=41;                          
   MDR_UART1->LCR_H=(3<<5)|(1<<4);                                          
   MDR_UART1->CR=(1<<8)|(1<<9)|(1<<0);                                        

  
   while (1)
   {
     if((MDR_SSP2->SR&4)>0)
      {
         tx=MDR_SSP2->DR;
         while((MDR_UART1->FR&64)!=0);
         MDR_UART1->DR=tx;
      }
   }
}

Баги такие же
CODE

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
57
58
59
60
61
62
63
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
59
60
61
62
63
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
51
52
53
54
55
56
57
58
59
60
61
62
63
0
1
2
3
4
5
6
7
9
10
11
12
13
14
15
16
52
53
54
55
56
57
58
59
60
61
62
63
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
53
54
55
56
57
58
59
60
61
62
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
55
56
57
58
59
60
61
62
63
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
56
57
58
59
60
61
62
63
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
57
58
59
60
61
62
63
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
59
60
61
62
63
0
1
2
3
4
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
51
52
53
54
55
56
57
58
59
60
61
62
63
Aaron
повторяйте трижды в день - никаких магических чисел!
никто не захочет копаться в вашем коде, выискивая по документации, какие числа за что отвечают. У вас же есть файл описания МК, почему не используете определения оттуда? Посему, по соответствию чисел полям регистров не смотрел.

по сабжу - это ТОЧНО всё? никаких прерываний не гуляет? в начале в main явно добавить запрет всех прерываний.
попробовать вставить в два места if((MDR_SSP2->SR&4)>0) {...} else {НОГОДРЫГ} и в while((MDR_UART1->FR&64)!=0) {НОГОДРЫГ} и проверить, он нормально, без остановок дёргается всё время между принятием и отправкой данных?

кстати, ещё!
Цитата
SSP (SPI Texas Instruments) в режиме slave, данные с частотой 1.5 Мбитс частотой 1.5 Мбит

RTFM - частота тактирования SPI slave должна быть емнип минимум в 12 раз выше частоты следования данных. 1,5*12 - 18 МГц.
Попробуйте понизить скорость передачи данных SPI. Ну и проверьте клок на какую частоту настроен...

Код
    RST_CLK_PCLKcmd((RST_CLK_PCLK_SSP2 | RST_CLK_PCLK_PORTB | RST_CLK_PCLK_PORTF),ENABLE);
    SSP_InitTypeDef sSSP;

    SSP_DeInit(MDR_SSP2);
    SSP_BRGInit(MDR_SSP2,SSP_HCLKdiv1);
    SSP_StructInit (&sSSP);

    sSSP.SSP_SCR  = 0x1;
    sSSP.SSP_CPSDVSR = 2;
    sSSP.SSP_Mode = SSP_ModeMaster;
    sSSP.SSP_WordLength = SSP_WordLength16b;
    sSSP.SSP_SPH = SSP_SPH_2Edge;    // фаза сигнала SSPCLKOUT
    sSSP.SSP_SPO = SSP_SPO_Low;        // полярность сигнала SSPCLKOUT
    sSSP.SSP_FRF = SSP_FRF_SPI_Motorola;
    sSSP.SSP_HardwareFlowControl = SSP_HardwareFlowControl_None;
    SSP_Init (MDR_SSP2,&sSSP);

    SSP_Cmd(MDR_SSP2, ENABLE);


Вот вполне себе рабочий код для мастера на 20 МГц 1986ВЕ91Т.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.