打印
[APM32F1]

CAN通信

[复制链接]
1022|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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这个数据。

使用特权

评论回复
5
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引脚有没有和其他硬件复用呀? 
6
信号www12| | 2023-7-29 17:07 | 只看该作者
你的问题解决了吗,我也是遇到和你一样的问题。我也是用官方的例程,修改的地方只有改了管脚,改成了PA12和PA11,然后CAN也没工作起来。请问,你是怎么解决的?

使用特权

评论回复
7
jpx001| | 2023-12-11 08:52 | 只看该作者
同样问题

使用特权

评论回复
8
MAA256| | 2023-12-11 08:57 | 只看该作者
可以把部分原理图贴出来么

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

17

帖子

1

粉丝