打印

江湖救急:STM32F407 CAN初始化失败!!!

[复制链接]
11143|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
vacky|  楼主 | 2013-1-21 09:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人ARM初学者,求各位大侠解燃眉之急。在使用STM32F407  CAN外设时始终无法输出数据,用示波器观察TX和RX均无信号,后经在线调试发现CAN初始化貌似有问题,现求各位大侠解救。下面是CAN 的配置:
void GPIO_CAN_init()
{
       
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);                                //CAN IO时钟
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);                            //CAN 时钟

        GPIO_DeInit(GPIOD);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;                                                            //RX引脚
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;                                                  //输入模式
//        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;                                                  //设置为推挽
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                                         
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;                                                  //设置上拉
        GPIO_Init(GPIOD, &GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;                                                            //TX引脚
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;                                                   //设置复用模式
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;                                                   //设置为推挽
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;                                    //其他未置引脚悬空
        GPIO_Init(GPIOD, &GPIO_InitStructure);


        GPIO_PinAFConfig(GPIOD, GPIO_PinSource0, GPIO_AF_CAN1);                                //启动IO复用功能
        GPIO_PinAFConfig(GPIOD, GPIO_PinSource1, GPIO_AF_CAN1);

       
        /*-----------CAN控制器初始化 ------------------------------------------*/
        CAN_DeInit(CAN1);                                                   //复位所有设置               
        CAN_StructInit(&CAN_InitStructure);
        CAN_InitStructure.CAN_TTCM = DISABLE;
        CAN_InitStructure.CAN_ABOM = DISABLE ;                              //使能离线管理               
//        CAN_InitStructure.CAN_ABOM = ENABLE ;                               //使能离线管理               
        CAN_InitStructure.CAN_AWUM = DISABLE;
        CAN_InitStructure.CAN_NART = DISABLE ;                              //使能自动重传               
//        CAN_InitStructure.CAN_NART = ENABLE ;                               //使能自动重传               
        CAN_InitStructure.CAN_RFLM = DISABLE;
        CAN_InitStructure.CAN_TXFP = DISABLE;                               //复位所有设置               
        CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;                       //设置为正常模式              
  /* CAN Baudrate = 125kbps (CAN clocked at 30 MHz) */
        CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;                            //波特率相关设置              
        CAN_InitStructure.CAN_BS1 = CAN_BS1_6tq;
        CAN_InitStructure.CAN_BS2 = CAN_BS2_8tq;
        CAN_InitStructure.CAN_Prescaler = 16;
//        CAN_Init(CAN1, &CAN_InitStructure);
        while(CAN_Init(CAN1, &CAN_InitStructure)!=CANINITOK);               //此处为在线调试断点,程序卡在这里,初始化成功则继续往下                 
       
        /*-----------初始化滤波设置--------------------------------------------*/
        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);                             /*  载入设置                    */           
       
        CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);
}


查看手册CAN初始化配置完后需要通过RX清除INAK应答才能进入正常工作模式,调试发现INAK始终没有清除,导致初始化失败。 用学习板自带例程,使用的是回环自测模式,发现也是同样问题。
请问各位大侠是否正常,是否是GPIO配置问题,还是接收芯片问题,望各位解答,不胜感激!!!!
沙发
vacky|  楼主 | 2013-1-21 11:59 | 只看该作者
木有人关注啊 自己顶一个先,在线等!求大侠解救

使用特权

评论回复
板凳
IJK| | 2013-1-21 14:05 | 只看该作者
RX引脚配置感觉不对,也应该配置成 GPIO_Mode_AF

使用特权

评论回复
评论
vacky 2013-1-22 11:27 回复TA
顶 
评分
参与人数 1威望 +1 收起 理由
vacky + 1 很给力!
地板
vacky|  楼主 | 2013-1-21 14:09 | 只看该作者
额 非常感谢解答 一点就对 之前看那些帖子被误导了,万分感谢

使用特权

评论回复
5
1059435488| | 2013-4-2 14:42 | 只看该作者
我现在也在做407的can用你的配置用示波器测不出方波,这是为什么啊

使用特权

评论回复
6
vacky|  楼主 | 2013-4-7 15:22 | 只看该作者
1059435488 发表于 2013-4-2 14:42
我现在也在做407的can用你的配置用示波器测不出方波,这是为什么啊

其他设置都是正确的 只要把两个输入输出引脚都配置成复用推挽输出即可

使用特权

评论回复
7
842017523| | 2013-10-24 20:14 | 只看该作者
楼主有全部代码吗??刚学can总线,我想参考一下是如何配置的。谢谢!!!

使用特权

评论回复
8
vacky|  楼主 | 2013-10-25 10:18 | 只看该作者
842017523 发表于 2013-10-24 20:14
楼主有全部代码吗??刚学can总线,我想参考一下是如何配置的。谢谢!!! ...

void GPIO_CAN_init()
{
        
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);                                //CAN IO时钟
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);                            //CAN 时钟

        GPIO_DeInit(GPIOD);
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;                                                            //RX引脚
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;                                                  //设置复用模式
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;                                                  //设置为推挽
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                                          
//        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;                                                  //设置上拉
        GPIO_Init(GPIOD, &GPIO_InitStructure);
        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;                                                            //TX引脚
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;                                                   //设置复用模式
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;                                                   //设置为推挽
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;                                    //其他未置引脚悬空
        GPIO_Init(GPIOD, &GPIO_InitStructure);


        GPIO_PinAFConfig(GPIOD, GPIO_PinSource0, GPIO_AF_CAN1);                                //启动IO复用功能
        GPIO_PinAFConfig(GPIOD, GPIO_PinSource1, GPIO_AF_CAN1);

        
        /*-----------CAN控制器初始化 ------------------------------------------*/
        CAN_DeInit(CAN1);                                                   //复位所有设置               
        CAN_StructInit(&CAN_InitStructure);
        CAN_InitStructure.CAN_TTCM = DISABLE;
        CAN_InitStructure.CAN_ABOM = DISABLE ;                              //使能离线管理               
//        CAN_InitStructure.CAN_ABOM = ENABLE ;                               //使能离线管理               
        CAN_InitStructure.CAN_AWUM = DISABLE;
        CAN_InitStructure.CAN_NART = DISABLE ;                              //使能自动重传               
//        CAN_InitStructure.CAN_NART = ENABLE ;                               //使能自动重传               
        CAN_InitStructure.CAN_RFLM = DISABLE;
        CAN_InitStructure.CAN_TXFP = DISABLE;                               //复位所有设置               
        CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;                       //设置为正常模式              
  /* CAN Baudrate = 200kbps (CAN clocked at 42 MHz) */                                                //CAN外设频率为系统4分频 168/4=42MHZ
        CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;                            //波特率相关设置              
        CAN_InitStructure.CAN_BS1 = CAN_BS1_6tq;
        CAN_InitStructure.CAN_BS2 = CAN_BS2_8tq;
        CAN_InitStructure.CAN_Prescaler = 14;
        CAN_Init(CAN1, &CAN_InitStructure);
//        while(CAN_Init(CAN1, &CAN_InitStructure)!=CANINITOK);               //此处为在线调试断点,程序卡在这里,初始化成功则继续往下                 
        
        /*-----------初始化滤波设置--------------------------------------------*/
        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);                             /*  载入设置                    */           
        
        CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);
}

使用特权

评论回复
9
842017523| | 2013-10-25 22:27 | 只看该作者
我用还回模式自测。我在PA11,PA12,没接线的情况下收到了讯息。我有些不解,不知道哪里错了,或者哪里理解错了。还望指教一下谢谢。(发送信息成功点亮PD12,收到成功点亮PD13)。代码借用了你的上面这一段。





#include "bsp.h"
#include "stdio.h"

#include "rcs.h"
#include "stm32f4xx.h"
#include "stm32f4xx_rcc.h"

#include "stm32f4xx_can.h"

#include "stm32f4xx_gpio.h"

#include "stm32f4xx_flash.h"
#include "system_stm32f4xx.h"







void RCC_Configuration(void);

// void CAN_Config(void);
void GPIO_CAN_init(void);

CanTxMsg TxMessage;
CanRxMsg RxMessage;
CAN_InitTypeDef        CAN_InitStructure;
CAN_FilterInitTypeDef  CAN_FilterInitStructure;

int main(void)
{
    uint32_t state = 0;
    uint8_t transmit_mailbox = 0;
    RCC_Configuration();

    //CAN_Config();
    GPIO_CAN_init();


    while (1)
    {
      
        state = 0;
        RxMessage.DLC = 0;
        transmit_mailbox = CAN_Transmit(CAN1, &TxMessage);
        state = CAN_TransmitStatus(CAN1, transmit_mailbox);

        //CAN_FIFORelease(CAN1, CAN_FIFO0);

        CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);

        if (state != 0)
        {
            GPIO_SetBits(GPIOD, GPIO_Pin_12);
        }

        if (RxMessage.DLC < 9)
        {
            GPIO_SetBits(GPIOD, GPIO_Pin_13);
        }

        //OSTimeDly(3000);
      
        
        //GPIO_ResetBits(GPIOD, GPIO_Pin_12 | GPIO_Pin_13);

    }

}


void RCC_Configuration(void)
{


    ErrorStatus HSEStartUpStatus;

    /* RCC system reset(for debug purpose) */
    RCC_DeInit();

    /* Enable HSE */
    RCC_HSEConfig(RCC_HSE_ON);

    /* Wait till HSE is ready */
    HSEStartUpStatus = RCC_WaitForHSEStartUp();

    if (HSEStartUpStatus == SUCCESS)
    {
        /* Enable Prefetch Buffer */
        FLASH_PrefetchBufferCmd(ENABLE);

        /* HCLK = SYSCLK */
        RCC_HCLKConfig(RCC_SYSCLK_Div1);

        /* PCLK2 = HCLK */
        RCC_PCLK2Config(RCC_HCLK_Div1);

        /* PCLK1 = HCLK */
        RCC_PCLK1Config(RCC_HCLK_Div1);

        /* Select HSE as system clock source */
        RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);

        /* Wait till HSE is used as system clock source */
        while (RCC_GetSYSCLKSource() != 0x04)
        {
        }
    }

}



// void CAN_Config(void)
// {
//     GPIO_InitTypeDef  GPIO_InitStructure;

//     /* GPIO clock enable */
//     GPIO_PinAFConfig (GPIOB, GPIO_PinSource8, GPIO_AF_CAN1);
//     GPIO_PinAFConfig (GPIOB, GPIO_PinSource9, GPIO_AF_CAN1);
//     /* Configure CAN pin: RX */
//     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;//| GPIO_Pin_9;
//     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
//     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
//     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;
//     GPIO_Init(GPIOB, &GPIO_InitStructure);
//     /* Configure CAN pin: TX */
//     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
//     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
//     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
//     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;
//     GPIO_Init(GPIOB, &GPIO_InitStructure);
//     RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);

//     RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
//     GPIO_StructInit(&GPIO_InitStructure);   //初始化GPIO_InitStructure变量
//     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;    //定义为12管脚号
//     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;   //模式设置为输出
//     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度为50MHz
//     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;  //推挽输出
//     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;    //内部上拉
//     GPIO_Init(GPIOD, &GPIO_InitStructure);      //初始化IO口

//      //Configure CAN pin: RX



//     /* CANx Periph clock enable */



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

//     /* CAN Baudrate = 1MBps*/
//     CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
//     CAN_InitStructure.CAN_BS1 = CAN_BS1_3tq;
//     CAN_InitStructure.CAN_BS2 = CAN_BS2_5tq;
//     CAN_InitStructure.CAN_Prescaler = 4;
//     CAN_Init(CAN1, &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 = 0x321;
//     TxMessage.ExtId = 0x01;
//     TxMessage.IDE = CAN_ID_STD;
//     TxMessage.RTR = CAN_RTR_DATA;

//     TxMessage.DLC = 1;
// }



void GPIO_CAN_init()
{
    GPIO_InitTypeDef  GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
    GPIO_StructInit(&GPIO_InitStructure);   //初始化GPIO_InitStructure变量
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13;//| GPIO_Pin_14 | GPIO_Pin_15;    //定义为12管脚号
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;   //模式设置为输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度为50MHz
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;  //推挽输出
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;    //内部上拉
    GPIO_Init(GPIOD, &GPIO_InitStructure);      //初始化IO口

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);       //CAN IO时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);     //CAN 时钟

    GPIO_DeInit(GPIOA);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;            //RX引脚
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;          //输入模式
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;             //设置为推挽
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;             //设置上拉
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;             //TX引脚
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;       //设置复用模式
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;           //设置为推挽
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    //GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;    //其他未置引脚悬空
    GPIO_Init(GPIOA, &GPIO_InitStructure);


    GPIO_PinAFConfig(GPIOA, GPIO_PinSource11, GPIO_AF_CAN1);            //启动IO复用功能
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource12, GPIO_AF_CAN1);


    /*-----------CAN控制器初始化 ------------------------------------------*/
    CAN_DeInit(CAN1);                                                   //复位所有设置
    CAN_StructInit(&CAN_InitStructure);
    CAN_InitStructure.CAN_TTCM = DISABLE;
    CAN_InitStructure.CAN_ABOM = DISABLE ;                              //使能离线管理
    //        CAN_InitStructure.CAN_ABOM = ENABLE ;                      //使能离线管理
    CAN_InitStructure.CAN_AWUM = DISABLE;
    CAN_InitStructure.CAN_NART = DISABLE ;                              //使能自动重传
    //        CAN_InitStructure.CAN_NART = ENABLE ;                         //使能自动重传
    CAN_InitStructure.CAN_RFLM = DISABLE;
    CAN_InitStructure.CAN_TXFP = DISABLE;                               //复位所有设置
    CAN_InitStructure.CAN_Mode = CAN_Mode_LoopBack;                       //设置为正常模式
    /* CAN Baudrate = 125kbps (CAN clocked at 30 MHz) */
    CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;                            //波特率相关设置
    CAN_InitStructure.CAN_BS1 = CAN_BS1_6tq;
    CAN_InitStructure.CAN_BS2 = CAN_BS2_8tq;
    CAN_InitStructure.CAN_Prescaler = 16;
    CAN_Init(CAN1, &CAN_InitStructure);
    while (CAN_Init(CAN1, &CAN_InitStructure) != CANINITOK);  //此处为在线调试断点,程序卡在这里,初始化成功则继续往下

    /*-----------初始化滤波设置--------------------------------------------*/
    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);               /*  载入设置                    */

    CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);

    /* Transmit */
    TxMessage.StdId = 0x321;
    TxMessage.ExtId = 0x01;
    TxMessage.IDE = CAN_ID_STD;
    TxMessage.RTR = CAN_RTR_DATA;      //数据帧

    TxMessage.DLC = 1;

    TxMessage.Data[0] = 0xCA;

    /* RECIEVE */
    RxMessage.StdId = 0x00;
    RxMessage.ExtId = 0x01;
    RxMessage.IDE = CAN_ID_STD;


    RxMessage.DLC = 0;

    RxMessage.Data[0] = 0x00;

}









使用特权

评论回复
10
vacky|  楼主 | 2013-10-26 09:58 | 只看该作者
842017523 发表于 2013-10-25 22:27
我用还回模式自测。我在PA11,PA12,没接线的情况下收到了讯息。我有些不解,不知道哪里错了,或者哪里理解 ...

没明白你的问题是什么,是指没接线也能收到数据?这个是因为你使用了回环模式,这个模式是在芯片内部自循环,不需要外部接线。

使用特权

评论回复
11
842017523| | 2013-10-26 13:47 | 只看该作者
vacky 发表于 2013-10-26 09:58
没明白你的问题是什么,是指没接线也能收到数据?这个是因为你使用了回环模式,这个模式是在芯片内部自循 ...

确实是搞错了,我用的自测还回模式。。。但是我现在一块板用正常模式,并作为接收板,我单独调试的时候都没有向他发送东西,结果它也收到了数据。。。不明觉厉呀,还望再解答一下。。另外楼主可否把can通讯整体代码给我参考一下?我调了很久都没弄好。。。。。。。。

使用特权

评论回复
12
vacky|  楼主 | 2013-10-28 16:34 | 只看该作者
842017523 发表于 2013-10-26 13:47
确实是搞错了,我用的自测还回模式。。。但是我现在一块板用正常模式,并作为接收板,我单独调试的时候都 ...

CAN.rar (2.98 MB)

CAN接收数据一般放在CAN接收中断中,你确认下你的接收方式。

使用特权

评论回复
13
842017523| | 2013-11-2 09:05 | 只看该作者
vacky 发表于 2013-10-28 16:34
CAN接收数据一般放在CAN接收中断中,你确认下你的接收方式。

谢谢楼主!!但是按照你的例子我试了一下,两块板还是无法通讯,我都是用的查询模式进行接收。。。

使用特权

评论回复
14
vacky|  楼主 | 2013-11-2 10:13 | 只看该作者
842017523 发表于 2013-11-2 09:05
谢谢楼主!!但是按照你的例子我试了一下,两块板还是无法通讯,我都是用的查询模式进行接收。。。 ...

你在确认下你的波特率

使用特权

评论回复
15
842017523| | 2013-11-2 10:56 | 只看该作者
vacky 发表于 2013-11-2 10:13
你在确认下你的波特率

两块板的波特率,和你的设置是一样的。应该没问题吧。。

使用特权

评论回复
16
842017523| | 2013-11-2 13:10 | 只看该作者
842017523 发表于 2013-11-2 10:56
两块板的波特率,和你的设置是一样的。应该没问题吧。。

楼主,可以再帮我看看代码吗??多谢了!!

使用特权

评论回复
17
842017523| | 2013-11-2 13:11 | 只看该作者
楼主,可以再帮我看看代码吗??多谢了!!

使用特权

评论回复
18
vacky|  楼主 | 2013-11-4 08:56 | 只看该作者
我的板子是STM32F407 晶振25MHz 设置主频168MHz CAN引脚为PD0和PD1 这些都没错的话 代码就能用的 你那边的硬件我不清楚 你最好有第三方检测CAN总线的软件 能在电脑上看到接收数据的那种 先确认发出来的数据是否正确 如果发出来的数据正确就检查接收端的问题 先确保硬件没问题 在看程序

使用特权

评论回复
19
yuanxinfei| | 2014-11-26 10:03 | 只看该作者
can时钟为什么是30M的,我也是用stm32f407,晶振25M的,我的引脚选的是I9,H13,我也照着你的配置,发不出来数据,为什么呢

使用特权

评论回复
20
ningzb| | 2014-12-5 15:26 | 只看该作者
怎么都是发不出数据呢,我也是发不出数据,stm32F207zet6 用的是CAN1

使用特权

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

本版积分规则

3

主题

38

帖子

0

粉丝