Part Number:TMS320F280049Other Parts Discussed in Thread:C2000WARE
上午好,这边遇到个问题,在调试CAN的发送时(晶振: INTOSC2,SysClock:80Mhz,Baud Rate:125K,ID:0x0000,DLC=0),在环回模式下,报文可以正常发送出来,但是正常工作时,一直报Bit0 Error错误。初始化程序仿照的can_ex3_external_transmit例程。两种模式下发送的Msg Objects都是使用的第31个。另外,硬件上Tx与Rx均与外界断开的(悬空),所以可以排除外部的原因。通过示波器查看正常工作模式下Tx上发送的波形发现波形完全跟正常的波形对不上,波形截图在下方,麻烦分析下可能是什么原因。谢谢。
下面的截图是在正常工作模式下,在进入CAN错误中断(Bit0 Error)时截取的寄存器值(第一次进入错误中断就已经是bus-off)。
Cherry Zhou:
您好我们已收到您的问题并升级到英文论坛。如有答复将尽快回复您。谢谢!
,
zujian11 zhang:
非常感谢。补充一下,这边配置的bitTime是20个Tq。然后用的例程和库函数是C2000Ware的3.04版本。
,
Cherry Zhou:
好的收到。您先看下以下答复:
当使用 CAN 通信时,我们强烈建议您不要将内部振荡器用作主时钟源,因为内部振荡器的精度可能无法满足 CAN 的时钟要求。 TRM 中也强调了这一点。
而bit0 error和bus-off,正常情况下都不会在环回模式下发生。 请您检查下您的代码有没有保留以下语句:
CAN_enableTestMode(CANA_BASE, CAN_TEST_EXL);
当 ISR 被服务时,bit 0 error和bus-off是指示您 CAN 可能不是处于环回模式。bit0 error会发生在当 CAN 需要发送显性的 "0" 状态,但总线正在监控隐性的 "1" 状态时。因此在某种程度上,代码中可能还是涉及外部 CAN 连接。如果有足够的错误 (可能由于重新传输尝试失败而发生一系列bit 0 error) 时, CAN 模块会通过进入bus-off来隔离总线。 简而言之,这些都是指示您可能并不是处于环回模式下。
,
zujian11 zhang:
你好,这边使用内部晶振是因为也想尝试一下,因为这边需要的通讯速率的要求并不高。 ps:刚才试了50K波特率,还是一样的现象。
程序在调用 CAN_startModule(CANA_BASE) 之前(也就是进入正常工作模式之前)这边是已经调用了 CAN_disableTestMode(CANA_BASE) ,您提到的那句话没有保留。这个也可以从寄存器值 CAN_CTL.TEST=0 看出。
是的,环回模式下的Tx波形正常,也没有bit0 error;ISR错误中断是在正常模式时进入的。 截图中Tx的波形 在第一个下降沿出现后的约135us时间内(大概16~17个bittime)没有高电平,所以报了bit0 error。但是不明白为什么一进入正常模式就出现这种波形,找不到问题。理论上环回模式测试正常的话这个也应该能正常发送才对吧,因为TX悬空的。
也不知道是不是哪里没配置正确,帮忙找下问题原因,谢谢。
,
zujian11 zhang:
补充一下代码吧,已经去除了环回模式的代码。问题现象没变。
// Initialize GPIO and configure GPIO pins for CANTX/CANRX on module AGPIO_setPinConfig(DEVICE_GPIO_CFG_CANRXA);GPIO_setPinConfig(DEVICE_GPIO_CFG_CANTXA);GPIO_setMasterCore(DEVICE_GPIO_PIN_CANRXA, GPIO_CORE_CPU1);GPIO_setMasterCore(DEVICE_GPIO_PIN_CANTXA, GPIO_CORE_CPU1);GPIO_setPadConfig(DEVICE_GPIO_PIN_CANRXA, GPIO_PIN_TYPE_PULLUP /*GPIO_PIN_TYPE_STD*/);// for Rx pin is uncornnect.GPIO_setQualificationMode(DEVICE_GPIO_PIN_CANRXA, GPIO_QUAL_ASYNC);GPIO_setQualificationMode(DEVICE_GPIO_PIN_CANTXA, GPIO_QUAL_ASYNC);CAN_initModule(CANA_BASE);// Initialize the CAN controllersCAN_setBitRate(CANA_BASE, DEVICE_SYSCLK_FREQ, 50000, 20);// Set up the CAN bus bit rate to 50kHz.CAN_Clock = 80M.bitTime = 20(Tq)CAN_enableInterrupt(CANA_BASE, (CAN_INT_IE0 | CAN_INT_ERROR | CAN_INT_STATUS));// Enable interrupts on the CAN A peripheral.Interrupt_register(INT_CANA0, &CanAISR);// This registers the interrupt handler in PIE vector table.// Enable the CAN-A interrupt signalInterrupt_enable(INT_CANA0);CAN_enableGlobalInterrupt(CANA_BASE, CAN_GLOBAL_INT_CANINT0);CAN_clearInterruptStatus(CANA_BASE, 31);CAN_getStatus(CANA_BASE);CAN_setupMessageObject(CANA_BASE, 31, 0x0000, CAN_MSG_FRAME_STD, CAN_MSG_OBJ_TYPE_TX, 0, CAN_MSG_OBJ_NO_FLAGS, 0);CAN_clearGlobalInterruptStatus(CANA_BASE, CAN_GLOBAL_INT_CANINT0);CAN_startModule(CANA_BASE);// Start CAN module A operationsuint16_t senddata[8] = {0};CAN_sendMessage(CANA_BASE, 31, 0, senddata);
,
zujian11 zhang:
zujian11 zhang 说:为什么一进入正常模式就出现这种波形
你好,可能这句话表述有误,应该是 进入正常模式后,一发送就出现这种波形。
zujian11 zhang 说:去除了环回模式的代码
这句应该是代码中去除了环回模式。
抱歉。更正一下。
,
Cherry Zhou:
您好,感谢您的更正,需要和您确认下,请问情况是不是以下这样:您尝试通过将 CAN与外部 CAN 总线隔离来调试 CAN的问题。 当器件通过收发器连接到 CAN 总线时,您有没有看到bit 0 error,并且为了调试此问题,随后断开了器件与 CAN 总线的连接,调用环回模式,然后测试,所有操作都没有错误正常进行是吗?
总之,在 CAN 通信中,每次传输数据时,接收器端会自动检查要传输的内容。 假设一个显性bit(logic 0) 从 CAN TX 引脚流出,RX 引脚必须为显性 (logic 0) ,否则如果 RX 看到logic1,就可以报告bit 0 error。
如果设置没错,这种情况下,RX 也应该是logic 0。 您使用示波器检查下 RX 的电平, 您提供的波形似乎是TX 引脚的。 也请检查 RX 引脚的波形。 信号可能会卡在 RX 引脚上的logic 1 上,如果确实是这个情况的话,那么这应该就是导致bit0 error的原因 (因此会触发bus off)。 收发器上可能也存在问题,或者 RX 引脚仅短接至高逻辑。
,
zujian11 zhang:
是的。感谢告知bit0 error的检测方法。我这边试一下连接到收发器后再发送。
,
zujian11 zhang:
您好,如您所说,是芯片外部Rx线有问题。非常感谢您的及时解答!
,
Cherry Zhou:
好的,您的问题解决了就好。之后也欢迎您随时来论坛参与讨论!