Как настроить STM32103 для CAN и переназначить контакты на PB8 и PB9

На данном этапе я пытаюсь просто отправить передачу по CAN на STM32F103 V8T6. Чип реализован на плате, которая была настроена моей компанией. Глядя на схему, я вижу, что контакты CAN Tx и Rx были переназначены на PB9 (Tx) и PB8 (Rx). При всем при этом я смог успешно использовать режим LoopBack (используя последний пример из STM «V3.5.0»), но НЕ смог заставить работать нормальный режим. Может кто-нибудь, пожалуйста, дайте мне знать, если они увидят очевидный недостаток в моей первоначальной конфигурации?! Я включил только код, связанный с конфигурацией, и не включил вызов функции передачи.

int main (void)
{

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);



NVIC_InitTypeDef NVIC_InitStructure;

NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;

NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);



 GPIO_InitTypeDef GPIO_InitStructure;


/* Configure CAN pin: RX */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;

GPIO_Init(GPIOB, &GPIO_InitStructure);


/* Configure CAN pin: TX */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_Init(GPIOB, &GPIO_InitStructure);


// Remap2 is for PB8 and PB9

GPIO_PinRemapConfig(GPIO_Remap2_CAN1 , ENABLE);


}

Вот моя функция передачи

void CAN_TransmitMyMsg(void)
{
  CAN_InitTypeDef        CAN_InitStructure;
  CAN_FilterInitTypeDef  CAN_FilterInitStructure;
  CanTxMsg TxMessage;
  uint32_t i = 0;
  uint8_t TransmitMailbox = 0;
  uint8_t status = 0;

  /* CAN register init */
  CAN_DeInit(CANx);
  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;

  /* Baudrate = 125kbps*/
  CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;
  CAN_InitStructure.CAN_BS1=CAN_BS1_2tq;
  CAN_InitStructure.CAN_BS2=CAN_BS2_3tq;
  CAN_InitStructure.CAN_Prescaler=48;
  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);

  /* transmit */
  TxMessage.StdId=0x11;
  TxMessage.RTR=CAN_RTR_DATA;
  TxMessage.IDE=CAN_ID_STD;
  TxMessage.DLC=2;
  TxMessage.Data[0]=0xCA;
  TxMessage.Data[1]=0xFE;

  TransmitMailbox=CAN_Transmit(CANx, &TxMessage);

  //wait until CAN transmission is OK
  i = 0;
  while((status != CANTXOK) && (i != 0xFFFF))               
  {
    status = CAN_TransmitStatus(CANx, TransmitMailbox);
    i++;
  }

}

Этот ресурс был полезен, но в конечном итоге недостаточен.

Сообщения CAN микроконтроллера STM32F103

Спасибо!

Даниэль


person Daniel    schedule 22.11.2012    source источник
comment
Ну, во-первых, работает ли настоящая шина (кабели, терминаторы и т. д.)? Передается ли что-либо на самом деле (объем памяти, анализатор CAN и т. д.)? О каких ошибках сообщается, если таковые имеются, как в каналах tx, так и в каналах rx? Вы ожидаете, что мы будем отлаживать оборудование в блоге?   -  person Martin James    schedule 23.11.2012
comment
Я должен заявить для протокола, что я очень новичок в CAN. Выходные контакты платы подключены к самодельной плате, которая подключается в соответствии с рекомендациями (120 Ом на концах). К нему подключены NI USB-8472, настроенные только на прослушивание, которые должны обнаруживать и отображать передачи (используя MAX). Действительно, может возникнуть аппаратная проблема, но я не могу знать на данный момент, поэтому я гарантирую, что, по крайней мере, программное обеспечение исправно.   -  person Daniel    schedule 23.11.2012


Ответы (4)


У меня были похожие проблемы. Моя проблема заключалась в неправильном выборе параметров связи (кванты времени и прескалер)

Я отлаживаю его таким образом:

  • Я проверил, что пин RSS трансивера CAN (я использовал MCP 2551 I/P)
  • Я переключил его на петлю и с помощью осциллографа проверил выходной сигнал на канале TX и на CANH на CANL (если выход настроен правильно)
  • Я посмотрел конфигурацию RCC - прескалер часов APB1 был изменен на 2 (я исключил 4)
person Vojta    schedule 11.12.2012

Для успешной передачи контроллер CAN ожидает бит подтверждения, который является частью протокола CAN. Если ваш монитор CAN (от NI) находится в режиме прослушивания, не будет бита подтверждения (!), и, таким образом, вы не получите индикацию успешной передачи на передающей стороне.

person Wolf    schedule 18.02.2014

GPIO_Remap2_CAN1 переназначает периферийное устройство CAN1 на PD0 и PD1, а не на PB8 и PB9. Вы хотите GPIO_Remap1_CAN1.

person user2172477    schedule 15.03.2013

Периферийная библиотека STD устарела, но так как я не смог найти лучших примеров, я использовал ваш нерабочий код в качестве основы.
Изначально у меня было такое же поведение, что оно работало только в петле. После удаления переназначения контактов PB8 и PB9 и установки высокоскоростного GPIO для контакта TX все заработало. Вот мои настройки GPIO для PA11 и PA12

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
/* Configure CAN pin: RX */
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);

/* Configure CAN pin: TX */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = **GPIO_Speed_50MHz**;
GPIO_Init(GPIOA, &GPIO_InitStructure);

Остальное я оставил так же. (Кроме замены CANx на CAN1).

person Radzor    schedule 04.08.2020