|
Посылка по CAN в STM32F3 |
|
|
|
Aug 17 2018, 09:56
|
Профессионал
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075
|
Настраиваю CAN CODE void CAN_Setup(void) { GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; CAN_InitTypeDef CAN_InitStructure; CAN_FilterInitTypeDef CAN_FilterInitStructure; /* CAN GPIOs configuration **************************************************/
/* Enable GPIO clock */ RCC->AHBENR |= RCC_AHBPeriph_GPIOB;
/* Connect CAN pins to AF9 */ GPIO_PinAFConfig(GPIOB, GPIO_PinSource8, GPIO_AF_9); GPIO_PinAFConfig(GPIOB, GPIO_PinSource9, GPIO_AF_9); /* Configure CAN RX and TX pins */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8| GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(CAN_GPIO_PORT, &GPIO_InitStructure);
/* NVIC configuration *******************************************************/ NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /* CAN configuration ********************************************************/ /* Enable CAN clock */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE); /* CAN register init */ CAN_DeInit(CAN1); CAN_StructInit(&CAN_InitStructure);
// CAN cell init 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 Baudrate = 1MBps (CAN clocked at 36 MHz) */ CAN_InitStructure.CAN_BS1 = CAN_BS1_9tq; CAN_InitStructure.CAN_BS2 = CAN_BS2_8tq; CAN_InitStructure.CAN_Prescaler = 2; 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 = 39; //CAN_InitStructure.CAN_SJW = 2; CAN_Init(CANx, &CAN_InitStructure);
/* CAN filter init */ 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); /* Enable FIFO 0 message pending Interrupt */ CAN_ITConfig(CANx, CAN_IT_FMP0, ENABLE); /* Enable FIFO 1 message pending Interrupt */ CAN_ITConfig(CANx, CAN_IT_FMP1, ENABLE); } Посылаю Код TxMessage.StdId = ( (0x100 *(i+1)) + CAN_COM_WHO_IS); TxMessage.DLC = 1; TxMessage.RTR = CAN_RTR_DATA; TxMessage.IDE = CAN_ID_STD; CAN_Transmit(CAN1, &TxMessage); В функции посылки - все мейлбоксы заняты - я попадаю в transmit_mailbox = CAN_TxStatus_NoMailBox; CODE uint8_t CAN_Transmit(CAN_TypeDef* CANx, CanTxMsg* TxMessage) { uint8_t transmit_mailbox = 0; /* Check the parameters */ assert_param(IS_CAN_ALL_PERIPH(CANx)); assert_param(IS_CAN_IDTYPE(TxMessage->IDE)); assert_param(IS_CAN_RTR(TxMessage->RTR)); assert_param(IS_CAN_DLC(TxMessage->DLC));
/* Select one empty transmit mailbox */ if ((CANx->TSR&CAN_TSR_TME0) == CAN_TSR_TME0) { transmit_mailbox = 0; } else if ((CANx->TSR&CAN_TSR_TME1) == CAN_TSR_TME1) { transmit_mailbox = 1; } else if ((CANx->TSR&CAN_TSR_TME2) == CAN_TSR_TME2) { transmit_mailbox = 2; } else { transmit_mailbox = CAN_TxStatus_NoMailBox; }
if (transmit_mailbox != CAN_TxStatus_NoMailBox) { /* Set up the Id */ CANx->sTxMailBox[transmit_mailbox].TIR &= TMIDxR_TXRQ; if (TxMessage->IDE == CAN_Id_Standard) { assert_param(IS_CAN_STDID(TxMessage->StdId)); CANx->sTxMailBox[transmit_mailbox].TIR |= ((TxMessage->StdId << 21) | \ TxMessage->RTR); } else { assert_param(IS_CAN_EXTID(TxMessage->ExtId)); CANx->sTxMailBox[transmit_mailbox].TIR |= ((TxMessage->ExtId << 3) | \ TxMessage->IDE | \ TxMessage->RTR); } /* Set up the DLC */ TxMessage->DLC &= (uint8_t)0x0000000F; CANx->sTxMailBox[transmit_mailbox].TDTR &= (uint32_t)0xFFFFFFF0; CANx->sTxMailBox[transmit_mailbox].TDTR |= TxMessage->DLC;
/* Set up the data field */ CANx->sTxMailBox[transmit_mailbox].TDLR = (((uint32_t)TxMessage->Data[3] << 24) | ((uint32_t)TxMessage->Data[2] << 16) | ((uint32_t)TxMessage->Data[1] << 8) | ((uint32_t)TxMessage->Data[0])); CANx->sTxMailBox[transmit_mailbox].TDHR = (((uint32_t)TxMessage->Data[7] << 24) | ((uint32_t)TxMessage->Data[6] << 16) | ((uint32_t)TxMessage->Data[5] << 8) | ((uint32_t)TxMessage->Data[4])); /* Request transmission */ CANx->sTxMailBox[transmit_mailbox].TIR |= TMIDxR_TXRQ; } return transmit_mailbox; } Если принимающая сторона не приняла мейлбокс он не освободился ?
Сообщение отредактировал IgorKossak - Aug 19 2018, 20:06
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!
|
|
|
|
|
|
Ответов
|
Sep 21 2018, 13:49
|
Профессионал
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075
|
Цитата(esaulenka @ Sep 21 2018, 18:04) Не, я понимаю, что читать спецификации не модно, если можно фигачить код и писать вопросы в интернетах...
Но, всё-таки 1) чем вы руководствовались при запуске непрерывной передачи без малейших пауз? 2) слышали ли вы что-то о ACK'ах в кан-шине? И если да, то задумывались ли, кто же будет их выдавать? вобще то на вехнем уровне я жду ответа от слейва. а кроме того USB-CAN Plus молотит тоже без перерыва однако с ним все нормально. насчет ACK'а я не понял из документации. это же происходит на автоматическом уровне. и вообще можно без туманностей и напыщенности? а так по нашему по бразильски по человечески. я помню был проект. правда на TI Delfino. но там пять узлов молотили каждый как бог на душу положит без согласований и арбитражей. и ничего. все получали свои пакеты и я не помню чтоб КАН когда то отсох.
Сообщение отредактировал Jenya7 - Sep 21 2018, 14:12
|
|
|
|
|
Sep 21 2018, 14:17
|
Профессионал
Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882
|
Цитата(Jenya7 @ Sep 21 2018, 18:49) а так по нашему по бразильски по человечески. По-человечески - возьмите осциллограф или хотя бы лог. анализатор типа клон Saleae Logic. Возмущений много, а схемы подключения - 0. Где анализ целостности сигналов? То что принял один - не значит, что примет другой! ФИЗИЧЕСКИ что на линии? -- UPD: Так еще и линия 1 Мбит! Откуда тактирование? Кварц или RC? Скорость пробовали уменьшать? с BTR регистром пробовали играться?
|
|
|
|
|
Sep 21 2018, 14:26
|
Профессионал
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075
|
Цитата(Alechek @ Sep 21 2018, 19:17) По-человечески - возьмите осциллограф или хотя бы лог. анализатор типа клон Saleae Logic. Возмущений много, а схемы подключения - 0. Где анализ целостности сигналов?
То что принял один - не значит, что примет другой!
ФИЗИЧЕСКИ что на линии? осциллограф показывает обычные пакеты. когда есть ошибки USB-CAN Plus сигнализирует. ну я вообще то вижу правильные данные при принятии. а что 1 Мбит это большая нагрузка на линию? тактирование внешний кварц. а BTR с ST примеров. они точно лучше меня знают как его выставлять.
Сообщение отредактировал Jenya7 - Sep 21 2018, 14:40
Эскизы прикрепленных изображений
|
|
|
|
Сообщений в этой теме
Jenya7 Посылка по CAN в STM32F3 Aug 17 2018, 09:56 Obam Коллега, вы хрензнает сколько лет на форуме, листи... Aug 17 2018, 15:47 esaulenka Цитата(Obam @ Aug 17 2018, 18:47) листинг... Aug 17 2018, 16:02 x893 Цитата(Jenya7 @ Aug 17 2018, 12:56) Настр... Aug 17 2018, 18:20 Jenya7 для отладки я изменил случай когда все мейлбоксы з... Aug 19 2018, 07:31 Jenya7 CAN по прежнему не работает.Вопрос - нужно ли чист... Sep 13 2018, 13:02 Jenya7 CAN заработал. надо было перемычку замкнуть на пин... Sep 17 2018, 04:59 Alechek Цитата(Jenya7 @ Sep 17 2018, 09:59) Друга... Sep 17 2018, 05:27 Jenya7 Цитата(Alechek @ Sep 17 2018, 10:27) Ниче... Sep 17 2018, 06:04 Alechek Цитата(Jenya7 @ Sep 17 2018, 11:04)
CAN ... Sep 17 2018, 10:11 Jenya7 Цитата(Alechek @ Sep 17 2018, 15:11) CAN ... Sep 17 2018, 10:35 редактор Цитатая что то не нашел где там АСК отменить
По... Sep 17 2018, 12:47 Jenya7 Цитата(редактор @ Sep 17 2018, 17:47)
П... Sep 17 2018, 14:11 adnega Цитата(Jenya7 @ Sep 17 2018, 17:11) там р... Sep 17 2018, 18:48 Jenya7 Цитата(adnega @ Sep 18 2018, 00:48) Может... Sep 18 2018, 04:49 Jenya7 фигня какая то с этим КАНом.
Прием на мастере и сл... Sep 21 2018, 07:21 Jenya7 ОК. вроде заработало.
настраиваю маску на слейве
... Sep 28 2018, 07:53
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|