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

Высококачественные конденсаторы Panasonic для надежности вашей электроники!

Электролитические алюминиевые конденсаторы Panasonic отличаются повышенной надежностью, длительным сроком службы, низким импедансом и выдерживают большой ток пульсаций, в то время как семейства полимерных конденсаторов Panasonic SP-CAP, POSCAP, OS-CON и HYBRID характеризуют сверхнизкий ESR и увеличенная емкость, работа при высоких напряжениях и в расширенном температурном диапазоне. Приобретая продукцию Panasonic, вы гарантированно получаете самое передовое решение для ваших задач. Для облегчения вашего выбора, мы подготовили подборку полезных материалов.

Читать статьи

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
                     

Вебинар "Как создать BLE-устройство на базе новейшего беспроводного микроконтроллера STM32WB55"

27 ноября 2019 года компания КОМПЭЛ приглашает разработчиков, технических руководителей и энтузиастов беспроводной связи на вебинар, посвященный новинке 2019 года – мультипротокольному беспроводному микроконтроллеру STM32WB55, который позволяет создавать устройства на базе стандартов BLE 5.0; BLE Mesh; 802.15.4/ZigBee и Thread. На вебинаре мы покажем, как с помощью привычных инструментов STM32Cube и STM32CubeMX можно создать свое первое, надежно работающее BLE-приложение.

Зарегистрироваться на вебинар

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

  • Сообщения

    • а теперь - итог моего опыта) отмыл плату - поднялось напряжение) просадки в 1.5 вольта от запланированного при 150 ваттах - что более чем,похоже и вырубался бп из-за этого на более высокой частоте - не знаю . вторичку трансформатора не проверял на пульсации - на фото -ослик-одно плечо -выход- частоту вообще не показывает ,Рк-Рк - размах пульсаций - 800 мА - это норм ? или может не то смотрю , позже с электронной нагрузкой еще посмотрю - решить со снабером , на мою ВЫСОКО профессиональную пайку ) не обращайте внимание - мне его позже переделывать под усилитель . для-новичков - ес будете повторять - советую перечитать ветку - я постарался разобраться в ключевых моментах - не влезая в дикие дебри теории - так как сам неуч и в свой наступающий 4 десяток лет- не готов садится за парту) это хобби , многое из ветки для себя возьмете - поможет собрать,имхо.
    • И опять ошибаетесь. Это новые дины так сказать, не устаканились, т.е подвесная система ещё не разработана под нагрузкой (на поточном производстве дины не "тренируют", полагась, что со временем наработки птс придут в "рабочий режим", что и наблюдается на практике)и птс не соответствуют паспортным. А по прошествии большого количества времени механические детали "прирабатываются" и птс уже не изменяется, разве что кроме магнита. Стабильность его параметров зависит от качества материала и технологии изготовления. Феррит хоть и размагничивается дольше и медленнее ниодима/алнико но тоже боится нагрева и ударов. Так что нынешнее состояние птс ваших динов будет стабильным очень долго, на ваш век хватит. Поэтому есть смысл их снять вместе с афчх самих ас. Я вам уверенно могу заявить, что при Qts0.6 в данном объёме фи линейности афчх не будет. А что касаемо двух катушек, то всё просто. Нафига мотать новые когда есть готовые от других моделей. Вот и поставили последовательно две маленьких, суммарной ёмкостью равной одной большой. Кстати, сможете измерить их сопротивление постоянному току Rg? Ссогласно теории оно не должно превышать 5%Re дина. Идеально когда Rg ближе к нулю, но медь не сверхпроводник... поэтому чем ниже тем для дина самый ништяк. Ведь любое сопротивление это потери полезного сигнала. И первыми теряются самые низкоамплитудные = тихие звуки, которых в любой музыке как пчёл в улье. Претензий нет тому как вам сравнить не с чем, плюс привычка=адаптация мозга. Стоит сделать Qtc близким к 0.707 и сразу услышите разницу, словно акустика приобрела второе дыхание. Вот попробуйте намотать одну катушку той же индуктивности но с сопротивлением Rg хотя бы 0.4ома и сравните звучание. Такая же песня с катушкой фвч твитера. 
    • Кто подскажет, где можно купить по нормальной цене, верхний нагреватель такой, ELSTEIN SHTS/100 800W и ELSTEIN SHTS/4 300W.? 
    • А почему "каноническая" от TI а не от бывшего National Semiconductor?) Графики от on semi. Как определить каноничность 1117 интересно?) Может AMS1117? Есть мнение что первые буквы внутреннюю структуру 1117 не изменяют иначе последующие цифры стали бы другие.
    • Давайте по другому. Уровень тестового сигнала по осциллографу соответствует примерно 6 ваттам вых. мощности и  0,7%  ТНD       Шмелева  -  Спектраплюса. Тесты проводились в моно режиме для каждого канала отдельно. Результаты тестов: Шумы левого канала: Шумы правого канала: Что скажете? Решил замерить характеристики звуковой карты при том же уровне тестового сигнала (-5,4 дБ) Шумы звуковухи: Сравнение: То есть, получается, что фактически мы замеряли звуковую карту, а реальные  шумовые и динамические характеристики усилителя намного выше?
    • Добрый день! Разобрал его для ремонта потенциометра на низкие чатоты. Корпус магнитолы облокотился на лицевую часть мафона, и когда я дотронулся до динамика звук пропал,при этом корпус который облокотился на лицевую часть приподнялся. По сути я просто дотронулся до динамика, не было ни искр замыкания, запаха .дыма итд и звук пропал резко. Все было исправно до этого! И кнопки громкости не реагируют на мотор регулятора громкости. все остальное работает (кнопки пульта ДУ). В наушниках тоже нет звука по всем каналам (радио, кассеты, сд, аух) Но при касании пальца по контактам шипение есть. Вообще не понимаю что произошло. Кто что думает. День пропал расстроился ( На фото показано все как было в таком положении я лишь прикоснулся к правому динамику...
×
×
  • Create New...