Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: stm32f107vct непонятки с CAN
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
klen
Сабж в заголовке .
пробую запустить сразу два 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

чек делать кроме чтения даташита который уже читаю?
klen
так я и не смог разобратся в чем дело. второй CAN у меня не работает.

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

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

Советую обратить внимание на биты 13:8 CAN2SB[5:0]: CAN2 start bank в регистре CAN_FMR.
Оба CAN-а в STM32 делят общую память с банками фильтров.
Назначив фильтр одному CAN-у надо убедиться что вы не отобрали фильтр у другого CAN-а
AHTOXA
Цитата(klen @ Feb 25 2010, 23:35) *
просба счастливых обладателей этих демобордов поделится кодом.

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

Всё, что было в комплекте, качается вот отсюда:
http://www.st.com/mcu/familiesdocs-110.html

STM3210C-EVAL demonstration firmware: zip, pdf.

ЗЫ. Это всё про STM3210C-EVAL, насчёт кейла не знаю.
klen
2_AHTOXA
мдя... очень интересный подход - продать демоплату и бинарники к ней без исходников. я думал так умеют моск выносить только в нашей стране. еще один гвоздь в крышку гроба stm32!

2_AlexandrY
спасибо за наводку. но это мало мне щас поможет, нада брать и тупо даташит курить, потом. щас уже поезд уехал. sad.gif
какие еще различие могут быть?
SasaVitebsk
Ббббб. А я уже заложил f105 для использования двух CAN-ов. unsure.gif
klen
Цитата(SasaVitebsk @ Feb 26 2010, 11:04) *
Ббббб. А я уже заложил f105 для использования двух CAN-ов. unsure.gif

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

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


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

про крышку гроба - ну очень нравится стиль документации у NXP и также сильно ненравится у ST. на мой взгляд подход NXP - дока отвечает почему именно так нада далать, а у ST -тупо делай так, вот тебе еще либа, тоже без описания и нелезь внутрь.
cebotor
Цитата(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
с параметром ноль , хотя это нелогично
С уважением Илья.
klen
Цитата(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
все работает.
Pavlike
Добрый всем вечер!

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

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

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

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

Пробовал в 100% рабочий проект из боарда воткнуть библиотеку, тоже компилируется, дисплей, светодиоды, кнопки - все работает
а CAN передавать - передает, а на приеме нет прерывания ...
куда копать?
(проект я могу весь выложить или частями)
P.S Iar ARM 6.20
Pavlike
Цитата(Pavlike @ Aug 5 2011, 14:39) *
Добрый всем вечер!

Я пробую запустить 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 и все ОК!
igler_u
Цитата(klen @ Mar 1 2010, 18:14) *
дело было не бобине.... а в фильтрах sm.gif
все работает.


вот обозначат тему, попросят помочь... кто-то время уделит, подскажет, поможет... вопрос разрешиться...А решение рассказать другим?!
Дык нет ведь - надо написать что "всё работает" и всё. Эгоистично как-то (((
Придется дальше время поубивать на поиски решения.
AlexandrY и cebotor - спасибо за подсказку
igler_u
Цитата(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.
AlexanderB
Цитата(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(((((((((

Вы можете привести листинг где вы сконфигурировали фильтры?
AlexanderB
Цитата(AlexanderB @ Jul 3 2013, 13:06) *
Таже проблемаsad.gif

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

Вы можете привести листинг где вы сконфигурировали фильтры?


Все заработало!!!!!!!!!!!! Всем спасибо. Был прецеплен startup_HD вместо нужного startup_CL
ROOS81
Привет всем! Камень STM32F407 Пытаюсь настроить прием по CAN . Порты PD0 и PD1 (can1 RX , can1 TX) светодиод PB9 (плата от ТЕРРАЭЛЕКТРОНИКИ TE-stm32fx07) передачу настроил, работает нормально а вот прием никак... Может кто подскажет где собака порылась smile3046.gif


CODE
#include "stm32f4xx.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_can.h"
#include "misc.h"
#include "system_stm32f4xx.h"

#define USE_CAN1
/* #define USE_CAN2 */

#ifdef USE_CAN1
#define CANx CAN1
#else /* USE_CAN1 */
#define CANx CAN1
#endif /* USE_CAN1*/

void NVIC_Config();
void Rxmsg ();

void main()
{
SystemInit();
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;

// Enable GPIO clock
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
// Configure CAN1 as alternate function
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_Init(GPIOD, &GPIO_InitStructure);



GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);

// Connect PXx to CAN 1 2

GPIO_PinAFConfig(GPIOD, GPIO_PinSource0, GPIO_AF_CAN1); //CAN_RX = PD0
GPIO_PinAFConfig(GPIOD, GPIO_PinSource1, GPIO_AF_CAN1); //CAN_TX = PD1


// init CAN1
RCC_APB1PeriphClockCmd (RCC_APB1Periph_CAN1, ENABLE);

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_Prescaler = 16;// 125kbs
CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;//LoopBack
CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
CAN_InitStructure.CAN_BS1 = CAN_BS1_14tq;
CAN_InitStructure.CAN_BS2 = CAN_BS2_6tq;

CAN_DeInit(CAN1);
CAN_Init(CAN1, &CAN_InitStructure);

// IT Configuration for CAN1 FIFO 0 message received interrupt
CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);
// IT Configuration for CAN1 FIFO 1 message received interrupt
CAN_ITConfig(CAN1, CAN_IT_FMP1, ENABLE);

/* CAN filter init */
#ifdef USE_CAN1
CAN_FilterInitStructure.CAN_FilterNumber = 0;
#else /* USE_CAN1 */
CAN_FilterInitStructure.CAN_FilterNumber = 0;
#endif /* USE_CAN1 */
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
CAN_FilterInitStructure.CAN_FilterIdHigh = 0xFFFF;
CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF;
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment =CAN_FIFO0;

CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);

uint8_t TransmitMailbox = 0;
CanTxMsg TxMessage;
CanRxMsg RxMessage;
uint32_t i = 0;


void NVIC_Config()
{
NVIC_InitTypeDef NVIC_InitStructure;

/* Enable CANx RX0 interrupt IRQ channel */
#ifdef USE_CAN1
NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn;
#else /* USE_CAN1 */
NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn;
#endif /* USE_CAN1 */

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



void Rxmsg()
{
RxMessage.StdId = 0x00;
RxMessage.ExtId = 0x00;
RxMessage.IDE = CAN_ID_STD;
RxMessage.DLC = 0;
RxMessage.FMI = 0;
for (i = 0; i < 8; i++)
{
RxMessage.Data[i] = 0;
}
CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);

}


while(1){
CSsendmsg (),Rxmsg();
if (RxMessage.Data[0]== 0x01) GPIOB->BSRRL = GPIO_Pin_9;
int time = 3000000;
while(time>1){time--;}
time = 3000000;
while(time>1){time--;}
GPIOB->BSRRH = GPIO_Pin_9;



}}
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.