|
stm32f107vct непонятки с CAN, в loopback CAN1 работает а CAN2 нет |
|
|
|
Feb 5 2010, 23:43
|

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

|
Сабж в заголовке . пробую запустить сразу два 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) ; программа не циклится  чек делать кроме чтения даташита который уже читаю?
|
|
|
|
|
Feb 25 2010, 20:40
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(klen @ Feb 25 2010, 23:35)  просба счастливых обладателей этих демобордов поделится кодом. Ну я "счастливый":-) Только нет там кода. Практически нет. Все демки в бинарном виде... Я поэтому до сих пор безуспешно ищу пример работы с USB-хостом  Всё, что было в комплекте, качается вот отсюда: http://www.st.com/mcu/familiesdocs-110.htmlSTM3210C-EVAL demonstration firmware: zip, pdf. ЗЫ. Это всё про STM3210C-EVAL, насчёт кейла не знаю.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Mar 1 2010, 12:21
|

Частый гость
 
Группа: Свой
Сообщений: 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 с параметром ноль , хотя это нелогично С уважением Илья.
--------------------
если еррата пуста - это не хорошо а плохо
|
|
|
|
|
Aug 5 2011, 15:39
|
Группа: Участник
Сообщений: 11
Регистрация: 16-05-08
Пользователь №: 37 560

|
Добрый всем вечер!
Я пробую запустить CAN на STM32-discovery (заменил камень только на 105й)
Собрал пакет из библиотеки STM32F10x_stdPeriph_Lib ( там есть примеры с 2мя канами и с одним LoopBack)
В обоих случаях в дебагере я не вижу прерывания по приему(просто оно не компилируется)
Не могу понять почему...
Пробовал в 100% рабочий проект из боарда воткнуть библиотеку, тоже компилируется, дисплей, светодиоды, кнопки - все работает а CAN передавать - передает, а на приеме нет прерывания ... куда копать? (проект я могу весь выложить или частями) P.S Iar ARM 6.20
|
|
|
|
|
Aug 6 2011, 09:45
|
Группа: Участник
Сообщений: 11
Регистрация: 16-05-08
Пользователь №: 37 560

|
Цитата(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 и все ОК!
|
|
|
|
|
Feb 1 2013, 09:27
|
Группа: Новичок
Сообщений: 3
Регистрация: 24-07-12
Пользователь №: 72 885

|
Цитата(klen @ Mar 1 2010, 18:14)  дело было не бобине.... а в фильтрах  все работает. вот обозначат тему, попросят помочь... кто-то время уделит, подскажет, поможет... вопрос разрешиться...А решение рассказать другим?! Дык нет ведь - надо написать что "всё работает" и всё. Эгоистично как-то ((( Придется дальше время поубивать на поиски решения. AlexandrY и cebotor - спасибо за подсказку
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|