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

 
 
> Помогите разобраться с CANом в stm32
batisto4ka
сообщение May 7 2012, 08:13
Сообщение #1


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

Группа: Участник
Сообщений: 89
Регистрация: 3-01-11
Пользователь №: 61 997



Помогите, опжалуйста, разобраться с CANом для stm32.

Постановка задачи следующая. Есть отладочная плата sk-mstm32f107 и самодельная плата на основе stm32f103vet. Роль первой платы - мастер, второй- слэйв. Пробую на основе исходников библиотеки StdPeriphLib написать программку, которая просто передаст хоть что-то на вторую платку. Не получается.
Согласно документации на отладочную плату на stm32f107:
CAN_TX1=GPIOD_1;
CAN_RX1=GPIOD_0;
Плата слэйва на stm32f103vet:
CAN_TX=GPIOA_12;
CAN_RX=GPIOA_11;
Прилагаю файлы 2 проектов с настройками CANов. Подскажите, что я не так делаю и почему не срабатывает прерывание у слэйва по получению данных.
P.S.(edited)
Внесла исправления. Добавила в функцию Init_GPIO_CAN проекта для мастера stm32f107 ремап:
Код
GPIO_PinRemapConfig(GPIO_Remap2_CAN1, ENABLE);

Но все равно прерывания по получению не срабатывают.

Сообщение отредактировал batisto4ka - May 7 2012, 10:30
Прикрепленные файлы
Прикрепленный файл  CAN_Testing.rar ( 49.4 килобайт ) Кол-во скачиваний: 65
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
aba
сообщение May 7 2012, 11:56
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 22
Регистрация: 12-08-11
Пользователь №: 66 698



это моя инициализация CANа, правда для STM32F2xx

CODE
// enable clock to CANs
RCC->APB1ENR |= RCC_APB1ENR_CAN1EN;
RCC->APB1ENR |= RCC_APB1ENR_CAN2EN;

CAN1->MCR |= CAN_MCR_RESET;
CAN2->MCR |= CAN_MCR_RESET;

// configure CANs
CANEnterConfig();

CAN1->MCR |= CAN_MCR_NART;//CAN_MCR_TXFP;
CAN2->MCR |= CAN_MCR_NART;//CAN_MCR_TXFP;

switch (baud_rate) {
case CAN_BR_50KBPS:
BrpVal = (FPBA1 / (TS1VAL + 1 + TS2VAL + 1 + 1)) / 50000UL;
break;
case CAN_BR_125KBPS:
BrpVal = (FPBA1 / (TS1VAL + 1 + TS2VAL + 1 + 1)) / 125000UL;
break;
case CAN_BR_250KBPS:
BrpVal = (FPBA1 / (TS1VAL + 1 + TS2VAL + 1 + 1)) / 250000UL;
break;
case CAN_BR_500KBPS:
BrpVal = (FPBA1 / (TS1VAL + 1 + TS2VAL + 1 + 1)) / 500000UL;
break;
case CAN_BR_1000KBPS:
BrpVal = (FPBA1 / (TS1VAL + 1 + TS2VAL + 1 + 1)) / 1000000UL;
break;
default:
break;
}

CAN1->BTR = (SJWVAL << 24) | (TS2VAL << 20) | (TS1VAL << 16) | (BrpVal - 1);
CAN2->BTR = (SJWVAL << 24) | (TS2VAL << 20) | (TS1VAL << 16) | (BrpVal - 1);

CAN1->IER = CAN_IER_FMPIE0;
CAN2->IER = CAN_IER_FMPIE0;

CAN1->MCR &= ~CAN_MCR_SLEEP;
CAN2->MCR &= ~CAN_MCR_SLEEP;

CANExitConfig();

static void CANExitConfig(void) {
CAN1->MCR &= ~CAN_MCR_INRQ;
// wait while CAN entered to initialization mode
while (CAN1->MSR & CAN_MSR_INAK)
;
CAN2->MCR &= ~CAN_MCR_INRQ;
// wait while CAN entered to initialization mode
while (CAN2->MSR & CAN_MSR_INAK)
;
}

static void CANEnterConfig(void) {
// CAN to initialization mode
CAN1->MCR |= CAN_MCR_INRQ;

// wait while CAN entered to initialization mode
while (!(CAN1->MSR & CAN_MSR_INAK))
;
// CAN to initialization mode
CAN2->MCR |= CAN_MCR_INRQ;
// wait while CAN entered to initialization mode
while (!(CAN2->MSR & CAN_MSR_INAK))
;
}


вот так инициализирую фильтры
Код
// begin of configuring filters
    CANEnterConfig();

    CAN1->FMR |= CAN_FMR_FINIT; // set Initialization mode for filter banks
    CAN1->FMR &= ~(0x3F << 8);
    CAN1->FMR |= (0x0E << 8);
    CAN1->FA1R &= ~(uint32_t) (1 << filterIndex); // deactivate filter

    // initialize filter
    CAN1->FS1R |= (uint32_t) (1 << filterIndex);// set 32-bit scale configuration
    CAN1->FM1R &= ~(uint32_t) (1 << filterIndex);// set 2 32-bit identifier list mode

    CAN1->sFilterRegister[filterIndex].FR1 = CAN_msgId; //  32-bit identifier
    CAN1->sFilterRegister[filterIndex].FR2 = CAN_msgMask; //  32-bit identifier
    CAN1->FFA1R &= ~(uint32_t) (1 << filterIndex); // assign filter to FIFO 0
    CAN1->FA1R |= (uint32_t) (1 << filterIndex); // activate filter
    CAN1->FMR &= ~CAN_FMR_FINIT; // reset Initialization mode for filter banks

    CANExitConfig();


прерывания, впринципе, написаны как и у Вас

Сообщение отредактировал IgorKossak - May 7 2012, 17:37
Причина редактирования: [codebox] для длинного кода
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- batisto4ka   Помогите разобраться с CANом в stm32   May 7 2012, 08:13
- - aba   Стандартной библиотекой не пользовался, сказать пр...   May 7 2012, 09:47
|- - batisto4ka   Цитата(aba @ May 7 2012, 13:47) Стандартн...   May 7 2012, 11:06
- - lead_seller   1. Неплохо было бы увидеть принципиальные схемы об...   May 7 2012, 11:55
|- - batisto4ka   Вопрос решен. Связь между платами утановлена. Проб...   May 7 2012, 12:44
|- - batisto4ka   Банальная невнимательность void USB_LP_CAN1_RX0_IR...   May 10 2012, 06:08
|- - batisto4ka   Подскажите, пожалуйста кто знает по фильтрам в CAN...   May 10 2012, 12:35
|- - vptr   Цитата(batisto4ka @ May 10 2012, 15:35) П...   May 11 2012, 09:18
|- - Danis   Здравствуйте, коллеги! На STM32F2 возникли за...   May 19 2012, 20:01
|- - PoReX   Да, кстати, если используется CAN2, то эти дефайны...   May 28 2012, 07:08
|- - Danis   Цитата(PoReX @ May 28 2012, 10:08) Да, кс...   May 28 2012, 07:51
|- - PoReX   Цитата(Danis @ May 28 2012, 11:51) Пример...   May 28 2012, 08:09
- - lead_seller   CODE void CAN_Initialization (uint16_t speed) { ...   May 7 2012, 12:16
- - PoReX   Цитата(Danis @ May 20 2012, 00:01) Соедин...   May 28 2012, 05:38
- - Danis   Цитата(PoReX @ May 28 2012, 08:38) Для на...   May 28 2012, 06:21


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

 


RSS Текстовая версия Сейчас: 31st July 2025 - 20:54
Рейтинг@Mail.ru


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