[APM32F103]

CAN通信

[复制链接]
658|6
手机看帖
扫描二维码
随时随地手机跟帖
lumilu|  楼主 | 2022-12-15 10:12 | 显示全部楼层 |阅读模式
APM32F103TBU6的CAN设置,一直没有反应,不知道怎么回事。有用过的能否帮个忙

使用特权

评论回复
lumilu|  楼主 | 2022-12-15 10:15 | 显示全部楼层
RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_CAN1);
NVIC_EnableIRQRequest(USBD1_LP_CAN1_RX0_IRQn, 0, 0);
void CAN_GPIO_Init(void)
{
    RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_AFIO);
    RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOA);
    GPIO_Config_T configStruct;

    GPIO_ConfigPinRemap(GPIO_REMAP2_CAN1);
    configStruct.pin   = GPIO_PIN_12;      
    configStruct.mode  = GPIO_MODE_AF_PP;
    configStruct.speed = GPIO_SPEED_50MHz;
    GPIO_Config(GPIOA, &configStruct);

    configStruct.pin = GPIO_PIN_11;        
    configStruct.mode = GPIO_MODE_IN_PU;
    GPIO_Config(GPIOA, &configStruct);

}
void CAN_Config_Init(void)
{
    RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_CAN1);   //使能CAN时钟
  
    CAN_Config_T       canConfig;
    CAN_FilterConfig_T FilterStruct;

    CAN_Reset(CAN1);


    CAN_ConfigStructInit(&canConfig);
    canConfig.autoBusOffManage = DISABLE;
    canConfig.autoWakeUpMode   = DISABLE;
    canConfig.nonAutoRetran    = DISABLE;
    canConfig.rxFIFOLockMode   = DISABLE;
    canConfig.txFIFOPriority   = ENABLE;
    canConfig.mode             = CAN_MODE_NORMAL;
    canConfig.syncJumpWidth    = CAN_SJW_1;
    canConfig.timeSegment1     = CAN_TIME_SEGMENT1_3;
    canConfig.timeSegment2     = CAN_TIME_SEGMENT2_2;   //   100K
    canConfig.prescaler = 60;

    CAN_Config(CAN1,&canConfig);

    FilterStruct.filterNumber = 1;
    FilterStruct.filterMode = CAN_FILTER_MODE_IDMASK;
    FilterStruct.filterScale = CAN_FILTER_SCALE_32BIT;
    FilterStruct.filterIdHigh = 0x6420;
    FilterStruct.filterIdLow  = 0x0000;
    FilterStruct.filterMaskIdHigh = 0x0000;
    FilterStruct.filterMaskIdLow  = 0x0000;
    FilterStruct.filterFIFO = CAN_FILTER_FIFO_0;
    FilterStruct.filterActivation =  ENABLE;

    CAN_ConfigFilter(CAN1,&FilterStruct);
}
void CAN_Transmit_Init(void)
{
   // TxMessage.stdID = 0x321;
          TxMessage.stdID = 0x00;
    TxMessage.extID = 0x01;
    TxMessage.remoteTxReq   = CAN_RTXR_DATA;
    TxMessage.typeID   = CAN_TYPEID_STD;
    TxMessage.dataLengthCode   = 1;
}
CAN_EnableInterrupt(CAN1,CAN_INT_F0MP);
while(1)
    {


            TxMessage.data[0]  = 0x55;
            CAN_TxMessage(CAN1,&TxMessage);
      

      
    }

使用特权

评论回复
luobeihai| | 2022-12-15 23:34 | 显示全部楼层
你好,可以具体描述一下实验环境是怎么样的吗?

使用特权

评论回复
lumilu|  楼主 | 2022-12-16 08:50 | 显示全部楼层
luobeihai 发表于 2022-12-15 23:34
你好,可以具体描述一下实验环境是怎么样的吗?

单片机是APM32F103TBU6,主要是想利用CAN发送数据,只发送一个标准数据帧,0x55,,速率是250K,用CAN分析仪侦测速率正常,接受中断里面的控制程序没有问题,但是发CAN分析仪上位机软件一直收不到发送的0X55这个数据。

使用特权

评论回复
lumilu|  楼主 | 2022-12-16 08:52 | 显示全部楼层
lumilu 发表于 2022-12-16 08:50
单片机是APM32F103TBU6,主要是想利用CAN发送数据,只发送一个标准数据帧,0x55,,速率是250K,用CAN分析仪 ...

接收中断执行没问题
void CAN1_RX0_ISR(void)
{
    CAN_RxMessage(CAN1, CAN_RX_FIFO_0, &RxMessage);
        if (RxMessage.data[0] == 0x55)
    {
   
        GPIO_SetBit(GPIOA,GPIO_PIN_8);
        GPIO_ResetBit(GPIOA,GPIO_PIN_9);
    }
    else
    {
   
                        GPIO_SetBit(GPIOA,GPIO_PIN_8);
                        GPIO_SetBit(GPIOA,GPIO_PIN_9);
    }
}

使用特权

评论回复
评论
lumilu 2022-12-16 14:33 回复TA
@luobeihai :36脚的不支持复用,仔细看了,没有啊 
luobeihai 2022-12-16 13:31 回复TA
看了下代码,没看出什么问题,你的GPIO引脚有没有和其他硬件复用呀? 
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则