реклама на сайте
подробности

 
 
> stm32f107vct непонятки с CAN, в loopback CAN1 работает а CAN2 нет
klen
сообщение Feb 5 2010, 23:43
Сообщение #1


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



Сабж в заголовке .
пробую запустить сразу два CAN
сначала решил по одиночке запустить в режиме loopback - генерацию прерываний. написано по образу примера из фирменной библиотеки.

функции инициализации и отправки пакета идентичны , принимают параметр CAN1 или CAN2.

CAN2 не генерит прерываний и не принимает пакет. передачик говорит что все передано CAN_TransmitStatus(CANx, TransmitMailbox) возвращает CANTXOK. Приемник CAN2 тупо ниче нихочет делать sad.gif

че делать? после просмотра подиаганаоли даташита терзают смутные сомнения что CAN1 и CAN2 "две большие разницы" ....


вод код инициализации модулей, мутотень с GPIO вырезал

Код
void can_init(CAN_TypeDef* CANx)
  {
    // активация модуля CAN1
    //RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
    if (CANx==CAN1)
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1,ENABLE);
    else
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN2,ENABLE);


    NVIC_InitTypeDef  NVIC_InitStructure;
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

    // установка канала CANx_RX0_IRQn контроллера прервыаний NVIC
    if (CANx==CAN1)
        NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn;
    else
        NVIC_InitStructure.NVIC_IRQChannel = CAN2_RX0_IRQn;

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    // сброс регистров модуля CAN
    CAN_DeInit(CANx);

    CAN_InitTypeDef   CAN_InitStructure;
    CAN_StructInit(&CAN_InitStructure);
    // инициалищация модуля CAN
    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_Mode = CAN_Mode_LoopBack;
    CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
    CAN_InitStructure.CAN_BS1 = CAN_BS1_3tq;
    CAN_InitStructure.CAN_BS2 = CAN_BS2_5tq;
    CAN_InitStructure.CAN_Prescaler = 4;//2
    CAN_Init(CANx, &CAN_InitStructure);

    // инициализация фильтра CAN
    CAN_FilterInitTypeDef  CAN_FilterInitStructure;
    CAN_FilterInitStructure.CAN_FilterNumber=0;
    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);

    // разрешение прерыания по приему сообщения в FIFO #0 модуля CAN1
    CAN_ITConfig(CANx, CAN_IT_FMP0 , ENABLE);

  }
//---------------------------------------------------------------------------------------
uint32_t can_tx(CAN_TypeDef* CANx , uint8_t* data , uint32_t size)
{
   CanTxMsg TxMessage;
    uint8_t TransmitMailbox = 0;

    //подготовка пакета для передачи
    TxMessage.StdId = 0x321;
    TxMessage.ExtId = 0x01;
    TxMessage.RTR = CAN_RTR_DATA;
    TxMessage.IDE = CAN_ID_STD;
    TxMessage.DLC = 1;
    TxMessage.Data[0] = 0x55;

    // передача пакета
    TransmitMailbox=CAN_Transmit(CANx, &TxMessage);
    uint32_t i = 0xffff;  // таймер таймаута по завершении передачи
    while((CAN_TransmitStatus(CANx, TransmitMailbox) != CANTXOK) && i )
      {
        i--;
      }
     if ( !i ) return 0xFFFFFFFF;
     return size;
  }
//--------------------------------------------------------------------------
void CAN1_RX0_IRQHandler(void)
{
  while(1); // ловим прерывания под отладчиком
}
void CAN2_RX0_IRQHandler(void)
{
  while(1); // ловим прерывания под отладчиком
}



для теста вызываются
can_init(CAN1);
tmp = can_tx( CAN1 , NULL , 32) ;
программа зацикливается в обработчике прерывания CAN1_RX0_IRQHandler

can_init(CAN2);
tmp = can_tx( CAN2 , NULL , 32) ;
программа не циклится sad.gif

чек делать кроме чтения даташита который уже читаю?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
cebotor
сообщение Feb 28 2010, 13:04
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 135
Регистрация: 6-04-07
Из: Бронницы
Пользователь №: 26 809



в 105 два CAN-а отлично работают..
Какая крышка гроба , о чем Вы у филипса на кортексе с CAN - ом вобще голяк - линейка пуста.


--------------------
если еррата пуста - это не хорошо а плохо
Go to the top of the page
 
+Quote Post
klen
сообщение Feb 28 2010, 23:33
Сообщение #3


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



Цитата(cebotor @ Feb 28 2010, 16:04) *
в 105 два CAN-а отлично работают..
Какая крышка гроба , о чем Вы у филипса на кортексе с CAN - ом вобще голяк - линейка пуста.


а не поделитесь куском кода где делается чтоб они оба работали? разницы между 105 и 107 не должно быть.
я выше то и говорил - гдето я туплю или в библиотеке ошибка и я ее немогу найти. Скорее всего глупость гдето моя.

про крышку гроба - ну очень нравится стиль документации у NXP и также сильно ненравится у ST. на мой взгляд подход NXP - дока отвечает почему именно так нада далать, а у ST -тупо делай так, вот тебе еще либа, тоже без описания и нелезь внутрь.
Go to the top of the page
 
+Quote Post
cebotor
сообщение Mar 1 2010, 12:21
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 135
Регистрация: 6-04-07
Из: Бронницы
Пользователь №: 26 809



Цитата(klen @ Mar 1 2010, 02:33) *
а не поделитесь куском кода где делается чтоб они оба работали? разницы между 105 и 107 не должно быть.
я выше то и говорил - гдето я туплю или в библиотеке ошибка и я ее немогу найти. Скорее всего глупость гдето моя.

про крышку гроба - ну очень нравится стиль документации у NXP и также сильно ненравится у ST. на мой взгляд подход NXP - дока отвечает почему именно так нада далать, а у ST -тупо делай так, вот тебе еще либа, тоже без описания и нелезь внутрь.

я не могу поделиться куском ибо сейчас не на работе , а Вам как я понял нужно срочно , однако могу показать где у Вас "глюка закралася".
Уважаемый AlexandrY абсолютно верно вам показал на бит 13:8 CAN2SB[5:0]: CAN2 start bank в регистре CAN_FMR , в эти биты грузится номер стартового фильтра
для второго CAN-а после ресета там согластно доке - 1110b то бишь 14 , (по братски фильтры делят). а Вы инитите 0й фильтр, проинитьте 14й в случае второго CAN- а или используйте процедуру из либы
void CAN_SlaveStartBank(uint8_t CAN_BankNumber); // у меня версия либы V3.1.2
с параметром ноль , хотя это нелогично
С уважением Илья.


--------------------
если еррата пуста - это не хорошо а плохо
Go to the top of the page
 
+Quote Post
klen
сообщение Mar 1 2010, 13:14
Сообщение #5


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



Цитата(cebotor @ Mar 1 2010, 15:21) *
я не могу поделиться куском ибо сейчас не на работе , а Вам как я понял нужно срочно , однако могу показать где у Вас "глюка закралася".
Уважаемый AlexandrY абсолютно верно вам показал на бит 13:8 CAN2SB[5:0]: CAN2 start bank в регистре CAN_FMR , в эти биты грузится номер стартового фильтра
для второго CAN-а после ресета там согластно доке - 1110b то бишь 14 , (по братски фильтры делят). а Вы инитите 0й фильтр, проинитьте 14й в случае второго CAN- а или используйте процедуру из либы
void CAN_SlaveStartBank(uint8_t CAN_BankNumber); // у меня версия либы V3.1.2
с параметром ноль , хотя это нелогично
С уважением Илья.



огромное спасибо AlexandrY cebotor.

дело было не бобине.... а в фильтрах smile.gif
все работает.
Go to the top of the page
 
+Quote Post
igler_u
сообщение Feb 1 2013, 09:27
Сообщение #6





Группа: Новичок
Сообщений: 3
Регистрация: 24-07-12
Пользователь №: 72 885



Цитата(klen @ Mar 1 2010, 18:14) *
дело было не бобине.... а в фильтрах sm.gif
все работает.


вот обозначат тему, попросят помочь... кто-то время уделит, подскажет, поможет... вопрос разрешиться...А решение рассказать другим?!
Дык нет ведь - надо написать что "всё работает" и всё. Эгоистично как-то (((
Придется дальше время поубивать на поиски решения.
AlexandrY и cebotor - спасибо за подсказку
Go to the top of the page
 
+Quote Post
igler_u
сообщение Feb 3 2013, 09:06
Сообщение #7





Группа: Новичок
Сообщений: 3
Регистрация: 24-07-12
Пользователь №: 72 885



Цитата(igler_u @ Feb 1 2013, 14:27) *
Придется дальше время поубивать на поиски решения.

заработало и у меня
Изначальная проблема была - запустить CAN2 (на stm32f105rc/vc), который при настройках, аналогичных CAN1, работать отказывался...
При экспериментах выяснилось, что CAN2 работает только на отправку. Принять на него что-либо не получается, при этом передающая сторона докладывает, что всё отправлено, все OK.
Для решения проблемы необходимо произвести дополнительные настройки:
- первым делом при настройке второго CAN нужно затактировать CAN1!
- далее (как говорилось ранее/выше) нужно настроить фильтры под второй CAN: в структуре инициализации параметр CAN_FilterNumber для CAN2 должен иметь номер с 14 по 27.
альтернативно - использовать функцию CAN_SlaveStartBank(номер нужного фильтра), которая изменяет номер начального фильтр для CAN2.

Регистры фильтров у CAN1 и CAN2 общие, и настраиваются они в CAN1 (для этого он должен быть затактирован).
При этом в окне регистров CAN2 (в Keil) флаг FINIT - режим инициализации фильтров, в котором приём не активен! - будет находится в установленном состоянии (то есть что-то не то показыавется). Видимо, так как настройки фильтров общие, смотреть их для CAN2 нужно в настройках для CAN1.
Go to the top of the page
 
+Quote Post
AlexanderB
сообщение Jul 3 2013, 09:06
Сообщение #8





Группа: Новичок
Сообщений: 2
Регистрация: 3-07-13
Пользователь №: 77 367



Цитата(igler_u @ Feb 3 2013, 13:06) *
заработало и у меня
Изначальная проблема была - запустить CAN2 (на stm32f105rc/vc), который при настройках, аналогичных CAN1, работать отказывался...
При экспериментах выяснилось, что CAN2 работает только на отправку. Принять на него что-либо не получается, при этом передающая сторона докладывает, что всё отправлено, все OK.
Для решения проблемы необходимо произвести дополнительные настройки:
- первым делом при настройке второго CAN нужно затактировать CAN1!
- далее (как говорилось ранее/выше) нужно настроить фильтры под второй CAN: в структуре инициализации параметр CAN_FilterNumber для CAN2 должен иметь номер с 14 по 27.
альтернативно - использовать функцию CAN_SlaveStartBank(номер нужного фильтра), которая изменяет номер начального фильтр для CAN2.

Регистры фильтров у CAN1 и CAN2 общие, и настраиваются они в CAN1 (для этого он должен быть затактирован).
При этом в окне регистров CAN2 (в Keil) флаг FINIT - режим инициализации фильтров, в котором приём не активен! - будет находится в установленном состоянии (то есть что-то не то показыавется). Видимо, так как настройки фильтров общие, смотреть их для CAN2 нужно в настройках для CAN1.


Таже проблемаsad.gif

Не могу настроить оба CANа. Камень STM32F105RC. Из CAN1 данные отправляются и даже поступают на вход CAN2 (В регистре CAN_RF0R значнеие FMP0 становится 0х01), но если пытаюсь послать это же сообщение еще раз, то программа зависаетsad.gif(((((((((

Вы можете привести листинг где вы сконфигурировали фильтры?
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- klen   stm32f107vct непонятки с CAN   Feb 5 2010, 23:43
- - klen   так я и не смог разобратся в чем дело. второй CAN ...   Feb 25 2010, 18:35
|- - AlexandrY   Зачем вам эти либы от ST? Ведь видно, что ламерами...   Feb 25 2010, 19:12
|- - AHTOXA   Цитата(klen @ Feb 25 2010, 23:35) просба ...   Feb 25 2010, 20:40
|- - klen   2_AHTOXA мдя... очень интересный подход - продать...   Feb 25 2010, 20:59
- - SasaVitebsk   Ббббб. А я уже заложил f105 для использования двух...   Feb 26 2010, 08:04
|- - klen   Цитата(SasaVitebsk @ Feb 26 2010, 11:04) ...   Feb 26 2010, 08:49
|- - AlexandrY   Вы как будто не в Keil-е работаете. Пару минут в с...   Feb 26 2010, 20:18
|- - AlexanderB   Цитата(AlexanderB @ Jul 3 2013, 13:06) Та...   Jul 3 2013, 10:24
- - Pavlike   Добрый всем вечер! Я пробую запустить CAN на ...   Aug 5 2011, 15:39
|- - Pavlike   Цитата(Pavlike @ Aug 5 2011, 14:39) Добры...   Aug 6 2011, 09:45
- - ROOS81   Привет всем! Камень STM32F407 Пытаюсь настроит...   Jul 12 2013, 06:58


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd August 2025 - 09:00
Рейтинг@Mail.ru


Страница сгенерированна за 0.01449 секунд с 7
ELECTRONIX ©2004-2016