Jump to content
Smith2007

CAN снифер

Recommended Posts

Posted (edited)

Имеется контроллер STM32F103RET6.

На CAN интерфейс подключен трансивер TJA1040

USART подключаю к компьютеру на котором запускаю CAN Hacker.

Создал проект (Keil) с использованием библиотек cmsis. 

Включаю режим CAN_Mode_LoopBack. Отправляю пакет в цикле из CAN Hacker и получаю его же обратно.

Прием пакетов по прерыванию в кольцевой буфер. 

Осцилографом становлюсь на выход трансивера (CANH, CANL)

photo_2019-03-07_21-51-54.jpg.239abf13f7471c4e3d921057f2b2fae8.jpg

Количество отправленных пакетов = количеству принятых. При разных установленных скоростях шины - длительность сигналов так же меняется.

Подключаюсь к CAN Шине авто.

Ни одного пакета принять не могу. Подозреваю, что я не верно выставляю тайминги.

DSC_1437.thumb.JPG.7fa5626d0e06b6e07f2933fd13d90e6a.JPG

 

Как правильно определить параметры таймингов по форме сигнала? (цена деления 2 мкс)

 

Edited by Smith2007

Share this post


Link to post
Share on other sites

ну надо почитать спецификацию на CAN, там все подробненько изложено. Лупбэк будет работать полюбому, так как отправка и прием идет на одной скорости. А для того чтобы "нюхать" чужой поток надо как минимум знать его частоту. Иначе нишиша асинхронный CAN не примет

Share this post


Link to post
Share on other sites
Posted (edited)

Какая частота синхронизации? и какие значения в этих регистрах CAN_SJW, CAN_BS1, CAN_BS2, CAN_Prescaler ? и какое авто?

Edited by optima

Share this post


Link to post
Share on other sites

Технология Maxim Integrated nanoPower: когда малый IQ имеет преимущества

При разработке устройств с батарейным питанием важно выбирать компоненты не просто с малым потреблением, но и с предельно малым током покоя. При этом следует обратить внимание на линейку nanoPower производства компании Maxim Integrated. В статье рассмотрено их применение на примере системы датчиков беспроводной оконной сигнализации.

Подробнее

Posted (edited)
48 минут назад, optima сказал:

Какая частота синхронизации? и какие значения в этих регистрах CAN_SJW, CAN_BS1, CAN_BS2, CAN_Prescaler ? и какое авто?

Автомобиль УАЗ Патриот 2016 года. 

На разъеме OBD имеются пины 6 и 14.

Судя по описанию распиновки разъема (найдено в инете) это и есть CANH, CANL

В этот разъем подключаю ELM327 -, загружаю torque pro.

5c8531f0da3bb_2019-03-0222-15-37.thumb.PNG.480af47bfa179feb5540b726a2681ac7.PNG

 

Если я правильно понимаю, то ELM327 цепляется через этот разъем к скоростной шине 500 кбит. Доступные датчики.

Screenshot_2019-03-10-20-43-49.thumb.png.43dd414058ac53e65ff449dba72d6ebd.png

Частота тактирования CAN шины 36 МГц

2019-03-10_20-54-43.png.0382d442f543b597301ad2d41025b674.png

 

2019-03-10_20-59-02.png.bf1f58d772edb5de179e5c3f43ca1d1a.png

 

Prescaler=  6,  Seg1 = 6, Seg2 = 5

36/6/(1+6+5) = 500 кбит.

SJW ставил 1, 2, 3 - не помогло.

Осцилограмма сигнала

2019-03-10_21-03-07.png.d79997c7398d4d87a50d1412916548c3.png

 

Процедура инициализации CAN

//*****************************************************************
//
//  Модуль CAN шины
//
//
//
//*****************************************************************
#include "can.h"

void init_CAN(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;

	/* CAN GPIOs configuration */
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); 		// включаем тактирование AFIO
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); 				// включаем тактирование порта

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);		// включаем тактирование CAN-шины
	
	// Настраиваем CAN RX pin GPIOA Pin11
	GPIO_InitStructure.GPIO_Pin   = CAN1_RX_SOURCE;
	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(CAN1_GPIO_PORT, &GPIO_InitStructure);

	// Настраиваем CAN TX pin GPIOA Pin12
	GPIO_InitStructure.GPIO_Pin   = CAN1_TX_SOURCE;
	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(CAN1_GPIO_PORT, &GPIO_InitStructure);

  	// Включаем трансивер GPIOB Pin1
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	GPIO_InitStructure.GPIO_Pin   = CAN1_STB_PIN;
	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
	GPIO_Init(CAN1_STB_PORT, &GPIO_InitStructure);
	GPIO_WriteBit(CAN1_STB_PORT, CAN1_STB_PIN, Bit_SET );
	
	#ifdef CAN1_ReMap
		GPIO_PinRemapConfig(GPIO_Remap1_CAN1, ENABLE);			// Переносим Can1 на PB8, PB9
	#endif

	// Инициализация режима CAN шины по умолчанию
	CAN_InitStructure.CAN_TTCM = DISABLE;
	CAN_InitStructure.CAN_ABOM = DISABLE;	// DISABLE
	CAN_InitStructure.CAN_AWUM = ENABLE;
	CAN_InitStructure.CAN_NART = ENABLE;	// DISABLE
	CAN_InitStructure.CAN_RFLM = DISABLE;
	CAN_InitStructure.CAN_TXFP = DISABLE;
	CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;			// Обычный режим работы устройства
	//CAN_InitStructure.CAN_Mode = CAN_Mode_LoopBack;	// Для тестирования без подключенных устройств шины
	CAN_InitStructure.CAN_BS1 = CAN_BS1_13tq;
	CAN_InitStructure.CAN_BS2 = CAN_BS2_2tq;
	CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
	CAN_InitStructure.CAN_Prescaler = CAN1_SPEED_500KB;	// Выбираем нужную скорость
	
	CAN_Init(CAN1, &CAN_InitStructure);

	// CAN filter init
	CAN_Filter.CAN_FilterNumber = 0;
	CAN_Filter.CAN_FilterMode = CAN_FilterMode_IdMask;
	CAN_Filter.CAN_FilterScale = CAN_FilterScale_32bit;
	CAN_Filter.CAN_FilterIdHigh = 0x0000;
	CAN_Filter.CAN_FilterIdLow = 0x0000;
	CAN_Filter.CAN_FilterMaskIdHigh = 0x0000;
	CAN_Filter.CAN_FilterMaskIdLow = 0x0000;
	CAN_Filter.CAN_FilterFIFOAssignment = CAN_FIFO0;
	CAN_Filter.CAN_FilterActivation = ENABLE;
	CAN_FilterInit(&CAN_Filter);

	// CAN FIFO0 message pending interrupt enable
	CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);

	// NVIC Configuration
	// Enable CAN1 RX0 interrupt IRQ channel
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
	
}

#ifdef __cplusplus
 extern "C" {
#endif
  

//**********************************************
// Устанавливаем параметры шины
//
//**********************************************
void CAN_Setup(CAN_InitTypeDef CAN_InitStructure){

	CAN_Init(CAN1, &CAN_InitStructure);
}

//**********************************************
// Устанавливает скорость CAN
//
//**********************************************
void CAN_Speed(uint16_t prescaler, uint8_t bs1, uint8_t bs2, uint8_t sjw) {
	CAN_InitStructure.CAN_BS1 = bs1;
	CAN_InitStructure.CAN_BS2 = bs2;
	CAN_InitStructure.CAN_SJW = sjw;
	CAN_InitStructure.CAN_Prescaler = prescaler;	// Выбираем нужную скорость
	CAN_Setup(CAN_InitStructure);
}

В данном случае скорость шины выставляется настройками CANHacker.

 

 

Edited by Smith2007

Share this post


Link to post
Share on other sites
Posted (edited)

Вопрос еще закрался....

Если после инициализации контроллера я создаю новые настройки (собираю структуру с новыми параметрами) и выполняю 

CAN_Init(CAN1, &CAN_InitStructure);

Это правильно?

Или нужно сначала сделать DeInit?

 

 

upd.

Подключился к шине в режиме отладки.

Изменения наблюдаю только в одном регистре MSR

2019-03-10_15-35-29.png.ba874575ee125ad0f00427772566457e.png2019-03-10_15-35-49.png.df767c697f444c6bd1d59a4516b07510.png

Edited by Smith2007

Share this post


Link to post
Share on other sites
                     

Материалы вебинара STM32G0 – новый лидер бюджетных 32-битных микроконтроллеров от STMicroelectronics

На вебинаре были продемонстрированы современные методы тестирования производительности микроконтроллеров на примере самых бюджетных 32-битных семейств общего назначения STM32G0 и STM32F0, проведено их подробное сравнение. Мы подготовили для вас материалы. Вы можете посмотреть видеозапись вебинара, ознакомиться с ответами на вопросы, загрузить код для тестирования, прочитать статьи по теме

Подробнее...

Да все верно шина там работает на 500к. По расчетам скорости тоже все верно. Так что с таймингами думаю порядок.  Возможно еще что то упустили в настройках!

1 минуту назад, Smith2007 сказал:

Это правильно?

Да вообще не вопрос, сколько надо столько и перестраивай.

я перестраивал и без  DeInit проблем не возникало, но правильно думаю с DeInit

Share this post


Link to post
Share on other sites

3 дня вожусь и не пойму в чем причина.

Может это СФТ протокол особенный (ISO15765-4CAN11/500), который stm32 не понимает?

Share this post


Link to post
Share on other sites

Создайте в CubeMx проект
"из короьбки" там все работает

могли не проинициализировать DMA

могли не включить прерывание

могли неверно задать фильтр

и т.д. и т.п.

 

А все ваши посты - гадание на кофейно гуще

Share this post


Link to post
Share on other sites
22 минуты назад, Smith2007 сказал:

Может это СФТ

Вряд ли. Почему в настройках у тебя значения  CAN_BS1_13tq; CAN_BS2_2tq;  CAN_SJW_1tq; не такие как были указаны ранее?

Share this post


Link to post
Share on other sites

Прерывание, фильтры и т.д. - все работает. Я же проверяю работу в режиме loopback. Все принимается и отправляется. Параллельно слежу осцилографом за сигналом. Вижу изменения и уже различаю 0 и 1. 

 

2 минуты назад, optima сказал:

CAN_BS1_13tq; CAN_BS2_2tq;  CAN_SJW_1tq; не такие как были указаны ранее?

Скорость задается при подключении CAN Hacker. Происходит переинициализация структуры настроек.

2019-03-10_22-11-16.png.930f278761ff4afc938c477f524289a5.png

 

2019-03-10_22-10-41.png.bc9d06490a0ff5a589f4cdc31971c2ea.png

 

2019-03-10_22-11-32.png.cee4bea32b0a912889ec2e555c1dd578.png

 

 

Share this post


Link to post
Share on other sites

А выше что за

1 час назад, Smith2007 сказал:

Процедура инициализации CAN

Судя по ней если preskaler остается равным 6 то 500к уже не получается!  36/6/(13+2+1)

Share this post


Link to post
Share on other sites
2 минуты назад, optima сказал:

Судя по ней если preskaler остается равным 6 то 500к уже не получается!  36/6/(13+2+1)

define подставляется

2019-03-10_22-25-44.png.f6608f5982abca875f916f079a0625b2.png

Share this post


Link to post
Share on other sites

Собрал с нуля проект из примеров Кейла.

Не читает :(

Завтра соберу два МК и соединю их по КАН. Проверю работу КАН таким образом.

 

Share this post


Link to post
Share on other sites
14 часа назад, optima сказал:

 

А вообще прерывание по приему работает?

 

Ни одного прерывания не получаю

Share this post


Link to post
Share on other sites
Posted (edited)

Сам себе отвечу.

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

//**********************************************************************/
//         Тестирование скорости приема с CAN
//
//**********************************************************************/
void app_CANScaner (void *argument) {
	USARTSend("CAN Scaner\n\r");
	CanRxMsg msg;
	uint32_t speed;
	uint32_t ratio;

	uint8_t rec;
	uint8_t lec;

  while(1) {
		USARTSend("Prescaler\tBS1\tBS2\tSpeed\tRatio \n\r");
		for (uint16_t prescaler = 1; prescaler < 15; prescaler++) {
			for (uint8_t bs1 = CAN_BS1_1tq; bs1 <= CAN_BS1_16tq; bs1++) {
				for (uint8_t bs2 = CAN_BS2_1tq; bs2 <= CAN_BS2_8tq; bs2++) {
					//while (CAN_RxFrameCount() == 0);
					CAN_InitStructure.CAN_Prescaler = prescaler;
					CAN_InitStructure.CAN_BS1 = bs1;
					CAN_InitStructure.CAN_BS2 = bs2;
					CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
					//CAN_InitStructure.CAN_Mode = CAN_Mode_LoopBack;	// Для тестирования без подключенных устройств шины
					Reinit_CAN();
					osDelay(200);
					lec = CAN_GetLastErrorCode(CAN1);  // err == CAN_ErrorCode_NoErr
					rec = CAN_GetReceiveErrorCounter(CAN1);
					if (rec == 0 and lec == 0) {
						speed = 36000000/CAN_InitStructure.CAN_Prescaler/(1+ CAN_InitStructure.CAN_BS1 + 1 + CAN_InitStructure.CAN_BS2 + 1);
						ratio = CAN_InitStructure.CAN_BS1 * 1000 / (1+ CAN_InitStructure.CAN_BS1 + 1 + CAN_InitStructure.CAN_BS2 + 1);
						USARTSend("\t"); USARTSend(CAN_InitStructure.CAN_Prescaler, 'd'); 
						USARTSend(" \t"); USARTSend(CAN_InitStructure.CAN_BS1 + 1, 'd');
						USARTSend(" \t"); USARTSend(CAN_InitStructure.CAN_BS2 + 1, 'd');
						//USARTSend("\t"); USARTSend(CAN_InitStructure.CAN_SJW + 1, 'd');
						USARTSend(" \t"); USARTSend(speed, 'd');
						USARTSend(" \t"); USARTSend(ratio, 'd');
						USARTSend("     ");
						USARTSend("\n\r");
					}
					else {
						USARTSend("\t"); USARTSend(CAN_InitStructure.CAN_Prescaler, 'd'); 
						USARTSend(" \t"); USARTSend(CAN_InitStructure.CAN_BS1 + 1, 'd');
						USARTSend(" \t"); USARTSend(CAN_InitStructure.CAN_BS2 + 1, 'd');
						USARTSend("     ");
						USARTSend("\r");
					}
					//osDelay(50);
				}
			}
		}		
	}
}

Загрузил в контроллер, подключил к шине авто и запустил.

Через некоторое время получил результат.

2019-03-15_21-49-29.thumb.png.28932cfcf44b78e124c9e6ce5e2f511a.png

Затем сравнил полученные показатели настроек с тем, что я делал и сразу обнаружил ошибку.

Ранее при настройке BS1, BS2 я указывал просто числа 1, 2, 3 ..и т.д. Однако если взглянуть на дефайны

/** @defgroup CAN_time_quantum_in_bit_segment_1 
  * @{
  */

#define CAN_BS1_1tq                 ((uint8_t)0x00)  /*!< 1 time quantum */
#define CAN_BS1_2tq                 ((uint8_t)0x01)  /*!< 2 time quantum */
#define CAN_BS1_3tq                 ((uint8_t)0x02)  /*!< 3 time quantum */
#define CAN_BS1_4tq                 ((uint8_t)0x03)  /*!< 4 time quantum */
#define CAN_BS1_5tq                 ((uint8_t)0x04)  /*!< 5 time quantum */
#define CAN_BS1_6tq                 ((uint8_t)0x05)  /*!< 6 time quantum */
#define CAN_BS1_7tq                 ((uint8_t)0x06)  /*!< 7 time quantum */
#define CAN_BS1_8tq                 ((uint8_t)0x07)  /*!< 8 time quantum */
#define CAN_BS1_9tq                 ((uint8_t)0x08)  /*!< 9 time quantum */
#define CAN_BS1_10tq                ((uint8_t)0x09)  /*!< 10 time quantum */
#define CAN_BS1_11tq                ((uint8_t)0x0A)  /*!< 11 time quantum */
#define CAN_BS1_12tq                ((uint8_t)0x0B)  /*!< 12 time quantum */
#define CAN_BS1_13tq                ((uint8_t)0x0C)  /*!< 13 time quantum */
#define CAN_BS1_14tq                ((uint8_t)0x0D)  /*!< 14 time quantum */
#define CAN_BS1_15tq                ((uint8_t)0x0E)  /*!< 15 time quantum */
#define CAN_BS1_16tq                ((uint8_t)0x0F)  /*!< 16 time quantum */

1 тайм квант (1tq) указывается как 0, а не 1.

Указал верные значения и вуаля!

2019-03-16_00-17-50.png.a5dd532d36597915eaafad455e8550a0.png

CANHacker подцепился с ходу.

Edited by Smith2007

Share this post


Link to post
Share on other sites

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Сообщения

    • Что то вроде такого. D5 светодиод оптореле
    • при моделировании не использовать конденсаторы...приму к сведению. эмиттерные резисторы НАСТОЯТЕЛЬНО рекомендовали. поэтому  они у меня даже на ПП есть. и в дальнейшем они же перекочевали в тот самый Гибрид. @PenZioNer , т.е. Вы сделали ТП в 750мА? зачем такой Огроменный?   простите а что Вы имели ввиду про Наушниковый усь? каким боком он к теме ? цитата выше, относится к ушному усю или то к чему я тему подвожу - к ГИБРИДУ? при измерениях в РМАА он действительно показал хорошие результаты. конечная моя цель Тоже - Би-ампинг и Активное деление по НЧ/СЧ. но это далеко впереди)))
    • К сожалению не довел дело до конца. Пока этим занимался пришла мысль просто поменять автомагнитолу что и сделал.
    • -ИМХО- криволинейный участок для 6н9с- когда Rа=300ком, смещение не фиксировал, что накрутилось. Этот режим был только для снятия спектра. -вопрос о 20% в этой теме уже отпадает. Однотакт 6н9с-6с5с\КП\-6550\триод\  не зазвучал: эксперт заявил, что звук зажатый. Был переделан: 6ж4\в триоде\- 6550, а затем и на КТ66. Следующим этапом стал новый  6с2с-КТ66. В первый день прослушивания на своих колонках товарищ заявил, что звучит скучновато, видимо сразу после двухтакта. Для полноты эксперимента 6ж4-КТ66 перевел в УЛ с 20%. Будем сравнивать.
    • Современые медицинские технологии очень отличаются от уровня муниципальной районной поликлиники. За деньги они себе любой орган пересадят сколько захотят раз. 
    • Ууууу это бред,перевод идет в местный банк,а там уже может быть,но прямыми платежи эти не получаются
×
×
  • Create New...