Перейти к содержанию
    

SSP 1986ВЕ92У

Добрый день!

Может кому-то приходилось работать с российским контроллером 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 получаю со сбоями:

 

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

Спасибо!

Изменено пользователем IgorKossak
[codebox] для длинного кода, [code] - для короткого!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может кому-то приходилось работать с российским контроллером

С линиями JTAG не конфликтуете?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

С линиями JTAG не конфликтуете?

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

Изменено пользователем woofer46

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Советую не нарушать.

 

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

post-27702-1459541379_thumb.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Советую не нарушать.

 

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

Спасибо, cейчас для прошивки использую PD1/TCK и PD0/TMS

PD2 используется для приема по SSP.

Соответственно если я линии программатора переопределю на JTAG A (MODE=001), то возможно проблема пропадет?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Соответственно если я линии программатора переопределю на JTAG A (MODE=001), то возможно проблема пропадет?

Скажем так - пока не переопределите на MODE=001 будут чудеса.

Я долго страдал за выходы таймера на PB при MODE=000.

Прошивал по UART и из него же стартовал - все изумительно работало.

Как только перезагружался в MODE=000 все работало около секунды, затем некоторые ШИМ-выходы таймера пропадали.

Но в проекте нужно и PB, и PD. Как стартануть из flash без JTAG и/или без потери альтернативного функционала на ногах JTAG?

Судя по документации - никак. Камень после STM32 - что-то с чем-то :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Скажем так - пока не переопределите на MODE=001 будут чудеса.

Я долго страдал за выходы таймера на PB при MODE=000.

Прошивал по UART и из него же стартовал - все изумительно работало.

Как только перезагружался в MODE=000 все работало около секунды, затем некоторые ШИМ-выходы таймера пропадали.

Но в проекте нужно и PB, и PD. Как стартануть из flash без JTAG и/или без потери альтернативного функционала на ногах JTAG?

Судя по документации - никак. Камень после STM32 - что-то с чем-то :)

Спасибо! После выходных попробую : )

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Скажем так - пока не переопределите на MODE=001 будут чудеса.

Я долго страдал за выходы таймера на PB при MODE=000.

Прошивал по UART и из него же стартовал - все изумительно работало.

Как только перезагружался в MODE=000 все работало около секунды, затем некоторые ШИМ-выходы таймера пропадали.

Но в проекте нужно и PB, и PD. Как стартануть из flash без JTAG и/или без потери альтернативного функционала на ногах JTAG?

Судя по документации - никак. Камень после STM32 - что-то с чем-то :)

К сожалению не помогло, взял на другом контроллере другие ножки ввода вывода - 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;
      }
   }
}

Баги такие же

 
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

Изменено пользователем woofer46

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

повторяйте трижды в день - никаких магических чисел!

никто не захочет копаться в вашем коде, выискивая по документации, какие числа за что отвечают. У вас же есть файл описания МК, почему не используете определения оттуда? Посему, по соответствию чисел полям регистров не смотрел.

 

по сабжу - это ТОЧНО всё? никаких прерываний не гуляет? в начале в 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Т.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...