Перейти к содержанию
    

stm32f107vct непонятки с CAN

Сабж в заголовке .

пробую запустить сразу два CAN

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

 

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

 

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

 

че делать? после просмотра подиаганаоли даташита терзают смутные сомнения что 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) ;

программа не циклится :(

 

чек делать кроме чтения даташита который уже читаю?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

так я и не смог разобратся в чем дело. второй CAN у меня не работает.

 

остался один вариант...

 

есть например такая плата MCBSTM32C или STM3210C-EVAL

на них как раз stm32f107vct запаяна, у которой два CAN выведены наружу, и как я понимаю, должны работать независимо. Но почему то демо-кода недают ни Keil ни ST. вероятно он на дисках в комплекте.

просба счастливых обладателей этих демобордов поделится кодом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Зачем вам эти либы от ST? Ведь видно, что ламерами писалось.

 

Советую обратить внимание на биты 13:8 CAN2SB[5:0]: CAN2 start bank в регистре CAN_FMR.

Оба CAN-а в STM32 делят общую память с банками фильтров.

Назначив фильтр одному CAN-у надо убедиться что вы не отобрали фильтр у другого CAN-а

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

просба счастливых обладателей этих демобордов поделится кодом.

Ну я "счастливый":-) Только нет там кода. Практически нет. Все демки в бинарном виде... Я поэтому до сих пор безуспешно ищу пример работы с USB-хостом:)

 

Всё, что было в комплекте, качается вот отсюда:

http://www.st.com/mcu/familiesdocs-110.html

 

STM3210C-EVAL demonstration firmware: zip, pdf.

 

ЗЫ. Это всё про STM3210C-EVAL, насчёт кейла не знаю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2_AHTOXA

мдя... очень интересный подход - продать демоплату и бинарники к ней без исходников. я думал так умеют моск выносить только в нашей стране. еще один гвоздь в крышку гроба stm32!

 

2_AlexandrY

спасибо за наводку. но это мало мне щас поможет, нада брать и тупо даташит курить, потом. щас уже поезд уехал. :(

какие еще различие могут быть?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ббббб. А я уже заложил f105 для использования двух CAN-ов. :unsure:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ббббб. А я уже заложил f105 для использования двух CAN-ов. :unsure:

уверен что "стою на асфальте я в лыжы обутый", некогда было серьезно CAN изучать - я его в первый раз вообще пробую. хотелось с кандачка с использованием фирменной библы быстро получить результат. наверняка есть зЮбры которые запустили на 105 107 два CAN только чето они молчат :1111493779:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы как будто не в Keil-е работаете. Пару минут в симуляторе на рабочем участке вашего кода открыть вкладку фильтов CAN-а и посмотреть откуда начитаются фильтры CAN2 и есть ли там хоть один нормальный активированный фильтр.

 

Хотя и так видно что вы создаете один фильтр, а надо делать два.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

в 105 два CAN-а отлично работают..

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

в 105 два CAN-а отлично работают..

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

 

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

я выше то и говорил - гдето я туплю или в библиотеке ошибка и я ее немогу найти. Скорее всего глупость гдето моя.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а не поделитесь куском кода где делается чтоб они оба работали? разницы между 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

с параметром ноль , хотя это нелогично

С уважением Илья.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

я не могу поделиться куском ибо сейчас не на работе , а Вам как я понял нужно срочно , однако могу показать где у Вас "глюка закралася".

Уважаемый 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.

 

дело было не бобине.... а в фильтрах :)

все работает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добрый всем вечер!

 

Я пробую запустить CAN на STM32-discovery (заменил камень только на 105й)

 

Собрал пакет из библиотеки STM32F10x_stdPeriph_Lib ( там есть примеры с 2мя канами и с одним LoopBack)

 

В обоих случаях в дебагере я не вижу прерывания по приему(просто оно не компилируется)

 

Не могу понять почему...

 

Пробовал в 100% рабочий проект из боарда воткнуть библиотеку, тоже компилируется, дисплей, светодиоды, кнопки - все работает

а CAN передавать - передает, а на приеме нет прерывания ...

куда копать?

(проект я могу весь выложить или частями)

P.S Iar ARM 6.20

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добрый всем вечер!

 

Я пробую запустить CAN на STM32-discovery (заменил камень только на 105й)

 

Собрал пакет из библиотеки STM32F10x_stdPeriph_Lib ( там есть примеры с 2мя канами и с одним LoopBack)

 

В обоих случаях в дебагере я не вижу прерывания по приему(просто оно не компилируется)

 

Не могу понять почему...

 

Пробовал в 100% рабочий проект из боарда воткнуть библиотеку, тоже компилируется, дисплей, светодиоды, кнопки - все работает

а CAN передавать - передает, а на приеме нет прерывания ...

куда копать?

(проект я могу весь выложить или частями)

P.S Iar ARM 6.20

================== РЕШЕНО!!!======================

 

В разделе EWARMv5 содержался файл startup_STM32F10x_MD_VL.s, заменил его на коннект лайн для 32F105 startup_STM32F10x_CL.s и все ОК!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

дело было не бобине.... а в фильтрах :)

все работает.

 

вот обозначат тему, попросят помочь... кто-то время уделит, подскажет, поможет... вопрос разрешиться...А решение рассказать другим?!

Дык нет ведь - надо написать что "всё работает" и всё. Эгоистично как-то (((

Придется дальше время поубивать на поиски решения.

AlexandrY и cebotor - спасибо за подсказку

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...