[技术讨论] GD32F103C8T6 CAN配置和发送问题

[复制链接]
1442|0
 楼主| noodleboy 发表于 2021-5-20 20:44 | 显示全部楼层 |阅读模式
如题,工程是从GD32103C-EVAL开发板的CAN工程移植而来,因为开发板用的是GD32F103VCT6,CAN0的引脚是PD0和PD1,且需要重映射,而GD32F103C8T6的CAN0引脚是PA11和PA12,且不需要重映射,所以修改的地方基本就两个,一是将重映射取消,二是将PIN脚修改成C对应的引脚,但是下载之后TX维持在1.3V,RX维持在1.9V,即时将中断代码注释,仅留下发送代码也是如此,但是只要不执行发送,管脚的电平就是正常的,一旦执行发送就会电平异常。望有经验的同学指点一二,C8T6代码如下:
  1. //main.c
  2. void RCC_Configuration(void);
  3. void NVIC_Configuration(void);

  4. void RCC_Configuration(void)
  5. {
  6.     RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_GPIOA , ENABLE);
  7. //    RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_GPIOB , ENABLE);         
  8. //    RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_GPIOC , ENABLE);
  9. //    RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_GPIOD , ENABLE);
  10. //    RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_GPIOE , ENABLE);
  11. //    RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_AF  , ENABLE);

  12. //    RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_USART1, ENABLE);
  13.     RCC_APB1PeriphClock_Enable(RCC_APB1PERIPH_CAN1, ENABLE);
  14. }

  15. /**
  16.   * [url=home.php?mod=space&uid=247401]@brief[/url]  Configure the nested vectored interrupt controller.
  17.   * @param  None
  18.   * @retval None
  19.   */
  20. void NVIC_Configuration(void)
  21. {
  22.     NVIC_InitPara NVIC_InitStructure;

  23. #ifdef  VECT_TAB_RAM
  24.   /* Set the Vector Table base location at 0x20000000 */
  25.     NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
  26. #else  /* VECT_TAB_FLASH  */
  27.   /* Set the Vector Table base location at 0x08000000 */
  28.     NVIC_VectTableSet(NVIC_VECTTAB_FLASH, 0x0);  
  29. #endif

  30.     NVIC_PRIGroup_Enable(NVIC_PRIGROUP_1);
  31.     NVIC_InitStructure.NVIC_IRQ = USB_LP_CAN1_RX0_IRQn;
  32.     NVIC_InitStructure.NVIC_IRQPreemptPriority = 0;
  33.     NVIC_InitStructure.NVIC_IRQSubPriority = 0x0;
  34.     NVIC_InitStructure.NVIC_IRQEnable = ENABLE;
  35.     NVIC_Init(&NVIC_InitStructure);
  36. }

  37. int main(void)
  38. {
  39. //   RCC_Configuration();
  40. //    NVIC_Configuration();
  41.     SysTick_Configuration();


  42.     CAN_GPIO_Configuration();
  43.     CAN_Configuration();

  44. //    CAN_INTConfig(CAN1, CAN_INT_RFNE0, ENABLE);
  45.        


  46.     while(1) {
  47.         TxMessage.Data[0] = 0x55;
  48.         CAN_Transmit(CAN1, &TxMessage);
  49.     }
  50. }
  51. //

  52. //can.c
  53. void CAN_GPIO_Configuration(void)
  54. {
  55.     GPIO_InitPara GPIO_InitStructure;
  56.        
  57.         RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_GPIOA , ENABLE);
  58.     RCC_APB1PeriphClock_Enable(RCC_APB1PERIPH_CAN1, ENABLE);
  59.     /* Remap CAN GPIOs */
  60.     //GPIO_PinRemapConfig(GPIO_REMAP2_CAN1 , ENABLE);

  61.     /* Configure CAN TX pin */
  62.     GPIO_InitStructure.GPIO_Pin = GPIO_PIN_12;
  63.     GPIO_InitStructure.GPIO_Mode = GPIO_MODE_AF_PP;
  64.     GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;
  65.     GPIO_Init(GPIOA, &GPIO_InitStructure);
  66.        
  67.         /* Configure CAN RX pin */
  68.     GPIO_InitStructure.GPIO_Pin = GPIO_PIN_11;
  69.     GPIO_InitStructure.GPIO_Mode = GPIO_MODE_IPU;
  70.     GPIO_Init(GPIOA, &GPIO_InitStructure);
  71. }

  72. /**
  73.   * @brief  Configures the CAN.
  74.   * @param  None
  75.   * @retval None
  76.   */
  77. void CAN_Configuration(void)
  78. {
  79.     CAN_InitPara        CAN_InitStructure;
  80.     CAN_FilterInitPara  CAN_FilterInitStructure;
  81.     /* CAN register init */
  82.     CAN_DeInit(CAN1);

  83.     CAN_StructInit(&CAN_InitStructure);

  84.     /* CAN cell init */
  85.     CAN_InitStructure.CAN_TTC = DISABLE;
  86.     CAN_InitStructure.CAN_ABOR = DISABLE;
  87.     CAN_InitStructure.CAN_AWK = DISABLE;
  88.     CAN_InitStructure.CAN_ARD = DISABLE;
  89.     CAN_InitStructure.CAN_RFOD = DISABLE;
  90.     CAN_InitStructure.CAN_TFO = DISABLE;
  91.     CAN_InitStructure.CAN_Mode = CAN_MODE_NORMAL;
  92.     CAN_InitStructure.CAN_SJW = CAN_SJW_1TQ;
  93.     CAN_InitStructure.CAN_BS1 = CAN_BS1_3TQ;
  94.     CAN_InitStructure.CAN_BS2 = CAN_BS2_5TQ;
  95.     CAN_InitStructure.CAN_Prescaler = 4;
  96.     CAN_Init(CAN1, &CAN_InitStructure);

  97.     /* CAN filter init */
  98.     CAN_FilterInitStructure.CAN_FilterNumber = 0;
  99.     CAN_FilterInitStructure.CAN_FilterMode = CAN_FILTERMODE_MASK;
  100.     CAN_FilterInitStructure.CAN_FilterScale = CAN_FILTERSCALE_32BIT;
  101.     CAN_FilterInitStructure.CAN_FilterListHigh = 0x0000;
  102.     CAN_FilterInitStructure.CAN_FilterListLow = 0x0000;
  103.     CAN_FilterInitStructure.CAN_FilterMaskListHigh = 0x0000;
  104.     CAN_FilterInitStructure.CAN_FilterMaskListLow = 0x0000;
  105.     CAN_FilterInitStructure.CAN_FilterFIFOAssociation = 0;
  106.     CAN_FilterInitStructure.CAN_FilterWork = ENABLE;
  107.     CAN_FilterInit(&CAN_FilterInitStructure);
  108.   
  109.     /* Transmit */
  110.     TxMessage.StdId = 0x602;
  111.     TxMessage.ExtId = 0x00;
  112.     TxMessage.FT = CAN_FT_DATA;
  113.     TxMessage.FF = CAN_FF_STANDARD;  
  114.     TxMessage.DLC = 8;
  115. }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部