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

Литиевые батарейки Fanso для систем телеметрии и дистанционного контроля

Системы телеметрии находят все более широкое применение во многих отраслях на промышленных и коммунальных объектах. Требования, предъявляемые к условиям эксплуатации приборов телеметрии и, как следствие, источников питания для них, могут быть довольно жесткими. Fanso предоставляет широкую линейку продукции, рассчитанной на различные условия эксплуатации, что позволяет подобрать батарейку для каждого конкретного применения, в том числе и для устройств телеметрии.

Подробнее

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
                     

Приглашаем на вебинар Решения для построения ультразвуковых счетчиков жидкостей и газов на базе MSP430

Компэл совместно с Texas Instruments 23 октября 2019 приглашают на вебинар, посвященный системам-на-кристалле для построения ультразвуковых расходомеров жидкостей и газов на базе ядра MSP430. Вебинар проводит Йоханн Ципперер – эксперт по ультразвуковым технологиям, непосредственно участвовавший в создании данного решения. На вебинаре компания Texas Instruments представит однокристальное решение, позволяющее создавать точные недорогие счетчики жидкостей и газов.

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

Да все верно шина там работает на 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...

×
×
  • Create New...