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.

[参考译文] TM4C123GH6PM:在 CAN 模块编程中需要帮助

Guru**** 2440240 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/626146/tm4c123gh6pm-help-needed-in-can-module-programming

器件型号:TM4C123GH6PM
主题中讨论的其他器件:TM4C123

大家好、

我正在尝试使用 CAN 模块在2 tm4c123 launchpad 之间发送数据。

以下是接收器的代码:  

int main(){
SysCtlClockSet (SYSCTL_SYSDIV_2_5|SYSCTL_USE_PLL|SYSCTL_MAIN|SYSCTAL_XTAL_16MHz);
tCANMsgObject sMsgObjectRx;
CAN0obj_Init();sMsgObjectFlags.ui32tm_sgObjectrx


= 0x400;CANMsgMsg&sMsgObjectrx = 0xgId_sq_gId_gId=0&sq_gId_gId=0gObjectrx;


CANEnable (CAN0_BASE);

while (1){
while ((CANStatusGet (CAN0_BASE、CAN_STS_NEWDAT)& 1)= 0)
{
//
//从消息对象中读取消息。
//
CANMessageGet (CAN0_BASE、1、&sMsgObjectRx、TRUE);
}
uint8_t data = sMsgObjectRx.pui8MsgData[0];
如果(数据= 0x33)
GPIO_PORTF_DATA_R ^= 0x04;
}



void CAN0Rx_Init (void){

SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);
while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOB)){};
GPIOPinConfigure (GPIO_PB4_CAN0RX);
GPIOPinConfigure (GPIO_PB5_CAN0TX);
GPIOPinTypeCAN (GPIO_PORTB_BASE、GPIO_PIN_4|GPIO_PIN_5);


SysCtlPeripheralEnable (SYSCTL_Periph_CAN0);
while (!SysCtlPeripheralReady (SYSCTL_Periph_CAN0)){};
CANInit (CAN0_BASE);
CANBitRateSet (CAN0_BASE、SysCtlClockGet ()、50000);
CANEnable (CAN0_BASE);



}

这里是发送器代码:

int main (void){
SysCtlClockSet (SYSCTL_SYSDIV_2_5|SYSCTL_USE_PLL|SYSCTL_MAIN|SYSCTL_XTAL_16MHz);
CAN0_Init();
PORTF_Init();uSC_ui8data

= 0x33;CANMsg8uintsq0=0=iQUSTx.0=iQUSTxi20=0=iQsqiS=0=0_IUSTx.0_IUSTnipu_Insq0=0=0=0=0_Iq0=0=0_Iq0_Iq0_Iq0=0=0=u&;Iq0=0_Iq0=0_Iq0_Iq0=0&;Iq0&;Iq0&;Iq0=0&;Iq0&;Iq0&;Iq0&;Iq0












CANMessageSet (CAN0_BASE,1,&sMsgObjectTx,MSG_OBJ_TYPE_TX);
GPIO_PORTF_DATA_R ^= 0x02;
SysTick80_delay_10ms (300);

}
返回0;
}


void CAN0_Init (void){

SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);
while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOB)){}
GPIOPinConfigure (GPIO_PB4_CAN0RX);
GPIOPinConfigure (GPIO_PB5_CAN0TX);
GPIOPinTypeCAN (GPIO_PORTB_BASE、GPIO_PIN_4|GPIO_PIN_5);

SysCtlPeripheralEnable (SYSCTL_Periph_CAN0);
while (!SysCtlPeripheralReady (SYSCTL_Periph_CAN0)){}
CANInit (CAN0_BASE);
CANBitRateSet (CAN0_BASE、SysCtlClockGet ()、50000);
}

我使用板载 LED 进行切换、指示执行了传输命令。 但是、接收器不 响应。

有人可以帮助吗?  

谢谢、

斯里特

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Sarea、
    您是如何连接这两个 MCU 的? 您是否使用了收发器并正确端接了 CAN 总线?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    查尔斯

    连接到 MCP2551和 MCP2515的2个主板... 我使用一根120欧姆端接的简单导线。

    此致、

    斯里特

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="sarea Hariri"]连接到 MCP2551和 MCP2515[/引用]的2块板

    MCP2551是 NRND、因此您可能需要为收发器使用不同的芯片。

    MCP2515是一个 CAN 控制器/协议芯片、您已经在 TM4C 上使用了该芯片、并且您正在使用的 TIVAWare 代码不会驱动它。

    [引用 user="sarea Hariri"]我使用了一根120欧姆端接的简单导线。

    这可能不是问题、但在500kbd 时、我希望使用具有适当阻抗的电缆、而不仅仅是一对简单的电线。

    Robert

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Sarea、

    首先是 while ((CANStatusGet (CAN0_BASE、CAN_STS_NEWDAT)& 1)= 0)。 为什么要比较0、而不是1? 如果接收器接收到数据、则 NEWDATA 将被置位。

    请使用示波器查看发送器是否正在传输数据?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    while (1){
    while ((CANStatusGet (CAN0_BASE、CAN_STS_NEWDAT)& 1)= 0)
    {
    //
    //从消息对象中读取消息。
    //
    CANMessageGet (CAN0_BASE、1、&sMsgObjectRx、TRUE);
    }
    uint8_t data = sMsgObjectRx.pui8MsgData[0];
    如果(数据= 0x33)
    GPIO_PORTF_DATA_R ^= 0x04;
    }
    

    手动浏览此片段、CANStatusGet 始终设置为1、数据始终分配为0x33。 输出切换的速度有多快? 您认为可以看到这一点吗?

    while ((CANStatusGet (CAN0_BASE、CAN_STS_NEWDAT)& 1)= 0)
    

    我认为这项检查完全与您的预期相反。

    如果(数据= 0x33)
    GPIO_PORTF_DATA_R ^= 0x04;
    

    最后、这是一个等待发生的事故。 切勿在条件代码中使用单行、始终使用块。 相当简单的制造类型和难以发现的类型会生成有效的代码、如果使用此结构、这些代码将不会执行您所需的操作。

    Robert

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Robert、
    谢谢。 我认为我们的答复在同样的评论上相互交叉。