Страница 1 из 1
CAN + STM32 помогите разобраться
Добавлено: Ср июл 25, 2012 14:48:51
spectral1
Здравствуйте! Помогите пожалста начинающему. У меня отладочная плата на базе STM32f103RE Диодами помигал, прерывание по кнопке сделал, дисплей зажег. Нужно ковырять интерфейсы, до этого никогда не имел с ними дела, без подсказок мне сложно разобраться. Как работают примеры не понятно:( Для начала хочу хоть что-нибудь послать по CAN.
Как я понял, посылки в CAN формируются без адреса, устройство само определяет получать ли ей посылку или отвергнуть. Сам кадр выглядит так:

Не могу понять для себя последовательность действий при формировании кадра. Сейчас я это вижу примерно так:
1) Разрешаю тактирование портов ввода-вывода, CAN, альтернативных функций порта(в моем случае)
2) Настраиваю порты ввода-вывода. Tx - выход push-pull, Rx - input with pull-up/pull-down
3) Настраиваю CAN:
-режим работы. к примеру ставлю нормал
-выставляю baudrate. в регистр нужно заносить значение в герцах в шестнадцатеричной форме?
-задаю длину посылки, выставляю RTR и IDE
-что за регистр NVIC? и почему его нет в даташите, а в примерах он настраивается:
Код: Выделить всё
NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn;
-собираю посылку и отправляю. на этом этапе тоже не понятно, посылка собирается с помощью массива? как отправить посылку?

и еще пара вопросов по СИ:
1) void Init_RxMes(CanRxMsg *RxMessage);
в скобках перечисляются входные параметры функции, что значит звездочка? и почему запятой нет?
2) uint8_t KeyNumber = 0x0;
unit8_t - говорит о том, что число восьмибитное?
3)
Код: Выделить всё
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
здесь собирается структура и результат обрабатывается через NVIC_Init()? зачем тогда нужен символ "&"?
простите за глупые вопросы:)
Re: CAN + STM32 помогите разобраться
Добавлено: Чт июл 26, 2012 07:46:04
spectral1
Со структурами и указателями разобрался, с NVIC тоже стало понятно.
Скачал пример с сайта Keil, разобрался как он работает. Но есть проблема, когда пробую в эмуляторе Keil'a отправить самому себе посылку в режиме Loop back & Silent mode - то посылку видно в исходящих, но в принятых ее почему-то нет. В чем проблема?
Re: CAN + STM32 помогите разобраться
Добавлено: Пн авг 13, 2012 11:36:20
Ruslan-maniak
Приветствую. Тоже столкнулся с проблемой в изучении CAN. Пишу под STM32f207 с использованием стандартной библиотеки пирефирии от ST. Код следующий:
Спойлер
Код: Выделить всё
#include "stm32f2xx.h"
int main(){
GPIO_InitTypeDef GPIO_InitStructure;
//Enable CAN clock
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1 | RCC_APB1Periph_CAN2 , ENABLE);
// Àêòèâàöèÿ ïîðòà PB è PE
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOE, ENABLE);
// êîíôèãóðàöèÿ îòëàäî÷íîãî ïèíà
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_Init(GPIOE, &GPIO_InitStructure);
/* Configure CAN RX and TX pins */
GPIO_InitStructure.GPIO_Pin = GPIO_PinSource12 | GPIO_PinSource13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
// CAN configuration ********************************************************/
//Connect CAN pins to AF9
GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_CAN2);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_CAN2);
/* CAN register init */
CAN_DeInit(CAN2);
CAN_InitTypeDef CAN_InitStructure;
CAN_Init(CAN2, &CAN_InitStructure);
/* CAN cell init */
CAN_InitStructure.CAN_TTCM = DISABLE;
CAN_InitStructure.CAN_ABOM = DISABLE;
CAN_InitStructure.CAN_AWUM = DISABLE;
CAN_InitStructure.CAN_NART = DISABLE;
CAN_InitStructure.CAN_RFLM = DISABLE;
CAN_InitStructure.CAN_TXFP = DISABLE;
CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;
CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
// CAN Baudrate
CAN_InitStructure.CAN_BS1 = CAN_BS1_16tq;
CAN_InitStructure.CAN_BS2 = CAN_BS2_8tq;
CAN_InitStructure.CAN_Prescaler = 10;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
CAN_FilterInitStructure.CAN_FilterNumber = 14;
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;
CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0;
CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
CAN_ITConfig(CAN2, CAN_IT_FMP0, ENABLE);
uint8_t TransmitMailbox = 0;
CanTxMsg TxMessage;
TxMessage.StdId = 0x321;
TxMessage.ExtId = 0x01;
TxMessage.RTR = CAN_RTR_DATA;
TxMessage.IDE = CAN_ID_EXT;//CAN_ID_STD;
TxMessage.DLC = 1;
TxMessage.Data[0] = 0x05;
TxMessage.Data[1] = 0x06;
TxMessage.Data[2] = 0x07 ;
TxMessage.Data[3] = 0x08 ;
TxMessage.Data[4] = 0x09 ;
TxMessage.Data[5] = 0x0A ;
TxMessage.Data[6] = 0x0B ;
TxMessage.Data[7] = 0x0C ;
while(1)
{
TransmitMailbox=CAN_Transmit(CAN2, &TxMessage);
uint32_t k = 0xffff; // òàéìåð òàéìàóòà ïî çàâåðøåíèè ïåðåäà÷è
while((CAN_TransmitStatus(CAN2, TransmitMailbox) != CANTXOK) && k )
{
k--;
}
CAN_CancelTransmit (CAN2 , TransmitMailbox);
}
return 1;
}
В ходе программы проверка CAN_TransmitStatus возвращает код успешной передачи. Но осцилографом я ничего не вижу на пине. В чём может быть подвох. У же перелопатил и описание библиотеки и примеры от ST. Не могу понять что делаю не так.
Re: CAN + STM32 помогите разобраться
Добавлено: Вт авг 14, 2012 13:33:14
spectral1
тактирование AFIO? Remap?
з.ы. у меня заработало

Re: CAN + STM32 помогите разобраться
Добавлено: Ср авг 15, 2012 07:23:35
Ruslan-maniak
spectral1 писал(а):тактирование AFIO? Remap?
з.ы. у меня заработало

Тактирование AF
Код: Выделить всё
GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_CAN2);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_CAN2);
А ремапа на 2хх нет. Там напрямую определяешь порты и номер CAN'a.
Re: CAN + STM32 помогите разобраться
Добавлено: Ср авг 22, 2012 11:57:24
Ruslan-maniak
Причём если вместо Normal Mode, включить loopBack - то пакеты отправляются. Подскажите в чём косяк. Уже руки опускаются.
Re: CAN + STM32 помогите разобраться
Добавлено: Ср авг 22, 2012 14:40:19
spectral1
смотрите примеры в std.library, регистр ошибок, если ошибок не возникает - скорее всего все ок с программной частью. у вас отладка поди чья-нибудь? скорее всего через микросхему подается на клеммы сигнал, смотрите на входе микросхемы синал, смотрите схему включения микросхемы.
Re: CAN + STM32 помогите разобраться
Добавлено: Чт авг 23, 2012 04:40:41
Ruslan-maniak
Примеры мало того что смотрел, почти всё оттуда передрал: инициализации и функции отправки - один в один. Нет, не отладка, а плата разработанная моим коллегой. Сигнал смотрю на пине контроллера. Щас буду смотреть регистр ошибок.
Посмотрел, ошибок нет. Вот на всякий случай выкладываю архив с проектом.
Re: CAN + STM32 помогите разобраться
Добавлено: Пт авг 24, 2012 05:41:24
Ruslan-maniak
Соврал. Есть ошибки, но читая реф.ман. я не могу понять в чём они заключаются. Вот регистры кана после выполнения трансмита

При лупбэке по прежнему ошибок нет. Попробовал на другой отладке(stm32F103) используя ИАРовские примеры. Абсолютно тоже самое получается. В чём то принципиальная ошибка. Но не понимаю в чем.

Re: CAN + STM32 помогите разобраться
Добавлено: Вт мар 04, 2014 22:51:12
wellcom
Приветик всем. Кто сталкивался с реализацией самопрограммирования СТМ32 через CAN (не UART)? Есть ли первопроходцы?
Re: CAN + STM32 помогите разобраться
Добавлено: Ср мар 05, 2014 14:37:39
Myp3ik
Ruslan-maniak, когда вы отправляете посылку по CAN, кто у Вас её принимает ? CAN не может передать посылку в никуда, это не UART. Если на шине никого нет, то устанавливается ошибка BUSOFF.
Re: CAN + STM32 помогите разобраться
Добавлено: Чт мар 06, 2014 01:31:26
Myp3ik
wellcom, там все предельно просто, какие у Вас трудности возникли ?
Re: CAN + STM32 помогите разобраться
Добавлено: Чт мар 06, 2014 22:42:53
wellcom
Myp3ik писал(а):wellcom, там все предельно просто, какие у Вас трудности возникли ?
честно говоря пока что не знаю с чего начать....как и куда писать загрузчик, как его выгрузить в оперативку и передавать управление, в каком формате подготовить и передать пакет. Что произойдет, если бутлоадер заглючит или еще хуже затрет себя сам (или лучше прошивку шить сразу с булоадером, а если не дошьется?) Я пока не силен в СТМ

Может смысл делать двойной бутлодер, если с 1 что то случилось и не прошилась прога, после рестарта запускать 2-й бутлодырь (запасной).
Может есть у кого какие идеи, примеры, наработки и готов поделится ими - буду благодарен, и уверен не только один я

Re: CAN + STM32 помогите разобраться
Добавлено: Сб мар 08, 2014 23:32:07
Myp3ik
wellcom, загрузчик писать во флеш, например, первые несколько страниц памяти зарезервировать под загрузчик. В RAM его выгружать не надо, достаточно поместить туда только функции которые будут записывать во флеш программу.
Откуда собираетесь передавать данные в МК? У Вас есть USB-CAN адаптер или что-то в этом роде ?
Re: CAN + STM32 помогите разобраться
Добавлено: Вс мар 09, 2014 11:34:10
wellcom
Myp3ik писал(а):wellcom, загрузчик писать во флеш, например, первые несколько страниц памяти зарезервировать под загрузчик. В RAM его выгружать не надо, достаточно поместить туда только функции которые будут записывать во флеш программу.
Откуда собираетесь передавать данные в МК? У Вас есть USB-CAN адаптер или что-то в этом роде ?
Замысел такой: прошивка из ПК->LAN->STM32(или прошивка с SD)->CAN->STM32(прошиваемый(-е) контроллер(-ы) N шт)
Я так понимаю, при рестарте мк с начала грузится самозагрузчик, с соотв. настройкой CAN перифери и ждать некое время команды с адресом на шине CAN данного мк и далее ждать пакета прошивки, спустя некое время, если нет пакета/команды переходить на основную программу. С основной проги, по необходимости перепрыгивать на загрузчик по команде.
Прошивку передавать с CRC, и если пакет неверный делать перезапрос его, при этом вести счетчик пакетов.
Может кто подправит/добавит?
Что Вы имели ввиду - "достаточно поместить туда только функции которые будут записывать во флеш программу", по сути ведь это и есть загрузчик, загружаемый в ОЗУ...или я чего то не допонял?