stm32f103 can总线回环测试可用,分析仪有数据,正常模式没有数据

各位大佬好,这几天一直在调stm32的can通讯,好几天了都没做出来~~~~~~~,来这里求救了!!!!!!!我使用的是stm32f103rct6单片机,使用的程序模板是原子哥ALIENTEK 战舰 STM32F103 开发板can实验教程,使用的can收发器是ISO1050,手里有一个个usb/can转换器。现在单片机canRX,TX接到IS01050,1050出来的CANH、CANL接到转换器的CANH\CANL,没有接反。
设置成回环测试的时候,电脑通过转化器可以收到单片机发出的数据,数据也没有错误。设置成正常模式,单片机就发不出数据了。
PCB板上加了两个led,用来指示单片机引脚的canRX、TX引脚。正常模式的时候这两个灯没有回环测试的时候亮,基本上亮不起来了,而且正常模式的时候闪十几下就不亮了。

下面是配置程序:
u8 CAN_Mode_Init(u8 tsjw,u8 tbs2,u8 tbs1,u16 brp,u8 mode)
{
GPIO_InitTypeDef GPIO_InitStructure;
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//ê1ÄüPORTAê±Öó                                                                                                                    

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);//ê1ÄüCAN1ê±Öó        

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //¸′óÃíÆíì
    GPIO_Init(GPIOA, &GPIO_InitStructure);                        //3õê¼»ˉIO

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;        //éÏà-êäèë
    GPIO_Init(GPIOA, &GPIO_InitStructure);                        //3õê¼»ˉIO

    //CANμ¥ÔaéèÖÃ
    CAN_InitStructure.CAN_TTCM=DISABLE;                        //·Çê±¼ä′¥·¢í¨DÅÄ£ê½  
    CAN_InitStructure.CAN_ABOM=DISABLE;                        //èí¼t×Ô¶ˉàëÏß1üàí         
    CAN_InitStructure.CAN_AWUM=DISABLE;                        //ËˉÃßÄ£ê½í¨1yèí¼t»½DÑ(Çå3yCAN->MCRμÄSLEEPλ)
    CAN_InitStructure.CAN_NART=ENABLE;                        //½ûÖ1±¨ÎÄ×Ô¶ˉ′«Ëí 
    CAN_InitStructure.CAN_RFLM=DISABLE;                         //±¨ÎÄ2»Ëø¶¨,DÂμĸ2¸Ç¾éμÄ  
    CAN_InitStructure.CAN_TXFP=DISABLE;                        //óÅÏ輶ó鱨Îıê궷û¾ö¶¨ 
    CAN_InitStructure.CAN_Mode= mode;                //Ä£ê½éèÖão mode:0,ÆÕí¨Ä£ê½;1,»Ø»·Ä£ê½; 
    //éèÖÃ2¨ìØÂê
    CAN_InitStructure.CAN_SJW=tsjw;                                //ÖØDÂí¬2½ìøÔ¾¿í¶è(Tsjw)Îatsjw+1¸öê±¼äμ¥λ  CAN_SJW_1tq         CAN_SJW_2tq CAN_SJW_3tq CAN_SJW_4tq
    CAN_InitStructure.CAN_BS1=tbs1;                         //Tbs1=tbs1+1¸öê±¼äμ¥λCAN_BS1_1tq ~CAN_BS1_16tq
    CAN_InitStructure.CAN_BS2=tbs2;                                //Tbs2=tbs2+1¸öê±¼äμ¥λCAN_BS2_1tq ~        CAN_BS2_8tq
    CAN_InitStructure.CAN_Prescaler=brp;        //·ÖÆμÏμêy(Fdiv)Îabrp+1        
    CAN_Init(CAN1, &CAN_InitStructure);                //3õê¼»ˉCAN1 

    CAN_FilterInitStructure.CAN_FilterNumber=0;        //1yÂËÆ÷0
    CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;         //Æá±ÎλÄ£ê½
    CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;         //32λ¿í 
    CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;        //32λID
    CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
    CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;//32λMASK
    CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
    CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;//1yÂËÆ÷01Øáaμ½FIFO0
    CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;//¼¤»î1yÂËÆ÷0

    CAN_FilterInit(&CAN_FilterInitStructure);                        //ÂË2¨Æ÷3õê¼»ˉ


    return 0;

}

//can·¢Ëíò»×éêy¾Y(1춨¸ñê½:IDÎa0X12,±ê×¼Ö¡,êy¾YÖ¡)

//len:êy¾Y3¤¶è(×î′óÎa8)

//msg:êy¾YÖ¸Õë,×î′óÎa8¸ö×Ö½ú.
//·μ»ØÖμ:0,3é1|;
// ÆäËû,꧰ü;
u8 Can_Send_Msg(u8* msg,u8 len)
{

u8 mbox;
u16 i=0;
CanTxMsg TxMessage;
TxMessage.StdId=0x12; // ±ê×¼±ê궷û
TxMessage.ExtId=0x12; // éèÖÃà©Õ1±êê¾·û
TxMessage.IDE=CAN_Id_Standard; // ±ê×¼Ö¡
TxMessage.RTR=CAN_RTR_Data; // êy¾YÖ¡
TxMessage.DLC=len; // òa·¢ËíμÄêy¾Y3¤¶è
for(i=0;i TxMessage.Data[i]=msg[i];
mbox= CAN_Transmit(CAN1, &TxMessage);
i=0;
while((CAN_TransmitStatus(CAN1, mbox)==CAN_TxStatus_Failed)&&(i if(i>=0XFFF)return 1;
return 0;

}
//can¿ú½óêÕêy¾Y2éÑˉ
//buf:êy¾Y»o′æÇø;

//·μ»ØÖμ:0,ÎTêy¾Y±»êÕμ½;
// ÆäËû,½óêÕμÄêy¾Y3¤¶è;
u8 Can_Receive_Msg(u8 *buf)
{

u32 i;
CanRxMsg RxMessage;
if( CAN_MessagePending(CAN1,CAN_FIFO0)==0)return 0; //ûóD½óêÕμ½êy¾Y,Ö±½óíË3ö
CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);//¶áè¡êy¾Y

for(i=0;i<8;i++)
buf[i]=RxMessage.Data[i];

return RxMessage.DLC;

}

下面是主程序:
#include "led.h"
#include "delay.h"
//#include "key.h"
#include "sys.h"
//#include "lcd.h"
//#include "usart.h"

#include "can.h"
int main(void)
{

u8 key;
u8 i=0,t=0;
u8 cnt=0;
u8 canbuf[8];
u8 res;
u8 mode=CAN_Mode_LoopBack;//CAN1¤×÷Ä£ê½;CAN_Mode_Normal(0)£oÆÕí¨Ä£ê½£¬CAN_Mode_LoopBack(1)£o»·»ØÄ£ê½

    delay_init();                     //Ñóê±oˉêy3õê¼»ˉ          
    //NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//éèÖÃÖD¶ÏóÅÏ輶·Ö×éÎa×é2£o2λÇàÕ¼óÅÏ輶£¬2λÏìó|óÅÏ輶
    //uart_init(115200);                 //′®¿ú3õê¼»ˉÎa115200


    CAN_Mode_Init(CAN_SJW_1tq,CAN_BS2_8tq,CAN_BS1_9tq,20,CAN_Mode_Normal);//CAN3õê¼»ˉ»·»ØÄ£ê½,2¨ìØÂê100Kbps    CAN_Mode_LoopBack   CAN_Mode_Normal

    while(1)
    {


               for(i=0;i<8;i++)
                    {
                            canbuf[i]=cnt+i;//ìî3ä·¢Ëí»o3åÇø
                    }
                    res=Can_Send_Msg(canbuf,8);//·¢Ëí8¸ö×Ö½ú
                    delay_ms(1500);


            }                   

}![图片说明](https://img-ask.csdn.net/upload/201711/23/1511431715_397768.png)图片说明

4个回答

可以使用示波器看看 波形。

有点乱,变量名完全看不懂

测一下收发芯片的工作情况

是不是总线两端没加匹配电阻的原因。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问