Миландр

Ключевым подразделением нашей компании
является Центр Проектирования интегральных микросхем
Текущее время: 2019-окт-22 10:07

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
СообщениеДобавлено: 2015-сен-10 18:11 
Не в сети
Аватара пользователя

Зарегистрирован: 2015-авг-28 11:25
Сообщения: 25
Имеется следующий код:

#define CAN_NRBUF 16
#define CAN_NTBUF 16
#define CAN_ALL_RBUFS ((1 << CAN_NRBUF) - 1)
#define CAN_ALL_TBUFS (((1 << CAN_NTBUF) - 1) << CAN_NRBUF)

/*
* Count a number of leading (most significant) zero bits in a word.
*/
static int inline __attribute__ ((always_inline))
arm_count_leading_zeroes (unsigned x)
{
int n;

#ifdef ARM_CORTEX_M1
for (n = 0; n < 32; ++n)
if ((x >> (31 - n)) != 0) break;
#else
asm volatile (
"clz %0, %1"
: "=r" (n) : "r" (x));
#endif

return n;
}

int transmit_enqueue (unsigned port, const can_frame_t *fr)
{
//debug_printf ("snd frame, id = %08X, d0 = %08X, d1 = %08X\n", fr->id, fr->data32[0], fr->data32[1]);
CAN_t *reg = (port == 0) ? ARM_CAN1 : ARM_CAN2;

/* Проверяем, что есть свободный буфер для передачи. */
int i = 32 - arm_count_leading_zeroes (~(reg->TX & CAN_ALL_TBUFS));
if (i < CAN_NRBUF || i >= CAN_NRBUF + CAN_NTBUF)
return 0;

/* Нашли свободный буфер. */
CAN_BUF_t *buf = &reg->BUF[i];
buf->ID = fr->id;
buf->DLC = fr->dlc;
buf->DATAL = fr->data32[0];
buf->DATAH = fr->data32[1];
reg->BUF_CON[i] |= CAN_BUF_CON_TX_REQ;
can_statistics[port].tx_packets++;

return 1;
}

Данный код приводит к затиранию еще не переданных сообщений CAN:

Дамп переданных (принятых CAN-USB конвертером) данных:
NN;ID;Ext;RTR;DLC;D0;D1;D2;D3;D4;D5;D6;D7
1;1;0;0;8;1;0;0;0;120;86;52;18
2;1;0;0;8;2;0;0;0;120;86;52;18
3;1;0;0;8;3;0;0;0;120;86;52;18
4;1;0;0;8;4;0;0;0;120;86;52;18
5;1;0;0;8;5;0;0;0;120;86;52;18
6;1;0;0;8;6;0;0;0;120;86;52;18
7;1;0;0;8;7;0;0;0;120;86;52;18
8;1;0;0;8;8;0;0;0;120;86;52;18
9;1;0;0;8;9;0;0;0;120;86;52;18
10;1;0;0;8;10;0;0;0;120;86;52;18
11;1;0;0;8;11;0;0;0;120;86;52;18
12;1;0;0;8;12;0;0;0;120;86;52;18
13;1;0;0;8;14;0;0;0;120;86;52;18
14;1;0;0;8;15;0;0;0;120;86;52;18
15;1;0;0;8;16;0;0;0;120;86;52;18
16;1;0;0;8;17;0;0;0;120;86;52;18
17;1;0;0;8;18;0;0;0;120;86;52;18
18;1;0;0;8;19;0;0;0;120;86;52;18
19;1;0;0;8;20;0;0;0;120;86;52;18
20;1;0;0;8;21;0;0;0;120;86;52;18
21;1;0;0;8;22;0;0;0;120;86;52;18
22;1;0;0;8;24;0;0;0;120;86;52;18
23;1;0;0;8;26;0;0;0;120;86;52;18
24;1;0;0;8;28;0;0;0;120;86;52;18
25;1;0;0;8;30;0;0;0;120;86;52;18
26;1;0;0;8;31;0;0;0;120;86;52;18
27;1;0;0;8;32;0;0;0;120;86;52;18
28;1;0;0;8;33;0;0;0;120;86;52;18
29;1;0;0;8;34;0;0;0;120;86;52;18
30;1;0;0;8;35;0;0;0;120;86;52;18
31;1;0;0;8;36;0;0;0;120;86;52;18
32;1;0;0;8;37;0;0;0;120;86;52;18
33;1;0;0;8;38;0;0;0;120;86;52;18
34;1;0;0;8;39;0;0;0;120;86;52;18
35;1;0;0;8;40;0;0;0;120;86;52;18
36;1;0;0;8;41;0;0;0;120;86;52;18
37;1;0;0;8;43;0;0;0;120;86;52;18

При формировании пакетов производится инкремент D0.
Видно, что произошла потеря 13, 23, 25, 27, 29, 42 пакета.
То есть, ARM_CAN1->TX говорит о том, что произошла передача данных, хотя в действительности передача не завершилась (данные не были приняты конвертером CAN2USB). После этого программа затирает еще не переданный пакет.

Что с этим делать?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2015-сен-11 11:41 
Не в сети

Зарегистрирован: 2009-май-22 09:01
Сообщения: 1299
Откуда: АО "ПКК Миландр"
newstep писал(а):
Имеется следующий код:

#define CAN_NRBUF 16
#define CAN_NTBUF 16
#define CAN_ALL_RBUFS ((1 << CAN_NRBUF) - 1)
#define CAN_ALL_TBUFS (((1 << CAN_NTBUF) - 1) << CAN_NRBUF)

/*
* Count a number of leading (most significant) zero bits in a word.
*/
static int inline __attribute__ ((always_inline))
arm_count_leading_zeroes (unsigned x)
{
int n;

#ifdef ARM_CORTEX_M1
for (n = 0; n < 32; ++n)
if ((x >> (31 - n)) != 0) break;
#else
asm volatile (
"clz %0, %1"
: "=r" (n) : "r" (x));
#endif

return n;
}

int transmit_enqueue (unsigned port, const can_frame_t *fr)
{
//debug_printf ("snd frame, id = %08X, d0 = %08X, d1 = %08X\n", fr->id, fr->data32[0], fr->data32[1]);
CAN_t *reg = (port == 0) ? ARM_CAN1 : ARM_CAN2;

/* Проверяем, что есть свободный буфер для передачи. */
int i = 32 - arm_count_leading_zeroes (~(reg->TX & CAN_ALL_TBUFS));
if (i < CAN_NRBUF || i >= CAN_NRBUF + CAN_NTBUF)
return 0;

/* Нашли свободный буфер. */
CAN_BUF_t *buf = &reg->BUF[i];
buf->ID = fr->id;
buf->DLC = fr->dlc;
buf->DATAL = fr->data32[0];
buf->DATAH = fr->data32[1];
reg->BUF_CON[i] |= CAN_BUF_CON_TX_REQ;
can_statistics[port].tx_packets++;

return 1;
}

Данный код приводит к затиранию еще не переданных сообщений CAN:

Дамп переданных (принятых CAN-USB конвертером) данных:
NN;ID;Ext;RTR;DLC;D0;D1;D2;D3;D4;D5;D6;D7
1;1;0;0;8;1;0;0;0;120;86;52;18
2;1;0;0;8;2;0;0;0;120;86;52;18
3;1;0;0;8;3;0;0;0;120;86;52;18
4;1;0;0;8;4;0;0;0;120;86;52;18
5;1;0;0;8;5;0;0;0;120;86;52;18
6;1;0;0;8;6;0;0;0;120;86;52;18
7;1;0;0;8;7;0;0;0;120;86;52;18
8;1;0;0;8;8;0;0;0;120;86;52;18
9;1;0;0;8;9;0;0;0;120;86;52;18
10;1;0;0;8;10;0;0;0;120;86;52;18
11;1;0;0;8;11;0;0;0;120;86;52;18
12;1;0;0;8;12;0;0;0;120;86;52;18
13;1;0;0;8;14;0;0;0;120;86;52;18
14;1;0;0;8;15;0;0;0;120;86;52;18
15;1;0;0;8;16;0;0;0;120;86;52;18
16;1;0;0;8;17;0;0;0;120;86;52;18
17;1;0;0;8;18;0;0;0;120;86;52;18
18;1;0;0;8;19;0;0;0;120;86;52;18
19;1;0;0;8;20;0;0;0;120;86;52;18
20;1;0;0;8;21;0;0;0;120;86;52;18
21;1;0;0;8;22;0;0;0;120;86;52;18
22;1;0;0;8;24;0;0;0;120;86;52;18
23;1;0;0;8;26;0;0;0;120;86;52;18
24;1;0;0;8;28;0;0;0;120;86;52;18
25;1;0;0;8;30;0;0;0;120;86;52;18
26;1;0;0;8;31;0;0;0;120;86;52;18
27;1;0;0;8;32;0;0;0;120;86;52;18
28;1;0;0;8;33;0;0;0;120;86;52;18
29;1;0;0;8;34;0;0;0;120;86;52;18
30;1;0;0;8;35;0;0;0;120;86;52;18
31;1;0;0;8;36;0;0;0;120;86;52;18
32;1;0;0;8;37;0;0;0;120;86;52;18
33;1;0;0;8;38;0;0;0;120;86;52;18
34;1;0;0;8;39;0;0;0;120;86;52;18
35;1;0;0;8;40;0;0;0;120;86;52;18
36;1;0;0;8;41;0;0;0;120;86;52;18
37;1;0;0;8;43;0;0;0;120;86;52;18

При формировании пакетов производится инкремент D0.
Видно, что произошла потеря 13, 23, 25, 27, 29, 42 пакета.
То есть, ARM_CAN1->TX говорит о том, что произошла передача данных, хотя в действительности передача не завершилась (данные не были приняты конвертером CAN2USB). После этого программа затирает еще не переданный пакет.

Что с этим делать?


Либо ошибка в коде программы, либо конвертер не успевает передать все пакеты в ПК.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2015-сен-15 17:02 
Не в сети
Аватара пользователя

Зарегистрирован: 2015-авг-28 11:25
Сообщения: 25
Да, это конвертер не успевает принимать фреймы. Просмотр линии показал, что все пакеты уходят и получают ACK. Спасибо.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2016-сен-12 11:20 
Не в сети

Зарегистрирован: 2012-апр-23 12:55
Сообщения: 47
Похожая проблема. Два контроллера 1986ВЕ91Т и 1986ВЕ1Т соединены по CAN. 91Т принимает, а 1Т передает. Если 91Т занят и не вычитывает данные из приемных буферов, 1Т не приостанавливает передачу, его передающие буфера продолжают опустошаться, из-за чего данные теряются. Как сделать, чтобы CAN передатчик замедлялся на уровне CAN, если приемник не успевает вычитывать данные?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2016-сен-12 12:27 
Не в сети

Зарегистрирован: 2009-май-22 09:01
Сообщения: 1299
Откуда: АО "ПКК Миландр"
Сергей86 писал(а):
Похожая проблема. Два контроллера 1986ВЕ91Т и 1986ВЕ1Т соединены по CAN. 91Т принимает, а 1Т передает. Если 91Т занят и не вычитывает данные из приемных буферов, 1Т не приостанавливает передачу, его передающие буфера продолжают опустошаться, из-за чего данные теряются. Как сделать, чтобы CAN передатчик замедлялся на уровне CAN, если приемник не успевает вычитывать данные?


Ну вообшем-то идея сетей CAN такого не предполагает. Если только для себя, то есть варианты, но они из разряда радиолюбительства.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2016-сен-12 12:58 
Не в сети

Зарегистрирован: 2012-апр-23 12:55
Сообщения: 47
Спасибо за ответ. Правильно ли я понял, что описанное мной поведение является нормой. То есть если передатчик отправляет приемнику пакет, когда у приемника заняты все приемные буфера и запрещена их перезапись, то у передатчика все равно сбрасывается бит TX_REQ в передающем буфере? Если так, то существует ли возможность для передатчика узнать, что приемник не записал пакет в свои буфера?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2016-сен-12 13:04 
Не в сети

Зарегистрирован: 2011-сен-05 12:12
Сообщения: 183
Откуда: Саратов
Сергей86 писал(а):
Спасибо за ответ. Правильно ли я понял, что описанное мной поведение является нормой. То есть если передатчик отправляет приемнику пакет, когда у приемника заняты все приемные буфера и запрещена их перезапись, то у передатчика все равно сбрасывается бит TX_REQ в передающем буфере? Если так, то существует ли возможность для передатчика узнать, что приемник не записал пакет в свои буфера?

Единственная встроенная в CAN обратная связь - бит подтверждения в посылке, куда хотя бы один опознавший посылку абонент должен записать "0". В противном случае (ни один абонент не признался, что опознал посылку), передатчик считает посылку не полученной и может повторить передачу.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2016-сен-12 13:35 
Не в сети

Зарегистрирован: 2009-май-22 09:01
Сообщения: 1299
Откуда: АО "ПКК Миландр"
Сергей86 писал(а):
Спасибо за ответ. Правильно ли я понял, что описанное мной поведение является нормой. То есть если передатчик отправляет приемнику пакет, когда у приемника заняты все приемные буфера и запрещена их перезапись, то у передатчика все равно сбрасывается бит TX_REQ в передающем буфере? Если так, то существует ли возможность для передатчика узнать, что приемник не записал пакет в свои буфера?


"Это норма".
Передатчик ничего не знает о приемниках. Если есть ACK хоть от одного приемника, то пакет ушел.
При этом приемник если видит нормальный пакет - то должен ответить ACK. Не важно что потом ему некуда его положить.

Можно попробовать RTR запросы применить. В этом случае ВЕ91 когда готов принять отправляет RTR запрос, на него ВЕ1 автоматически отправляет данные.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2016-сен-12 14:31 
Не в сети

Зарегистрирован: 2012-апр-23 12:55
Сообщения: 47
-=Sergei=- писал(а):
"Это норма"
Спасибо)))


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB