更新1:
通过设置 MODRR0 为 低四位为 0100 ,将 MSCAN 和 CANPHY 之间链接暴露到 PC1(TXCAN-->CPTXD) 和 PC2(CPRXD --> RXCAN) 端口,通过示波器观察如下:
1.电脑发送到 开发板,PC2 可以看到数据,PC1 可以看到“应答”,正常
2.开发板发送到电脑,PC1 和 PC2 都可以看到数据,看不到来自 电脑的应答,所以开发板一直在重发,但 RXCAN 也会看到 TXCAN 端的数据吗?
--------------------------
公司的新项目,用的 S12ZVH128,目前用的官方的 TRK-S12ZVH128 的开发板进行测试和评估,已经完成其他部件的测试了。在做 CAN 部分的测试,已经卡在这里4天了,求助大家
背景:
开发环境用的 CW 10.6.4, PE 10.6.0
采用 PE 生成的底层驱动,采用的 MSCAN + CANPHY
PC端用 CAN分析仪进行收发
现象:
1.loop 模式可以正常工作
2.PC端发送数据,开发板可以进入中断,可以接受数据;
3.向PC端发送失败
用示波器查看波形貌似也是正常,位宽度4us(250kbps),波特率正常
中断进入查看与发送相关的寄存器
a. RFIG = 0x08, TSTAT=10,反应错误计数大于128
b.T**=0X06,反应 tx buffer 0 一直是 full,也就是一种没有发送成功
从示波器上看也是一直在重发
在以下中断中查询错误代码:
void CAN1_OnError(void)
{
/* Write your code here ... */
CAN1_TError error;
CAN1_GetError(&error);
}
反应为 TxWarning = 1,这个是什么情况?
c. CANPHY 启动后,在 CPIF 中报告 CPCHVL 和 CPCLVL 状态改变过,清除该标记后不会再次进入;
个人怀疑可能的原因:
1.CANPHY 的 IO 没有配置正确,有网友提到 S12 系列 RXCAN 要配置上拉(用的外部 CANPHY ),但我用内部的 PHY 怎么配置,没找到啊?
2.是否进入了 “监听模式”(这个应该是要发生 高电压故障 吧?)或进入“伪正常模式”?
还请大家帮助!!!
附1:CAN 配置
** Processor : MC9S12ZVH128CLQ
** Component : FreescaleCAN
** Version : Component 02.366, Driver 01.31, CPU db: 3.00.000
** Compiler : CodeWarrior HCS12Z C Compiler
** Date/Time : 2016-08-10, 15:46, # CodeGen: 5
** Abstract :
** This component "FreescaleCAN" implements a CAN serial channel.
** Settings :
** CAN channel : MSCAN0
**
** Interrupt service/event : Enabled
** Output interrupt
** Vector name : Vcan0tx
** Priority : 4
** Input interrupt
** Vector name : Vcan0rx
** Priority : 4
** Error interrupt
** Vector name : Vcan0err
** Priority : 4
** Wakeup interrupt
** Vector name : Vcan0wkup
** Priority : 4
**
** Settings :
** Rx pin : CANPHY0_RXD_to_MSCAN0_RXD
** Rx pin signal :
** Tx pin : CANPHY0_TXD_to_MSCAN0_TXD
** Tx pin Signal :
**
**
** Recieve accept. code : 0x00
** Recieve accept. mask : 0xFFFFFFFF
** Loop Mode : no
** Bus-Off Recovery : Auto
** Listen Only Mode : no
** Wakeup : Disabled
**
** Protocol
** Time segment 1 : 7
** Time segment 2 : 3
** RSJ : 1
** Samples per bit : One sample
** Time quanta per bit : 13
** Init baud rate : 100 kbit/s
**
** Initialization
** Enabled in init. code : yes
** Events enabled in init. : yes
**
** CPU clock/speed selection
** High speed mode : This component enabled
** Low speed mode : This component disabled
** Slow speed mode : This component disabled
**
** Contents :
** SetAcceptanceCode - byte CAN1_SetAcceptanceCode(dword AccCode1, dword AccCode2);
** SetAcceptanceMask - byte CAN1_SetAcceptanceMask(dword AccMask1, dword AccMask2);
** SetAcceptanceMode - byte CAN1_SetAcceptanceMode(byte Mode);
** SendFrame - byte CAN1_SendFrame(byte BufferNum, dword MessageID, byte FrameType, byte...
** ReadFrame - byte CAN1_ReadFrame(dword *MessageID, byte *FrameType, byte *FrameFormat,...
** GetStateTX - byte CAN1_GetStateTX(void);
** GetStateRX - bool CAN1_GetStateRX(void);
** GetError - byte CAN1_GetError(CAN1_TError *Err);
**
附2:CANPHY 配置
** Processor : MC9S12ZVH128CLQ
** Component : Init_CANPHY
** Version : Component 01.000, Driver 01.00, CPU db: 3.00.000
** Compiler : CodeWarrior HCS12Z C Compiler
** Date/Time : 2016-08-11, 10:36, # CodeGen: 15
** Abstract :
** This file implements the CANPHY (CANPHY0) module initialization
** according to the Peripheral Initialization settings, and
** defines interrupt service routines prototypes.
** Settings :
** Component name : CANPHY0
** Device : CANPHY0
** Settings :
** Split enable : Enabled
** Wakeup receiver : Enabled
** Physical layer slew rate : Slew rate 0
** Pins/Signals :
** Supply pin :
** Pin : VDDC
** Pin signal :
** Ground pin :
** Pin : VSSC
** Pin signal :
** CAN bus high pin :
** Pin : CANH0
** Pin signal :
** CAN bus low pin :
** Pin : CANL0
** Pin signal :
** Termination pin :
** Pin : SPLIT0
** Pin signal :
** Tx input : Enabled
** Pin : CANPHY0_TXD_to_MSCAN0_TXD
** Pin signal :
** Rx output :
** Output 0 : Enabled
** Pin : CANPHY0_RXD_to_MSCAN0_RXD
** Pin signal :
** Output 1 : Disabled
** Interrupts :
** CANPHY interrupt :
** Interrupt : Vcanphy0
** Interrupt priority : 1
** ISR Name : CANPHY0_onError
** Voltage failure Interrupt : Enabled
** Physical layer error Interrupt : Enabled
** Initialization :
** Physical layer : Enabled
** SW control value : 1
** Call Init method : yes
** Contents :
** Init - void CANPHY0_Init(void); |