реклама на сайте
подробности

 
 
> SSP 1986ВЕ92У
woofer46
сообщение Apr 1 2016, 16:55
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 59
Регистрация: 3-06-15
Пользователь №: 86 990



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

Спасибо!

Сообщение отредактировал IgorKossak - Apr 1 2016, 17:43
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Aaron
сообщение Apr 6 2016, 14:00
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 243
Регистрация: 5-10-06
Из: Зеленоград
Пользователь №: 21 007



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

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



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th July 2025 - 06:03
Рейтинг@Mail.ru


Страница сгенерированна за 0.01378 секунд с 7
ELECTRONIX ©2004-2016