This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

F28035的CAN调试过程中的奇怪问题,请教是何原因。



各位好,我的系统中用到F28035PNT,其中将GPIO30,GPIO31分别配置成CANRXA,CANTXA,然后初始化CANA,配置邮箱,并把装载数据,启动发送后,我在同样的板上测试,有部分F28035的CANTXA引脚有信号,有部分则没有信号。没有信号的板尝试换了IC,还是没有信号,引脚没有虚焊,这有可能是什么问题。 

程序如下:

EALLOW;

GpioCtrlRegs.GPAPUD.bit.GPIO30 = 0; 
GpioCtrlRegs.GPAPUD.bit.GPIO31 = 0; 

GpioCtrlRegs.GPAQSEL2.bit.GPIO30 = 3;

GpioCtrlRegs.GPAMUX2.bit.GPIO30 = 1;

GpioCtrlRegs.GPAMUX2.bit.GPIO31 = 1; 

EDIS;

然后,初始化CAN,程序如下:

struct ECAN_REGS ECanaShadow;

EALLOW; 

ECanaShadow.CANTIOC.all = ECanaRegs.CANTIOC.all; //
ECanaShadow.CANTIOC.bit.TXFUNC = 1;
ECanaRegs.CANTIOC.all = ECanaShadow.CANTIOC.all; 

ECanaShadow.CANRIOC.all = ECanaRegs.CANRIOC.all;
ECanaShadow.CANRIOC.bit.RXFUNC = 1;
ECanaRegs.CANRIOC.all = ECanaShadow.CANRIOC.all; 

ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
ECanaShadow.CANMC.bit.SCB = 1; // SCB=1 Select eCAN mode.
ECanaShadow.CANMC.bit.MBCC=1; //MBCC=1,Mailbox16成功收发后将时间戳寄存器清0
ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;

ECanaMboxes.MBOX0.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX1.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX2.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX3.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX4.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX5.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX6.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX7.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX8.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX9.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX10.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX11.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX12.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX13.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX14.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX15.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX16.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX17.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX18.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX19.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX20.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX21.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX22.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX23.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX24.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX25.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX26.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX27.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX28.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX29.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX30.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX31.MSGCTRL.all = 0x00000000;


ECanaRegs.CANTA.all = 0xFFFFFFFF; 

ECanaRegs.CANRMP.all = 0xFFFFFFFF; 

ECanaRegs.CANGIF0.all = 0xFFFFFFFF; 
ECanaRegs.CANGIF1.all = 0xFFFFFFFF;

ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
ECanaShadow.CANMC.bit.CCR = 1 ; 
ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;


do
{
ECanaShadow.CANES.all = ECanaRegs.CANES.all;
} while(ECanaShadow.CANES.bit.CCE != 1 ); // Wait for CCE bit to be set..

ECanaShadow.CANBTC.all = 0;

ECanaShadow.CANBTC.bit.BRPREG = 29; //TQ=(BRPREG+1)/30 us
ECanaShadow.CANBTC.bit.TSEG2REG = 1; //
ECanaShadow.CANBTC.bit.TSEG1REG = 6; // Bit time=(TSEG2REG+TSEG1REG+3)*TQ
ECanaShadow.CANBTC.bit.SAM = 1;
ECanaRegs.CANBTC.all = ECanaShadow.CANBTC.all;

ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
ECanaShadow.CANMC.bit.CCR = 0 ; // Set CCR = 0 修改上面的控制寄存器完成后让CCR=0
ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
// Wait until the CPU no longer has permission to change the configuration registers
do
{
ECanaShadow.CANES.all = ECanaRegs.CANES.all;
} while(ECanaShadow.CANES.bit.CCE != 0 ); // Wait for CCE bit to be cleared..
ECanaRegs.CANME.all = 0;
EDIS;

最后配置邮箱

ECanaMboxes.MBOX0.MSGID.all=0x98605601;

ECanaRegs.CANMD.all = 0xFFFF0000; //0:发送, 1:接收

ECanaRegs.CANME.all = 0xFFFFFFFF; //

ECanaMboxes.MBOX0.MSGCTRL.bit.DLC = 2; //数据长度
ECanaMboxes.MBOX0.MSGCTRL.bit.RTR = 0;

ECanaMboxes.MBOX0.MDL.byte.BYTE0=0xaa;
ECanaMboxes.MBOX0.MDL.byte.BYTE1=0x55;

最后,定时触发发送请求。

ECanaRegs.CANTRS.bit.TRS0=1;

  • TX引脚没有信号的板上,试了一下自发自收,接收的邮箱可以收到数据,引脚没有信号;

    TX引脚有信号的板上,试了一下自发自收,接收的邮箱可以收到数据,引脚也没有信号;

    怀疑引脚功能没有配置成功,但观其控制寄存器的数据却是无误。

  • 建议你先开启芯片的自测试功能,从而判断芯片工作是否正常。你现在是有的板子正常,有的异常,看起来还是焊接的问题。

  • 很遗憾,可以确定不是焊接的问题,贴片机贴出来的,并且我也用万用表测试过引脚跟焊盘的连接。用万用表和示波器对比了正常和不正常的两块板,所有的供电引脚电压都是一样的,波形也一样,包括晶体谐振器的波形也一致。电路的其他部分功能均一致,唯独CAN这个引脚。。。

    自发自收功能正常,正常收发模式时,发送引脚没信号出来,仿真时,在请求发送后2ms左右中断,此时ECanaRegs.CANES.all=0x00030010,ECanaRegs.CANTEC.all=200;引脚能出来波形,但不是正常的波形,TX被拉低8次,首次持续时间为136us,后面7次持续时间为8us(一个位的时间,波特率为125k),间隔是192us。

    不知道你说的自测功能是不是指自发自收功能。

  • CAN在启动发送时,要检测总线的状态,如果是空闲,才能够发送,同时,发送的数据在总线上时,通过本节点的收发器接收端,可以收到自己发出去的数据,如果发送引脚发出的数据在进入总线之前物理电路已经断开,那么,发送引脚发出去的数据就不会返回到接收引脚,eCAN模块自己都没法通过接收引脚检测到自己发出去的信号,所以不可能发送成功。在eCAN配置成功后,首次发送时,发送引脚确实会被拉低一段时间,这段时间eCAN模块要检测接收引脚的数据,但由于没法接收到信号,所以很快就能确认发送失败,此时,ECanaRegs.CANES.all=0x00030010,ECanaRegs.CANTEC.all=200;CANMC.CCR=1。

    本人所提的问题,正是发送引脚到总线的线路不通所致。(光耦失效,换之即可)

  • 请问:“CAN在启动发送时,要检测总线的状态,如果是空闲,才能够发送”
    28035如何判断总线是空闲?哪个寄存器?
    谢谢!