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.

[参考译文] EK-TM4C129EXL:CAN 总线发送、Tx 不工作

Guru**** 2455490 points
Other Parts Discussed in Thread: EK-TM4C129EXL, EK-TM4C1294XL, TPS2052, TPS2052B

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/634445/ek-tm4c129exl-can-bus-transmit-tx-is-not-working

器件型号:EK-TM4C129EXL
主题中讨论的其他器件: EK-TM4C1294XLTPS2052TPS2052B

大家好。 我对 CAN 总线协议和 TM4C 非常陌生。 我的任务是将 CAN 消息从1个 TM4C129EXL 传输到另一个 TM4C129EXL launchpad。 由于我不熟悉这一点,我需要从某个地方开始,因此我决定通过以下链接修改代码和硬件: http://ohm.ninja/tiva-c-series-can-bus-with-mcp2551/  ,并参考 C:\ti\TivaWare_C_Series-2.1.4.178\examples\peripheral\can 中的示例代码。

我已将 severel UARTprintf 添加到 void CANIntHandler (void)中、以帮助我进行调试。 我还使用了示波器来检查 CANH、CANL 和 TX、但没有输出(因此、在这篇文章中未连接示波器电容器)。 JP4和 JP5跳线采用默认配置、因为使用 CAN1代替 CAN0。 请提供帮助。

附件是我的主设备代码:

#include 
#include 
#include 

#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "inc/hw_ca.h"
#include "inc/hw_ints.h"
#include "driverlib/ca.h"
#include "driverlib/interrupt.h"
#define "driverlib/driverlib.idio








#define "driverlib/voltex"#define "driveript.mdio.ide"#include "#define "#define "#define "driverlib/volatile.tex"#define "#define "driverlib/voltine.tine/volatile r.ip.mdio.mdio.ide"#define #include "#"#define "#"#"#define "#"#
//以 Hz

空延迟为单位的时钟速度(无符号 int 毫秒){
SysCtlDelay ((sysClock / 3)*(毫秒/ 1000.0f));
}

// CAN 中断处理程序
void CANIntHandler (void){

unsigned long status = CANIntStatus (CAN1_base、CAN_INT_STS_CAUST);//读取中断状态 UARTF("CANIntHandler (
status_status= CANINTn

)= CANIntStatus_CONTROLLE_INT_CANINTn);CANINTn = CANINTn (CANNOST_CONTROLLET = CANNOT_INT_CANNOT_CANINTn);// CANINTn = CANINT //读回错误位,对它们执行什么操作?
errFlag = 1;
UARTprintf ("triggered1\n");
}否则(status = 1){//消息对象1
CANIntClear (CAN1_base、1);//清除中断
errFlag = 0;//清除任何错误标志
UARTprintf ("tggered2\n");
}否则{"\n"uARTprintf







(")(n"n)、不会发生意外的错误;} // CAN 报文对象
unsigned int msgData;//报文数据长度为四个字节,我们可以将其分配为 int32
unsigned char * msgDataPtr =(unsigned char *)&msgData;//创建指向 msgData 的指针,以便我们可以访问单个字节

//从 PLL 以120MHz 运行。
sysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)、120000000);

//设置调试 UART
SysCtl_Periph_GPIOA;//配置 GPIO_PINT_0_0_GPIO0_GPIO_100;//配置 UART 外设




UARTStdioConfig (0、115200、sysClock);// 115200波特

//设置 CAN1
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);//启用 CAN1 GPIO 外设
GPIOPinConfigure (GPIO_PB0_CAN1RX);
GPIOCtlConfigure (GPIO_PB1_CAN1TX);//启用 GPIOPIN_PIN_0;
GPIO_PEPT1_GPIO_PIN_PIN_0
;GPIO_PEPT1_GPIO_PIN_PIN_0
CANInit (CAN1_base);
CANBitRateSet (CAN1_base、sysClock、500000);
CANIntRegister (CAN1_base、 CANIntHandler);//使用动态矢量表分配
CANIntEnable (CAN1_base、CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS);
IntEnable (INT_CAN1);
CANEnable (CAN1_base);

//设置 msg 对象
msgData = 0;
CAN.u32msg MsgID = 1;.u32msgmsg

= 32u_i_msg = 0;i32u_msgmsg_msg = 32u_isg = 32u_msgmsg = 0;i_i_i_msg_msg = 32u_msg = 32u_it_msg = 32u_msg

MSG.pui8MsgData = msgDataPtr;

unsigned int t = 0;//循环计数
器浮点频率= 0.3;//频率缩放

器 while (1){

//设置下一个颜色(缩放 sinf (0-1)到0-255)
msgDataPtr[0]=(0.5 + 0.5*ff (t
pfr)+ 0xf (+0.5*f))*12*/f (+0.5*f)*/f (0xfr)=*/f (+0.5*/f)*/f (+0.5*f)*/f (+0.5*/f) // 120度相位差
msgDataPtr[2]=(0.5 + 0.5*sinf (t*freq +(4*PI/3)))* 0xFF;// 240度相位差
msgDataPtr[3]= 128;// 50%强度

UARTprintf ("发送颜色\tr:%d\TG:%d\Tb\gDataPtr:%1);msgDataSet[g1、CANMessage1
、CANq1、CANDataType &tbt (bt) //作为 msg 对象发送1

延迟(100);//如果

(errFlag)则等待100ms{//检查错误
UARTprintf ("CAN 总线错误\n");
}

t++;//溢出正常
}

返回0;
}

随附的是我的电路图:

连接的是终端的输出:

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

    [引用 user="Gowtham">目前没有终端输出。 由于资源有限、我正在研究一种将 RS232电缆用于 UART 的方法(终端[/报价]

    您好、Gowtham、

    根据原理 图注释 CAN0 JP4/5 (||) 只需在   软件配置中将 UART0更改为 UART2、ICDI 将  像以前 一样通过  PC 上的 USB 虚拟 COM 端口发送 printf()数据。

    因此、TXD 上的示波器显示3V 似乎好于5V、您想知道  是否在软件中为 输入 WPD 配置了 PD6以使 U4 EN2 保持禁用 (Target_VBUS)、并在 TP4上关闭?   我将 PD6 作为(输出) WPD、它的工作 方式仍然很奇怪、除非 配置为 数字输入 、除非 输入 可以配置为开漏、这似乎不合理。  想知道它们是否意味 着 PD6 是输出、输入错误。

    Charles 可能对  PD6引脚方向有一些想法、 似乎认为 只能配置一个输出方向开漏。  似乎还记得 问题 OTG 端口 USB 设备模式 PD6 配置 的输入方向。  之后 将 PD6变为 GPIO 输出、并确保 USB0PEN (PD6)未在器件模式下配置。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    BTW 您将上述论坛主题帖标记为已解决、是因为错误。 如果出错、您可以删除"已应答"按钮。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [报价用户="BP101"]如果出错,可以删除“已应答”按钮

    我的、"不是很好-可以恢复(尝试) AMI"-也许"改变心"已经证明(过去)是真实的-但又增加了当今(长期)的另一个过去/受重视的论坛功能"受害"-由声称(但有很大争议)的论坛"改变等级?"   (远远没有声称的升级!)

    当员工上次 检查(一周或一周后)是否有能力"反转错误的"已解决"-已通过 dodo bird (以及关键的类似)按钮...

    一旦解决(甚至错误地解决)-始终解决(即使是-尤其是如果)此类"解决"证明不需要和/或错误!

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

    您好、BP1、
    是的。 这是错误的。 我无法删除"已应答"按钮。

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

    [引用 user="BP101"]

    根据原理 图注释 CAN0 JP4/5 (||) 只需在   软件配置中将 UART0更改为 UART2、ICDI 将  像以前 一样通过  PC 上的 USB 虚拟 COM 端口发送 printf()数据。

    [/报价]

    大家好,我已经为 UART2尝试了此函数,但这似乎不起作用。

    void
    InitConsole (void)
    {
    
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
    
    GPIOPinConfigure (GPIO_PA6_U2RX);
    GPIOPinConfigure (GPIO_PA7_U2TX);
    
    SysCtlPeripheralEnable (SYSCTL_Periph_UART2);
    
    UARTClockSourceSet (UART2_base、UART_CLOCK_PIOSC);
    
    GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_6 | GPIO_PIN_7);
    
    UARTStdioConfig (2、115200、16000000);
    } 

    或者,我应该仍然使用 GPIOPinConfigure (GPIO_PA0_U0RX);和 GPIOPinConfigure (GPIO_PA1_U0TX);?

    但 Charles 确实提到过、我需要用于 GPIO_PA6_U2RX 和 GPIO_PA7_U2TX (UART2)的 USB 转 UART 转换器、为此我尝试使用 RS232电缆。 也不工作。

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

    e2e.ti.com/.../can0_5F00_receive_5F00_vendor.cHiCharles & All、

    发送代码在 CAN0上似乎工作正常。 是否有方法检查接收代码是否正常工作(不连接收发器)?

    P.S:由于 TJA1050收发器具有 TTL 兼容性、因此我还计划迁移到该收发器。

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

    您好、Gowtham、

    原理图显示 UART2的 PD4、PD5为 ICDI。  Booster  Pack X6-9、X6-11 = MCU PA0、PA1上分别声明 CAN0 TXD/RXD。   当 JP4/5 (||)时、这似乎表明 CAN0不在 X11接头上、否则原理图注释 只指出 BP 引脚是 CAN0、而不是提及 X11接头?

    请务必将 (startup.ccs.c)中的 UART0更改为 UART2中断矢量、否则 UART2 (可能)不会按预期运行。

    BTW: 了解 一下采用 SOIC 8封装的 TI 3V3供电收发   器 SN65HVD23x、它似乎是大多数 CAN 网络的理想选择。 您可以将其焊接到   纽瓦克通过 MCM 销售的.1"间距 PCB 上。  http://www.newark.com/aries/lcqt-soic8-8/ic-adapter-8-soic-to-dip-2-54mm/dp/47Y8080?ost=LCQT-SOIC8-8&scope=partnumberlookahead&exaMfpn=true&searchref=searchlookahead&iscrfnonsku=false&ddkey=http%3Aen-US%2FElement14_US%2Fw%2Fsearch

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

    您好、BP101、Gowtham、

     我尝试了 TivaWare 示例、其中一个 LP 板运行 simple_TX 示例、另一个板运行 simple_Rx 示例。 两个 CAN0模块均使用来自 X6 BoosterPack 接头的 PA0和 PA1进行连接。 这对我很有影响。 请注意、我根本没有使用收发器。 我改用二极管。  对于短距离 CAN 总线通信、这是可以的、我的目的只是为了演示示这些示例的工作原理。

     看第一张图片、您会看到 TX (黄色)和 RX (青色)。 除了确认位、RX 几乎跟在 TX 之后。 ACK 字段是一个2位字段。 正如我在之前的帖子中提到的、我说我的数据只是4个字节的0x555555。 你会看到一群0101… 转换之后是15位 CRC 和两位 ACK、然后是 IFS。

     第二张图片是放大视图、用于显示接收器节点回复的 ACK 字段。

     第三张图片是我如何使用 BoosterPack 连接器连接它们。  

     

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

    这是另一张图片、用于显示接收器节点接收到的内容。

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

    太棒了...我会尝试这个设置来测试我的代码。 但关于 UART 打印件,您是否按照 BP101的建议对代码进行了任何更改? 如果 UART 功能与 BP101的建议不同,您能否共享该功能? 这些齐纳二极管是吗?


    [引用 user="BP101"]

    原理图显示 UART2的 PD4、PD5为 ICDI。 Booster Pack X6-9、X6-11 = MCU PA0、PA1上分别声明 CAN0 TXD/RXD。 当 JP4/5 (||)时、这似乎表明 CAN0不在 X11接头上、否则原理图注释只指出 BP 引脚是 CAN0、而不是提及 X11接头?

    请务必将(startup.ccs.c)中的 UART0更改为 UART2中断矢量、否则 UART2 (可能)不会按预期运行。

    [/报价]

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的,您需要修改 InitConsole()函数。 我刚刚从 UART0更改为 UART2、在我看到的每个 PA0/PA1中、我都更改为 PD4/PD5。 二极管是一个简单的整流二极管。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    太棒了。 我将尝试您的设置以及我的代码。 非常感谢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、Charles 和大家、

    使用 PD4/PD5时、UART2似乎工作正常。 我对您的设置有一些疑问。

    1) 1)您的电阻器是否为3.3K 欧姆? 我无法很清楚地看到颜色代码。

    2) 2)它连接到 GND 还是3.3V 线路? 我认为它是3.3V、但只想对此进行确认。 (electronics.stackexchange.com/.../is-a-can-enabled-microcontroller-sufficient-to-drive-a-can-bus)

    3)我 需要将2个 LaunchPad 的 GND 短接、对吧?

    谢谢。

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

    [引用用户="Gowtham"]

    1) 1)您的电阻器是否为3.3K 欧姆? 我无法很清楚地看到颜色代码。

    [/报价]

    是的。

    [引用用户="Gowtham"]

    2) 2)它连接到 GND 还是3.3V 线路? 我认为它是3.3V、但只想对此进行确认。 (electronics.stackexchange.com/.../is-a-can-enabled-microcontroller-sufficient-to-drive-a-can-bus)

    [/报价]

    请参阅下面的原理图。 我使用3.3V 而不是5V。 其他所有内容都是相同的。

    [引用用户="Gowtham"]

    3)我 需要将2个 LaunchPad 的 GND 短接、对吧?

    [/报价]

    是的。

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

    已尝试设置、但仍然没有成功。 因此、它可能是我的接收代码。 我的接收代码如下所示。

    显著变化:

    1)// sCANMessage.ui32MsgLen =4

    2)//使用 uart2

    3)// Clk 为25000000,比特率为500k 保持默认值。

    我只想知道我的接收是否适用于您的发送代码(CAN0_Withning_UART0.c)。 然后、我可以详细了解我的硬件。 CAN0外部回送对于我的两个 LaunchPad 都可以正常工作。

    //
    //
    //// simple_rx.c -演示简单 CAN 消息接收的示例。
    //
    //版权所有(c) 2010-2017 Texas Instruments Incorporated。 保留所有权利。
    //软件许可协议
    //
    以源代码和二进制形式重新分发和使用,无论是否
    进行//修改,只要
    满足以下条件//:
    //
    重新分发源代码必须保留上述版权
    //声明、此条件列表和以下免责声明。
    //
    //二进制形式的再发行必须复制上述版权
    //声明、此条件列表和//
    
    分发随附的//文档和/或其他材料中的以下免责声明。
    ////
    未经
    
    事先书面许可,不能使用德州仪器公司的名称或//其贡献者的名称来认可或推广源自此软件的产品//。
    ////
    本软件由版权所有者和贡献者提供
    //“按原样”,不
    
    承认任何明示或暗示的保证,包括但不限于//适销性和对//特定用途适用性的暗示保证。 在任何情况下、版权
    //所有者或贡献者都不对任何直接、间接、偶然、
    //特殊、模范、 或相应的损害(包括但不
    限于采购替代产品或服务;丧失使用、
    //数据或利润; 或业务中断)、无论
    
    出于何种原因使用
    本软件(即使被告知可能会造成此类损坏)、还是出于任何原因而产生的任何//责任理论(无论是合同、严格责任还是侵权行为)//(包括疏忽或其他)。
    //
    //这是 Tiva 固件开发包的修订版2.1.4.178的一部分。
    ////
    *****************
    
    #include 
    #include 
    #include "inc/hw_ca.h"
    #include "include/hw_ints.h"
    #include "inc/hw_memmap.h"
    #include "inc/hw_types.h"
    #include "driverlib/ca.h"
    #include "driverlib/gpio.h"
    #include "driverlib/interrupt.h"
    #include "driverlib/driverlib.idio.h"#include "driverlib/driverlib"#include "driverlib.udio.idio.h
    
    
    
    
    
    //
    //! \addtogroup CAN_examples_list
    //! 

    简单 CAN RX (simple_Rx)

    //! //! 此示例显示了 CAN 的基本设置、以便接收消息 //! 总线的电流。 CAN 外设配置为接收消息 //! 使用任何 CAN ID、然后将消息内容打印到控制台。 //! //! 此示例使用以下外设和 I/O 信号。 您必须 //! 查看这些内容并根据您自己的董事会需要进行更改: //! - CAN0外设 //! - GPIO 端口 B 外设(用于 CAN0引脚) //! - CAN0RX - PB4 //! - CAN0TX - PB5 //! //! 以下 UART 信号仅配置为显示控制台 //! 消息。 CAN 的运行不需要这些参数。 //! - GPIO 端口 A 外设(用于 UART0引脚) //! - UART0RX - PA0 //! - UART0TX - PA1 //! //! 此示例使用以下中断处理程序。 要使用此示例 //! 在您自己的应用程序中、您必须将这些中断处理程序添加到 您的//! 矢量表。 //! - INT_CAN0 - CANIntHandler // /********* // // //跟踪 RX 中断次数 的计数器//发生,该计数器应与接收到的消息数匹配。 //// ***************** 易失性 uint32_t g_ui32MsgCount = 0; //********* // //中断处理程序的标志,指示已收到消息。 //// ***************** 易失性 bool g_BRXFlag = 0; //********* // //指示发生了一些接收错误的标志。 //// ***************** volatile bool g_BErrFlag = 0; //********* // //此函数将 UART0设置为用于控制台,以便 在示例运行时显示信息//。 //// ***************** void InitConsole (void) { //PD4/PD5 //启用用于 UART0引脚的 GPIO 端口 A。 // TODO:将其更改为您正在使用的 GPIO 端口。 // SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD); // //为端口 A0和 A1上的 UART0功能配置引脚复用。 //如果您的器件不支持引脚复用、则无需执行此步骤。 // TODO:更改此选项以选择您正在使用的端口/引脚。 // GPIOPinConfigure (GPIO_PD4_U2RX); GPIOPinConfigure (GPIO_PD5_U2TX); // //启用 UART0以便我们可以配置时钟。 // SysCtlPeripheralEnable (SYSCTL_Periph_UART2); // //使用内部16MHz 振荡器作为 UART 时钟源。 // UARTClockSourceSet (UART2_base、UART_CLOCK_PIOSC); // //为这些引脚选择替代(UART)功能。 // TODO:更改此选项以选择您正在使用的端口/引脚。 // GPIOPinTypeUART (GPIO_PORTD_base、GPIO_PIN_4 | GPIO_PIN_5); // //初始化控制台 I/O 的 UART // UARTStdioConfig (2、115200、16000000); } //********* // //此函数是 CAN 外设的中断处理程序。 它会检查 //中断原因,并对 所有已接收到的消息进行计数。 //// ***************** void CANIntHandler (void) { uint32_t ui32Status; // //读取 CAN 中断状态以查找中断原因 // ui32Status = CANIntStatus (CAN0_BASE、CAN_INT_STS_CAUST); // //如果原因是控制器状态中断,则获取状态 // if (ui32Status = CAN_INT_INTID_STATUS) { // //读取控制器状态。 这将返回状态字段 //可以指示各种错误的错误位。 错误处理 //本示例中不是为了简单起见。 请参阅 // API 文档,了解有关错误状态位的详细信息。 //读取此状态的操作将清除中断。 // ui32Status = CANStatusGet (CAN0_BASE、CAN_STS_CONTROL); // //设置一个标志来指示可能发生的某些错误。 // G_bErrFlag = 1; } // //检查原因是否是我们正在使用的消息对象1 //接收消息。 // 否则、如果(ui32Status = 1) { // //到达这一点意味着 RX 中断发生在上 //消息对象1,消息接收完成。 清除 //消息目标中断。 // CANIntClear (CAN0_BASE、1); // //递增计数器以跟踪已有多少消息 //已收到。 在实际应用中、这可用于将标志设置为 //指示何时接收到消息。 // G_ui32MsgCount++; // //设置标志以指示接收到的消息正暂挂。 // G_bRXFlag = 1; // //由于接收到消息,因此清除所有错误标志。 // G_bErrFlag = 0; } // //否则,发生意外导致中断的情况。 这应该是 //永远不会发生。 // 其他 { // //可以在此处执行伪中断处理。 // } UARTprintf ("调试:触发\n"); } //********* // //配置 CAN 并输入一个循环来接收 CAN 消息。 //// ***************** int main (void) { #if defined (target_IS_TM4C129_RA0)|| \ 已定义(TARGET_IS_TM4C129_RA1)|| \ 已定义(TARGET_IS_TM4C129_RA2) uint32_t ui32SysClock; #endif tCANMsgObject sCANMessage; uint8_t pui8MsgData[8]; // //将时钟设置为直接从外部晶振/振荡器运行。 // TODO:必须更改 SYSCTL_XTAL_VALUE 以匹配的值 //您的板上使用的晶体。 // #if defined (target_IS_TM4C129_RA0)|| \ 已定义(TARGET_IS_TM4C129_RA1)|| \ 已定义(TARGET_IS_TM4C129_RA2) ui32SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_MAIN | SYSCTL_USE_OSC) ,25000000); #else SysCtlClockSet (SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHz); #endif // //设置用于显示消息的串行控制台。 这是 //仅针对此示例程序,CAN 操作不需要。 // InitConsole(); UARTprintf ("调试:检查控制台\n"); // //对于此示例、CAN0与端口 B4和 B5上的 RX 和 TX 引脚一起使用。 //您使用的实际端口和引脚可能有所不同,请参阅 //数据表以了解更多信息。 // GPIO 端口 B 需要启用、以便可以使用这些引脚。 // TODO:将其更改为您正在使用的 GPIO 端口 // SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA); // //配置 GPIO 引脚复用以选择这些引脚的 CAN0功能。 //此步骤选择可用于这些引脚的替代功能。 //如果您的器件支持 GPIO 引脚功能多路复用、这是必需的。 //请查阅数据表以查看每个引脚分配的函数。 // TODO:更改此选项以选择您正在使用的端口/引脚 // GPIOPinConfigure (GPIO_PA0_CAN0RX); GPIOPinConfigure (GPIO_PA1_CAN0TX); // //启用 GPIO 引脚上的复用功能。 以上步骤选择 //可用的备用功能。 此步骤实际上启用 //这些引脚的替代功能、而不是 GPIO。 //待办事项:更改此项以匹配您正在使用的端口/引脚 // GPIOPinTypeCAN (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1); // //已为 CAN 设置 GPIO 端口和引脚。 CAN 外设 //必须启用。 // SysCtlPeripheralEnable (SYSCTL_Periph_CAN0); // //初始化 CAN 控制器 // CANInit (CAN0_BASE); // //设置 CAN 总线的比特率。 此函数设置 CAN 针对标称配置的//总线时序。 您可以实现更多控制 //使用函数 CANBitTimingSet()代替 CAN 总线时序 //如果需要。 //在此示例中、CAN 总线设置为500kHz。 在以下函数中、 // SysCtlClockGet ()或 ui32SysClock 的调用被用来确定 //用于为 CAN 外设计时的时钟速率。 这是可以的 //如果您知道系统时钟的值,则替换为固定值, //保存额外的函数调用。 对于某些器件、CAN 外设是 //使用固定的8MHz 时钟进行计时,而不管在哪种情况下是系统时钟 //对 SysCtlClockGet()或 ui32SysClock 的调用应替换为 // 80000。 有关 CAN 的更多信息、请参阅数据表 //外设时钟。 // #if defined (target_IS_TM4C129_RA0)|| \ 已定义(TARGET_IS_TM4C129_RA1)|| \ 已定义(TARGET_IS_TM4C129_RA2) CANBitRateSet (CAN0_BASE、ui32SysClock、50000); #else CANBitRateSet (CAN0_BASE、SysCtlClockGet ()、50000); #endif // //在 CAN 外设上启用中断。 此示例使用静态 //分配中断处理程序,表示处理程序的名称 //位于启动代码的矢量表中。 如果您想使用动态的 //分配矢量表,然后还必须调用 CANIntRegister() //此处。 // // CANIntRegister (CAN0_BASE、CANIntHandler);// if using dynamic vectors // CANIntEnable (CAN0_BASE、CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS); // //在处理器(NVIC)上启用 CAN 中断。 // IntEnable (INT_CAN0); // //启用 CAN 以进行操作。 // CANEnable (CAN0_BASE); // //初始化用于接收 CAN 消息的消息对象 //任何 CAN ID。 为了接收任何 CAN ID、ID 和掩码必须同时存在 //设置为0,并启用 ID 过滤器。 // sCANMessage.ui32MsgID = 0; sCANMessage.ui32MsgIDMask = 0; sCANMessage.ui32Flags = MSG_OBJ_RX_INT_ENABLE | MSG_OBJ_USE_ID_FILTER; sCANMessage.ui32MsgLen = 4; // //现在将消息对象加载到 CAN 外设中。 加载后 // CAN 将在总线上接收任何消息,并将发生中断。 //使用消息对象1接收消息(与不同) //此示例中可以是任何值的 CAN ID)。 // CANMessageSet (CAN0_BASE、1、&sCANMessage、MSG_OBJ_TYPE_RX); // //输入循环以处理收到的消息。 该循环仅检查一个标志 //由中断处理程序设置,如果该位置位,则读取 //消息并显示内容。 这不是一种稳健的方法 //处理传入的 CAN 数据,并且一次只能处理一条消息。 //如果多条消息一起接收,则会收到一些消息 //可能被丢弃。 在实际应用中、应使用其他一些方法 //对收到的消息进行排队,以确保它们不会丢失。 您 //也可以使用 CAN FIFO 模式,允许消息为 //在处理前进行缓冲。 // for (;;) { unsigned int uIdx; // //如果该标志被置位、则表示发生了 RX 中断、然后 //有一条消息可以从 CAN 读取 // if (g_bRXFlag) { // //重复使用之前用于配置的同一消息对象 //用于接收消息的 CAN。 用于存储的缓冲器 //还必须提供接收到的数据,所以设置缓冲区指针 //在消息对象中。 // sCANMessage.pui8MsgData = pui8MsgData; // //从 CAN 读取消息。 使用1号报文对象 //(与 CAN ID 不相同)。 中断清除 //标志未设置、因为中已清除此中断 //中断处理程序。 // CANMessageGet (CAN0_BASE、1、&sCANMessage、0); // //清除挂起的消息标志,以便中断处理程序可以 //在下一条消息到达时再次设置它。 // G_bRXFlag = 0; // //检查是否有某些消息的指示 //丢失。 // if (sCANMessage.ui32Flags & MSG_OBJ_DATA_LOST) { UARTprintf ("检测到 CAN 消息丢失\n"); } // //打印接收到的消息的内容。 // UARTprintf ("Msg ID=0x%08X len=%u data=0x"、 sCANMessage.ui32MsgID、sCANMessage.ui32MsgLen); for (uIdx = 0;uIdx < sCANMessage.ui32MsgLen;uIdx++) { UARTprintf ("%02x "、pui8MsgData[uIdx]); } UARTprintf ("total count=%u\n"、g_ui32MsgCount); } } // //返回无错误 // 返回(0); }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    在您的第339行中、您没有动态注册中断处理程序。 我希望您已在 startup_ccs.c 中静态注册了 CANIntHandler、对吧?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    最后。 它在工作。 非常感谢 Charles & BP101。 现在、我可以完全专注于我的硬件设置 (收发器等)、而无需怀疑代码。  还有一个问题、在我看来、接收似乎不是连续的。 似乎每次都需要按下 Launchpad (发送侧)的复位按钮才能进行传输。 这不是正确的预期吗?

    已连接示波器电容器和端子输出。

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

    很高兴您取得了良好的进展。

    您的发送器是否处于 while 环路中以阻止传输数据?

    在示波器中、您是否可以更改时间刻度、以便看到持续传输的数据包?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    也许我不理解您的问题。 在接收器侧的示波器中、您显示的计数为1..8、并继续。 您的意思是接收不连续?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Charles、

    您如何知道第339行代码中没有行号。 还想知道为什么第2个 ACK 脉冲 比第1个脉冲更宽。  要指出的是、状态寄存器比较代码不会被(&)定界符屏蔽。  

    当   REG2中的多个位可能发生转换时、(&)屏蔽返回状态也许更重要、 通过(=)测试 INTID 状态可能不会产生 预期结果。  

    //
    //读取 CAN 中断状态以查找中断原因
    //
    ui32Status = CANIntStatus (CAN0_BASE、CAN_INT_STS_CAUST);
    
    //
    //如果原因是控制器状态中断,则获取状态
    //
    if (ui32Status //=
    和 CAN_INT_INTID_STATUS) 

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

    您好 BP101:

     我可以看到行号。 今天早上、我将截取 Godtham 发布的代码。

    我认为左侧的图像是发送器的 TX 引脚、右侧的图像是发送器的 RX 引脚。 RX 引脚将看到接收器生成的2位 ACK。 TX 引脚将不会看到它、因为它处于隐性状态。  

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

    好的、注意到 AM POST 中缺少绿色代码(列表)、您必须是附加的文件代码行号。 我们无法将网页滚动回当前的上一帖子之外、以查看左箭头后面的内容、尤其是在编辑模式下。 TI 网页浏览器很难在内部工作、因为我们只能在编辑模式下看到第1个帖子。 Face Book 具有正确的创意页面滚动 Java 处理、需要 MZ 来访问 TI。

    检查 INTSTS REG2 (CAN_INT_STS_CAUST)似乎会清除 REG5 INTID +位15 INT 状态。

    导致中断(0x0-0x20)位15 (0x8000h)中断挂起的方式 REG 5 CANINT 消息对象 ID。 INTID 字段已通过第一次将 STS REG2读取到 ui32status 变量中来清除、并且在(IF)根据 ui32status 测试固定值时不指示挂起的中断。 似乎我们应该首先将 REG5 CANINT 读取到 ui32IntStatus、然后通过清除 REG5中的 IRQ +消息 ID 将 REG2 INSTS 读取到 ui32IntStsCa3。 似乎验证原因 REG2与验证实际挂起 IRQ 的 REG5消息 ID 不同。

    好奇是否会导致 REG2在 REG5将位15设置为 IRQ 挂起之前始终更新?

    寄存器5:CAN 中断寄存器(CANINT)、偏移量0x010
    该寄存器指示中断源。

    如果多个中断挂起、CAN 中断(CANINT)寄存器将指向挂起的中断
    优先级最高、而不考虑中断发生的顺序。 中断保持
    挂起、直到 CPU 将其清除。 如果 INTID 字段不是0x0000 (默认值)、且 IE 位在中
    CANCTL 寄存器被置位、则该中断有效。 中断线在 INTID 之前保持有效
    通过读取 CANSTS 寄存器或直到 CANCTL 寄存器中的 IE 位清零来清零该域。

    注意:读取 CAN 状态(CANSTS)寄存器将清除 CAN 中断(CANINT)寄存器、
    是否挂起。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Yep 已验证它是一个灰显的发布代码、其中列出了11-13 9:31am、未显示行号。

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

    [引用 user="BP101"]是的,它已验证它是一个灰显的发布代码,其中列出了11-13 9:31am,没有显示行号。

    我看到的内容与 BP 相同、没有行号或语法突出显示、只是一个包含代码的灰色框。

    Robert

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

    [引用 user="Robert Adsett"]我看到的内容与 BP 相同,没有行号或语法突出显示[/quot]

    奇怪     的是、当从第1个帖子行的"显示"输入该线程时、直到单击右箭头、在其他页面上变为灰色且没有行的"。 除了上面复制的代码 Charles 之外、其他代码 显示 了第#行和绿色 突出显示、IE12..

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、BP101、Robert、
    现在我也看不到行号、这有点奇怪。 但我很确信昨天我看到了行号。 我不知道发生了什么。 我试过 IE、Chrome 和 Firefox。 在 Firefox 中、即使第一个帖子的代码中也有灰色框。 在 IE 和 Chrome 中、昨天的代码显示在白色框中、但 Firefox 将显示在灰色框中。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    完全正确。 CANMessageSet 位于 while (1)循环内。 但在第一次传输后、传输似乎会中断(计数=1)。 现在、当我按下 launchpad 的 RESET 按钮时、程序将重新启动并再次传输(count =2)。 然后、我必须反复按重置按钮才能发送。 我不认为这是预料之中的。 对吧?

    一些观察结果:

    1) 1)不在 Tx 侧触发 ISR

    2) 2)每次在 RX 端成功发送 ISR 都会被触发两次

    我还在发送端对 TX 执行了外部回送测试。 似乎存在连续传输(来自示波器电容器)。 但是、ISR 不是三态的。 我不认为这是预料之中的。 如果我错了、请纠正我的问题。 还随附了以下代码:

    e2e.ti.com/.../rx.c

    e2e.ti.com/.../tx.c

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

    在您所附的 TX.c 代码中,您将 CANIntRegister()注释掉。

      //

      //在 CAN 外设上启用中断。  此示例使用静态

      //分配中断处理程序,表示处理程序的名称

      //位于启动代码的矢量表中。  如果您想使用动态的

      //分配矢量表,然后还必须调用 CANIntRegister()

      //此处。

      //

      // CANIntRegister (CAN0_BASE、CANIntHandler);// if using dynamic vectors

      //

      CANIntEnable (CAN0_BASE、CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS);

    如果您未通过取消注释上面显示的 CANIntRegister 动态注册中断处理程序、则需要在 startup_ccs.c 中静态声明中断处理程序 请参阅下面 的 CANIntRegister 声明。  您需要执行一个或另一个(动态或静态)  

    //
    //
    //转发默认故障处理程序的声明。
    ////
    *****************
    void ResetISR (void);
    static void NmiSR (void);
    static void FaultISR (void);
    static void IntDefaultHandler (void);
    static void CANIntHandler (void);
    
    
    //
    //
    //
    启动//处理器时要调用的复位处理程序的外部声明
    //
    *********
    extern void _c_int00 (void);
    
    //*********
    //
    //标记栈顶的链接器变量。
    ////
    *****************
    extern uint32_t __stack_top;
    
    //*********
    //
    //矢量表。 请注意、必须在这个上放置适当的结构、
    以//确保它在物理地址0x0000.0000处结束、或者
    在//程序的开头(如果位于0以外的起始地址)结束。
    ////
    *****************
    #pragma DATA_SECTION (g_pfnVectors、".intvecs")
    void (* const g_pfnVectors [])(void)=
    {
    (void (*)(void)((uint32_t)&_stack_top)、
    //初始堆栈指针
    ResetISR、 //重置处理程序
    NmiSR、 // NMI 处理程序
    FaultISR、 //硬故障处理程序
    IntDefaultHandler、 // MPU 故障处理程序
    IntDefaultHandler、 //总线故障处理程序
    IntDefaultHandler、 //用法故障处理程序
    0、 //保留
    0、 //保留
    0、 //保留
    0、 //保留
    IntDefaultHandler、 // SVCall 处理程序
    IntDefaultHandler、 //调试监视器处理程序
    0、 //保留
    IntDefaultHandler、 // PendSV 处理程序
    IntDefaultHandler、 // SysTick 处理程序
    IntDefaultHandler、 // GPIO 端口 A
    IntDefaultHandler、 // GPIO 端口 B
    IntDefaultHandler、 // GPIO 端口 C
    IntDefaultHandler、 // GPIO 端口 D
    IntDefaultHandler、 // GPIO 端口 E
    IntDefaultHandler、 // UART0 Rx 和 Tx
    IntDefaultHandler、 // UART1 Rx 和 Tx
    IntDefaultHandler、 // SSI0 Rx 和 Tx
    IntDefaultHandler、 // I2C0主机和从机
    IntDefaultHandler、 // PWM 故障
    IntDefaultHandler、 // PWM 发生器0
    IntDefaultHandler、 // PWM 发生器1
    IntDefaultHandler、 // PWM 发生器2.
    IntDefaultHandler、 //正交编码器0
    IntDefaultHandler、 // ADC 序列0
    IntDefaultHandler、 // ADC 序列1
    IntDefaultHandler、 // ADC 序列2.
    IntDefaultHandler、 // ADC 序列3.
    IntDefaultHandler、 //看门狗计时器
    IntDefaultHandler、 // Timer 0子计时器 A
    IntDefaultHandler、 // Timer 0子计时器 B
    IntDefaultHandler、 //计时器1子计时器 A
    IntDefaultHandler、 //计时器1子计时器 B
    IntDefaultHandler、 //计时器2子计时器 A
    IntDefaultHandler、 //计时器2子计时器 B
    IntDefaultHandler、 //模拟比较器0
    IntDefaultHandler、 //模拟比较器1
    IntDefaultHandler、 //模拟比较器2.
    IntDefaultHandler、 //系统控制(PLL、OSC、BO)
    IntDefaultHandler、 //闪存控制
    IntDefaultHandler、 // GPIO 端口 F
    IntDefaultHandler、 // GPIO 端口 G
    IntDefaultHandler、 // GPIO 端口 H
    IntDefaultHandler、 // UART2 Rx 和 Tx
    IntDefaultHandler、 // SSI1 Rx 和 Tx
    IntDefaultHandler、 //计时器3子计时器 A
    IntDefaultHandler、 //计时器3子计时器 B
    IntDefaultHandler、 // I2C1主从
    CANIntHandler、 // CAN0
    IntDefaultHandler、 // CAN1
    IntDefaultHandler、 //以太网
    IntDefaultHandler、 //休眠
    IntDefaultHandler、 // USB0
    IntDefaultHandler、 // PWM 发生器3.
    IntDefaultHandler、 // uDMA 软件传输
    IntDefaultHandler、 // uDMA 错误
    IntDefaultHandler、 // ADC1序列0
    IntDefaultHandler、 // ADC1序列1
    IntDefaultHandler、 // ADC1序列2.
    IntDefaultHandler、 // ADC1序列3.
    IntDefaultHandler、 //外部总线接口0
    IntDefaultHandler、 // GPIO 端口 J
    IntDefaultHandler、 // GPIO 端口 K
    IntDefaultHandler、 // GPIO 端口 L
    IntDefaultHandler、 // SSI2 Rx 和 Tx
    IntDefaultHandler、 // SSI3 Rx 和 Tx
    IntDefaultHandler、 // UART3 Rx 和 Tx
    IntDefaultHandler、 // UART4 Rx 和 Tx
    IntDefaultHandler、 // UART5 Rx 和 Tx
    IntDefaultHandler、 // UART6 Rx 和 Tx
    IntDefaultHandler、 // UART7 Rx 和 Tx
    IntDefaultHandler、 // I2C2主设备和从设备
    IntDefaultHandler、 // I2C3主设备和从设备
    IntDefaultHandler、 //计时器4子计时器 A
    IntDefaultHandler、 //计时器4子计时器 B
    IntDefaultHandler、 //计时器5子计时器 A
    IntDefaultHandler、 //计时器5子计时器 B
    IntDefaultHandler、 // FPU
    0、 //保留
    0、 //保留
    IntDefaultHandler、 // I2C4主设备和从设备
    IntDefaultHandler、 // I2C5主设备和从设备
    IntDefaultHandler、 // GPIO 端口 M
    IntDefaultHandler、 // GPIO 端口 N
    0、 //保留
    IntDefaultHandler、 //改动
    IntDefaultHandler、 // GPIO 端口 P (摘要或 P0)
    IntDefaultHandler、 // GPIO 端口 P1
    IntDefaultHandler、 // GPIO 端口 P2
    IntDefaultHandler、 // GPIO 端口 P3
    IntDefaultHandler、 // GPIO 端口 P4
    IntDefaultHandler、 // GPIO 端口 P5
    IntDefaultHandler、 // GPIO 端口 P6
    IntDefaultHandler、 // GPIO 端口 P7
    IntDefaultHandler、 // GPIO 端口 Q (摘要或 Q0)
    IntDefaultHandler、 // GPIO 端口 Q1
    IntDefaultHandler、 // GPIO 端口 Q2
    IntDefaultHandler、 // GPIO 端口 Q3
    IntDefaultHandler、 // GPIO 端口 Q4
    IntDefaultHandler、 // GPIO 端口 Q5
    IntDefaultHandler、 // GPIO 端口 Q6
    IntDefaultHandler、 // GPIO 端口 Q7
    IntDefaultHandler、 // GPIO 端口 R
    IntDefaultHandler、 // GPIO 端口 S
    IntDefaultHandler、 // SHA/MD5 0
    IntDefaultHandler、 // AES 0
    IntDefaultHandler、 // DES3DES 0
    IntDefaultHandler、 // LCD 控制器0
    IntDefaultHandler、 //计时器6子计时器 A
    IntDefaultHandler、 //计时器6子计时器 B
    IntDefaultHandler、 //计时器7子计时器 A
    IntDefaultHandler、 // Timer 7子计时器 B
    IntDefaultHandler、 // I2C6主从设备
    IntDefaultHandler、 // I2C7主设备和从设备
    IntDefaultHandler、 // HIM 扫描矩阵键盘0
    IntDefaultHandler、 //单线0
    IntDefaultHandler、 // HIM PS/2 0
    IntDefaultHandler、 // HIM LED 序列发生器0
    IntDefaultHandler、 // HIM 消费者 IR 0
    IntDefaultHandler、 // I2C8主设备和从设备
    IntDefaultHandler、 // I2C9主设备和从设备
    IntDefaultHandler // GPIO 端口 T
    };
    
    

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

    不知道为什么我总是对 CANIntRegister()有一个盲眼。 真的很抱歉。 感谢您详细解释如何静态声明 CANIntRegister。 发送/接收现在工作正常。

    CANIntHandler 是否应在每次接收时触发两次? (请参阅我之前的 Rx_终端输出)。