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

 
 
> Посылка по CAN в STM32F3
Jenya7
сообщение Aug 17 2018, 09:56
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 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] - для короткого!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
редактор
сообщение Sep 17 2018, 12:47
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 356
Регистрация: 9-06-07
Пользователь №: 28 315



Цитата
я что то не нашел где там АСК отменить
wacko.gif
Почитайте спецификацию на CAN?хотя бы в русском переводе.


--------------------
Хорошую систему делают из стандартных блоков нестандартно мыслящие инженеры.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Sep 17 2018, 14:11
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(редактор @ Sep 17 2018, 17:47) *
wacko.gif
Почитайте спецификацию на CAN?хотя бы в русском переводе.


я могу читать отсюда и до Урала, там регистров с гулькин нос. все биты просмотрел.
Go to the top of the page
 
+Quote Post
adnega
сообщение Sep 17 2018, 18:48
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(Jenya7 @ Sep 17 2018, 17:11) *
там регистров с гулькин нос. все биты просмотрел.

Может, это
Цитата
Silent mode
The bxCAN can be put in Silent mode by setting the SILM bit in the CAN_BTR register.
In Silent mode, the bxCAN is able to receive valid data frames and valid remote frames, but
it sends only recessive bits on the CAN bus and it cannot start a transmission. If the bxCAN
has to send a dominant bit (ACK bit, overload flag, active error flag), the bit is rerouted
internally so that the CAN Core monitors this dominant bit, although the CAN bus may
remain in recessive state. Silent mode can be used to analyze the traffic on a CAN bus
without affecting it by the transmission of dominant bits (Acknowledge Bits, Error Frames).
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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
|- - Jenya7   Цитата(adnega @ Sep 18 2018, 00:48) Может...   Sep 18 2018, 04:49
- - Jenya7   фигня какая то с этим КАНом. Прием на мастере и сл...   Sep 21 2018, 07:21
- - esaulenka   Не, я понимаю, что читать спецификации не модно, е...   Sep 21 2018, 13:04
|- - Jenya7   Цитата(esaulenka @ Sep 21 2018, 18:04) Не...   Sep 21 2018, 13:49
|- - Alechek   Цитата(Jenya7 @ Sep 21 2018, 18:49) а так...   Sep 21 2018, 14:17
|- - Jenya7   Цитата(Alechek @ Sep 21 2018, 19:17) По-ч...   Sep 21 2018, 14:26
- - Jenya7   ОК. вроде заработало. настраиваю маску на слейве ...   Sep 28 2018, 07:53


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

 


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


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