STM32 CAN 通訊發送不能連續,不能接收

1. 今天調試CAN, STM32F334C8T6,做一個生物PCR監測的項目,用到CAN,程序寫完後,調試,發現發送只能發送16幀,而且不能接收,用的是USB2CAN

2. 檢查程序初始化部分如下

u8 CAN1_Init(u16 BaudRate,u8 mode)
{
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);                                                                    
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);    
    //初始化GPIO
    GPIO_InitTypeDef GPIO_InitStructure={
        .GPIO_Pin =  GPIO_Pin_12,
        .GPIO_Mode = GPIO_Mode_AF,              //複用功能
        .GPIO_OType = GPIO_OType_PP,        //推輓輸出
        .GPIO_Speed = GPIO_Speed_50MHz,     //100MHz
        .GPIO_PuPd = GPIO_PuPd_NOPULL,          //上拉
    };
    GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化PA11,PA12
    
    GPIO_InitTypeDef GPIO_InitStructure11={
        .GPIO_Pin = GPIO_Pin_11,
        .GPIO_Mode = GPIO_Mode_AF,              //複用功能
        .GPIO_OType = GPIO_OType_PP,        //推輓輸出
        .GPIO_Speed = GPIO_Speed_50MHz,     //100MHz
        .GPIO_PuPd = GPIO_PuPd_UP,          //上拉
    };
    
    GPIO_Init(GPIOA, &GPIO_InitStructure11);//初始化PA11,PA12
    
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource11,GPIO_AF_9); 
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource12,GPIO_AF_9); 

    
    //CAN單元設置
    CAN_InitTypeDef  CAN_InitStructure={     
        .CAN_TTCM=DISABLE,    //非時間觸發通信模式   
        .CAN_ABOM=DISABLE,    //軟件自動離線管理      
        .CAN_AWUM=DISABLE,    //睡眠模式通過軟件喚醒
        .CAN_NART=ENABLE,        //禁止報文自動傳送 
        .CAN_RFLM=DISABLE,    //報文不鎖定,新的覆蓋舊的  
        .CAN_TXFP=DISABLE,    //優先級由報文標識符決定 
        .CAN_Mode= mode,         //模式設置 
        .CAN_SJW=CAN_SJW_1tq,    //重新同步跳躍寬度(Tsjw)爲tsjw+1個時間單位 
        .CAN_BS1=CAN_BS1_6tq,   //CAN_BS2_5tq,Tbs1範圍CAN_BS1_1tq ~CAN_BS1_16tq
        .CAN_BS2=CAN_BS2_5tq,    //CAN_BS1_6tq,Tbs2範圍CAN_BS2_1tq ~    CAN_BS2_8tq
        .CAN_Prescaler=BaudRate,     //12,BaudRate,分頻係數(Fdiv)爲brp+1         
    };
    
    
    CAN_Init(CAN1, &CAN_InitStructure);// 初始化CAN1//配置過濾器 
    
    CAN_FilterInitTypeDef  CAN_FilterInitStructure0={
        .CAN_FilterNumber=CAN_Filter_FIFO0,        //過濾器0
        .CAN_FilterMode=CAN_FilterMode_IdMask, 
        .CAN_FilterScale=CAN_FilterScale_32bit, //32位 
        .CAN_FilterIdHigh=00,                       //16,  32位ID
        .CAN_FilterIdLow=0x0000,
        .CAN_FilterMaskIdHigh=0x0000,               //0xff,32位MASK
        .CAN_FilterMaskIdLow=0x0000,
        .CAN_FilterFIFOAssignment=CAN_Filter_FIFO0,//過濾器0關聯到FIFO0
        .CAN_FilterActivation=ENABLE,               //激活過濾器0
    };
    
    CAN_FilterInit(&CAN_FilterInitStructure0);    //濾波器初始化
    
    CAN_FilterInitTypeDef  CAN_FilterInitStructure1={
        .CAN_FilterNumber=CAN_Filter_FIFO1,      //過濾器1
        .CAN_FilterMode=CAN_FilterMode_IdMask, 
        .CAN_FilterScale=CAN_FilterScale_32bit, //32位 
        .CAN_FilterIdHigh=0x00FF,               //網絡參數更改
        .CAN_FilterIdLow=0x0000,
        .CAN_FilterMaskIdHigh=0x00FF,               //32位MASK
        .CAN_FilterMaskIdLow=0x0000,
        .CAN_FilterFIFOAssignment=CAN_Filter_FIFO1, //過濾器0關聯到FIFO0
        .CAN_FilterActivation=ENABLE,               //激活過濾器0
    };
    CAN_FilterInit(&CAN_FilterInitStructure1);    //濾波器初始化
    
    CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);      //FIFO1消息掛號中斷允許
    
    NVIC_InitTypeDef  NVIC_InitStructure0={
        .NVIC_IRQChannel = CAN1_RX0_IRQn,
        .NVIC_IRQChannelPreemptionPriority = 1,     // 主優先級爲1
        .NVIC_IRQChannelSubPriority = 0,            // 次優先級爲0
        .NVIC_IRQChannelCmd = ENABLE,
    };
    NVIC_Init(&NVIC_InitStructure0);
    
    CAN_ITConfig(CAN1,CAN_IT_FMP1,ENABLE);          //FIFO1 消息掛號中斷允許   
    NVIC_InitTypeDef  NVIC_InitStructure1={
        .NVIC_IRQChannel = CAN1_RX1_IRQn,
        .NVIC_IRQChannelPreemptionPriority = 1,     // 主優先級爲1
        .NVIC_IRQChannelSubPriority = 2,            // 次優先級爲0
        .NVIC_IRQChannelCmd = ENABLE,
    };
    NVIC_Init(&NVIC_InitStructure1);
    return 0;
}   

波特率是250K,計算一下 36MHZ/分頻/(1+6+5),CAN_SJW_1tq,CAN_BS1_6tq,CAN_BS2_5tq,剛好是250K

GPIO看了文檔也是OK

濾波器設置也是參照我以前的407的(CAN OK),

3.檢查了發送程序

u8 CAN_DataSend(MsgFrame const Msg)
{
    u8             mbox; 
    u16         i=0;
    CanTxMsg     TxMessage;
    BIT32       ExtID;
    
    //源地址
    ExtID.Bit8.Bit8[3] = 16;
    //目的地址
    ExtID.Bit8.Bit8[2] = Msg.MsgInfo.fAddr;
    //指令
    ExtID.Bit8.Bit8[1]  = Msg.Bit8[3];
    ExtID.Bit8.Bit8[0] = 0;
    TxMessage.StdId =  0x0;                // 標準標識符爲0
    TxMessage.ExtId = ExtID.Int>>3;        // 設置擴展標示符(29位)
    TxMessage.IDE = CAN_Id_Extended;  // 使用擴展標識符
    TxMessage.RTR = 0;                // 消息類型爲數據幀,一幀8位
    TxMessage.DLC = 8;                // 發送兩幀信息
    //拷貝數據
    memcpy(&TxMessage.Data[i],&(Msg.Bit8[5]),8);
    //傳輸數據
    mbox= CAN_Transmit(CAN1, &TxMessage);   
    while((CAN_TransmitStatus(CAN1, mbox)==CAN_TxStatus_Failed)&&(i<0XFFF))
        i++;//等待發送結束
    if(i>=0XFFF)return 0;
    return 1;
}

和以前也是一樣的,同時,用邏輯分析器,看也有波形。也有數據,但爲啥還是不能連續發送呢?有點迷茫

4. 還是再看看電路圖吧(不是我畫的,我同事畫的),發現沒有接120R電阻,以前記得要接120R,找同事要幾個120R電阻

接上去,測試,發現OK。

5.測試一下接收,也是OK

void CAN1_RX0_IRQHandler(void)
{

    if(CAN_GetFlagStatus(CAN1,CAN_FLAG_FMP0))
    {
        memset(&CANRxBuffer,0,sizeof(CanRxMsg));
        CAN_Receive(CAN1, CAN_FIFO0, &CANRxBuffer);
        if(CAN1FrameHandler!=NULL)
        {
            CAN1FrameHandler();
        }
    }
    CAN_ClearFlag(CAN1,CAN_FLAG_FMP0);
}

6. 折騰了一天的問題,終於解決了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章