你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F4 CAN 发送失败

[复制链接]
power568 提问时间:2016-4-2 13:37 /
本帖最后由 power568 于 2016-4-2 13:44 编辑

在使用STM32F405调试CAN的时,使用官方的例程的环回模式时,数据收发都可以,但是将环回模式更改为正常模式,且接上CAN卡想抓数据时,发现发送数据失败(超时), CAN初始化代码如下:
void        CanComInit(void)
{
  CAN_InitTypeDef        CAN_InitStructure;
  CAN_FilterInitTypeDef  CAN_FilterInitStructure;

  //// CAN register init
  CAN_DeInit(CAN_ONE_PERIPH_PORT);

  //// 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_Mode_LoopBack;
  CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;

  //// Baudrate (CAN clocked at 42 MHz)
        //// Baudrate = 42 MHz/((1+BS1+BS2)*CAN_Prescaler)
  CAN_InitStructure.CAN_BS1 = CAN_BS1_13tq;
  CAN_InitStructure.CAN_BS2 = CAN_BS2_8tq;
  CAN_InitStructure.CAN_Prescaler = 2;
  CAN_Init(CAN_ONE_PERIPH_PORT, &CAN_InitStructure);

  CAN_FilterInitStructure.CAN_FilterNumber = 0;
  CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
  CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
  CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0020;        //// StdId = 0x01
  CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;
  CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x003F;
  CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFFF;  
  CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0;
  CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
  CAN_FilterInit(&CAN_FilterInitStructure);

        test = 1;
        while(1)
        {
                //// transmit
                TxMessage.StdId = test;
                TxMessage.RTR = CAN_RTR_DATA;
                TxMessage.IDE = CAN_ID_STD;
                TxMessage.DLC = 2;
                TxMessage.Data[0] = 0xCA;
                TxMessage.Data[1] = 0xFf;

                TransmitMailbox = CAN_Transmit(CAN_ONE_PERIPH_PORT, &TxMessage);
                num = 0;
                while((CAN_TransmitStatus(CAN_ONE_PERIPH_PORT, TransmitMailbox)  !=  CANTXOK) && (num  !=  0xFFFFF))
                {
                        num++;
                }

////                num = 0;
////                while((CAN_MessagePending(CAN_ONE_PERIPH_PORT, CAN_FIFO0) < 1) && (num  !=  0xFFFF))
////                {
////                        num++;
////                }

////                //// receive
////                RxMessage.StdId = 0x00;
////                RxMessage.IDE = CAN_ID_STD;
////                RxMessage.DLC = 0;
////                RxMessage.Data[0] = 0x00;
////                RxMessage.Data[1] = 0x00;
////                CAN_Receive(CAN_ONE_PERIPH_PORT, CAN_FIFO0, &RxMessage);

////                if (RxMessage.StdId != 0x11)
////                {
////                        RxMessage.StdId = 0xFF;  
////                }
        }
}


发送后,num  ==  0xFFFFF 退出循环...
代码只是将环回模式更改为正常模式,其余没有更改,不知道为什么???

求指点...


收藏 评论1 发布时间:2016-4-2 13:37

举报

1个回答
power568 回答时间:2016-4-3 23:12:10
楼上的说的对,波特率设置错误,应该是:CAN_InitStructure.CAN_BS1 = CAN_BS1_12tq;
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版