CAN + STM32 помогите разобраться

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
spectral1
Родился
Сообщения: 19
Зарегистрирован: Пт июн 29, 2012 19:10:40

CAN + STM32 помогите разобраться

Сообщение 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()? зачем тогда нужен символ "&"?

простите за глупые вопросы:)
spectral1
Родился
Сообщения: 19
Зарегистрирован: Пт июн 29, 2012 19:10:40

Re: CAN + STM32 помогите разобраться

Сообщение spectral1 »

Со структурами и указателями разобрался, с NVIC тоже стало понятно.

Скачал пример с сайта Keil, разобрался как он работает. Но есть проблема, когда пробую в эмуляторе Keil'a отправить самому себе посылку в режиме Loop back & Silent mode - то посылку видно в исходящих, но в принятых ее почему-то нет. В чем проблема?
Вложения
screen.zip
(300.85 КБ) 403 скачивания
stm32 can keil example.zip
(555.46 КБ) 586 скачиваний
Ruslan-maniak
Открыл глаза
Сообщения: 40
Зарегистрирован: Вт янв 18, 2011 08:15:32

Re: CAN + STM32 помогите разобраться

Сообщение 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. Не могу понять что делаю не так.
spectral1
Родился
Сообщения: 19
Зарегистрирован: Пт июн 29, 2012 19:10:40

Re: CAN + STM32 помогите разобраться

Сообщение spectral1 »

тактирование AFIO? Remap?

з.ы. у меня заработало :)
Ruslan-maniak
Открыл глаза
Сообщения: 40
Зарегистрирован: Вт янв 18, 2011 08:15:32

Re: CAN + STM32 помогите разобраться

Сообщение 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.
Ruslan-maniak
Открыл глаза
Сообщения: 40
Зарегистрирован: Вт янв 18, 2011 08:15:32

Re: CAN + STM32 помогите разобраться

Сообщение Ruslan-maniak »

Причём если вместо Normal Mode, включить loopBack - то пакеты отправляются. Подскажите в чём косяк. Уже руки опускаются.
spectral1
Родился
Сообщения: 19
Зарегистрирован: Пт июн 29, 2012 19:10:40

Re: CAN + STM32 помогите разобраться

Сообщение spectral1 »

смотрите примеры в std.library, регистр ошибок, если ошибок не возникает - скорее всего все ок с программной частью. у вас отладка поди чья-нибудь? скорее всего через микросхему подается на клеммы сигнал, смотрите на входе микросхемы синал, смотрите схему включения микросхемы.
Ruslan-maniak
Открыл глаза
Сообщения: 40
Зарегистрирован: Вт янв 18, 2011 08:15:32

Re: CAN + STM32 помогите разобраться

Сообщение Ruslan-maniak »

Примеры мало того что смотрел, почти всё оттуда передрал: инициализации и функции отправки - один в один. Нет, не отладка, а плата разработанная моим коллегой. Сигнал смотрю на пине контроллера. Щас буду смотреть регистр ошибок.

Посмотрел, ошибок нет. Вот на всякий случай выкладываю архив с проектом.
Вложения
first.rar
(292.19 КБ) 409 скачиваний
Ruslan-maniak
Открыл глаза
Сообщения: 40
Зарегистрирован: Вт янв 18, 2011 08:15:32

Re: CAN + STM32 помогите разобраться

Сообщение Ruslan-maniak »

Соврал. Есть ошибки, но читая реф.ман. я не могу понять в чём они заключаются. Вот регистры кана после выполнения трансмита
Изображение

При лупбэке по прежнему ошибок нет. Попробовал на другой отладке(stm32F103) используя ИАРовские примеры. Абсолютно тоже самое получается. В чём то принципиальная ошибка. Но не понимаю в чем. :cry:
Аватара пользователя
wellcom
Нашел транзистор. Понюхал.
Сообщения: 190
Зарегистрирован: Чт фев 24, 2011 13:00:49

Re: CAN + STM32 помогите разобраться

Сообщение wellcom »

Приветик всем. Кто сталкивался с реализацией самопрограммирования СТМ32 через CAN (не UART)? Есть ли первопроходцы?
:solder: 32-х ядерный процессор из П213В
Аватара пользователя
Myp3ik
Мучитель микросхем
Сообщения: 450
Зарегистрирован: Вс янв 09, 2011 23:05:37
Откуда: СССР

Re: CAN + STM32 помогите разобраться

Сообщение Myp3ik »

Ruslan-maniak, когда вы отправляете посылку по CAN, кто у Вас её принимает ? CAN не может передать посылку в никуда, это не UART. Если на шине никого нет, то устанавливается ошибка BUSOFF.
Иван Сусанин - первый полупроводник :solder:
Аватара пользователя
Myp3ik
Мучитель микросхем
Сообщения: 450
Зарегистрирован: Вс янв 09, 2011 23:05:37
Откуда: СССР

Re: CAN + STM32 помогите разобраться

Сообщение Myp3ik »

wellcom, там все предельно просто, какие у Вас трудности возникли ?
Иван Сусанин - первый полупроводник :solder:
Аватара пользователя
wellcom
Нашел транзистор. Понюхал.
Сообщения: 190
Зарегистрирован: Чт фев 24, 2011 13:00:49

Re: CAN + STM32 помогите разобраться

Сообщение wellcom »

Myp3ik писал(а):wellcom, там все предельно просто, какие у Вас трудности возникли ?
честно говоря пока что не знаю с чего начать....как и куда писать загрузчик, как его выгрузить в оперативку и передавать управление, в каком формате подготовить и передать пакет. Что произойдет, если бутлоадер заглючит или еще хуже затрет себя сам (или лучше прошивку шить сразу с булоадером, а если не дошьется?) Я пока не силен в СТМ :( Может смысл делать двойной бутлодер, если с 1 что то случилось и не прошилась прога, после рестарта запускать 2-й бутлодырь (запасной).
Может есть у кого какие идеи, примеры, наработки и готов поделится ими - буду благодарен, и уверен не только один я :)
:solder: 32-х ядерный процессор из П213В
Аватара пользователя
Myp3ik
Мучитель микросхем
Сообщения: 450
Зарегистрирован: Вс янв 09, 2011 23:05:37
Откуда: СССР

Re: CAN + STM32 помогите разобраться

Сообщение Myp3ik »

wellcom, загрузчик писать во флеш, например, первые несколько страниц памяти зарезервировать под загрузчик. В RAM его выгружать не надо, достаточно поместить туда только функции которые будут записывать во флеш программу.

Откуда собираетесь передавать данные в МК? У Вас есть USB-CAN адаптер или что-то в этом роде ?
Иван Сусанин - первый полупроводник :solder:
Аватара пользователя
wellcom
Нашел транзистор. Понюхал.
Сообщения: 190
Зарегистрирован: Чт фев 24, 2011 13:00:49

Re: CAN + STM32 помогите разобраться

Сообщение wellcom »

Myp3ik писал(а):wellcom, загрузчик писать во флеш, например, первые несколько страниц памяти зарезервировать под загрузчик. В RAM его выгружать не надо, достаточно поместить туда только функции которые будут записывать во флеш программу.

Откуда собираетесь передавать данные в МК? У Вас есть USB-CAN адаптер или что-то в этом роде ?

Замысел такой: прошивка из ПК->LAN->STM32(или прошивка с SD)->CAN->STM32(прошиваемый(-е) контроллер(-ы) N шт)
Я так понимаю, при рестарте мк с начала грузится самозагрузчик, с соотв. настройкой CAN перифери и ждать некое время команды с адресом на шине CAN данного мк и далее ждать пакета прошивки, спустя некое время, если нет пакета/команды переходить на основную программу. С основной проги, по необходимости перепрыгивать на загрузчик по команде.
Прошивку передавать с CRC, и если пакет неверный делать перезапрос его, при этом вести счетчик пакетов.
Может кто подправит/добавит?

Что Вы имели ввиду - "достаточно поместить туда только функции которые будут записывать во флеш программу", по сути ведь это и есть загрузчик, загружаемый в ОЗУ...или я чего то не допонял?
:solder: 32-х ядерный процессор из П213В
Ответить

Вернуться в «ARM»