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.

[参考译文] CCS/TM4C1294NCPDT:TM4C1294NCPDT

Guru**** 2440110 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/627469/ccs-tm4c1294ncpdt-tm4c1294ncpdt

器件型号:TM4C1294NCPDT

工具/软件:Code Composer Studio

大家好、

我发现了以下 CAN 通信代码的错误。 错误是什么?

以获取下面给出的代码。

//
//
// simple_tx.c -演示简单 CAN 消息传输的示例。
//
//版权所有(c) 2010-2014 Texas Instruments Incorporated。 保留所有权利。
//软件许可协议
//
//以源代码和二进制形式重新分发和使用,有无
//如果满足以下条件,则允许进行修改
会议://*************
//
// simple_tx.c -演示简单 CAN 消息传输的示例。
//
//版权所有(c) 2010-2014 Texas Instruments Incorporated。 保留所有权利。
//软件许可协议
//
//以源代码和二进制形式重新分发和使用,有无
//如果满足以下条件,则允许进行修改
//满足:
//
//重新分发源代码必须保留上述版权
//注意、此条件列表和以下免责声明。
//
//二进制形式的重新分发必须复制上述版权
//注意、中的条件列表和以下免责声明
//随提供的文档和/或其他材料
//分布。
//
//德州仪器公司的名称和的名称都不是
//其贡献者可用于认可或推广衍生产品
//未经特定的事先书面许可,从该软件下载。
//
//本软件由版权所有者和作者提供
//“原样”以及任何明示或暗示的保证,包括但不包括
//限于对适销性和适用性的暗示保证
//一个特定的目的是免责的。 在任何情况下、版权均不得
//所有者或贡献者应对任何直接、间接、偶然、
//特殊、典型或必然的损害(包括但不包括)
//仅限于采购替代货物或服务;
//数据或利润;或业务中断)
//责任理论,无论是合同责任、严格责任还是侵权行为
//(包括疏忽或其他)以任何方式因使用而产生
//此软件,即使已被告知可能会发生此类损坏。
//
//这是 Tiva 固件开发包的版本2.1.0.12573的一部分。
//
//

#include
#include
#include "inc/hw_ca.h"
#include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "driverlib/CAN.h"
#include "driverlib/gpio.h"
#include "driverlib/interrupt.h"
#include "driverlib/pin_map.h"
#include "driverlib/sysctl.h"
#include "driverlib/uart.h"
#include "utils/uartstdio.h"
#include "driverlib/rom_map.h"

//
//
//! addtogroup CAN_examples_list
//!

简单 CAN TX (simple_tx)


//!
//! 此示例显示了 CAN 传输消息的基本设置
//! 总线上的电流。 CAN 外设配置为发送报文
//! 具有特定的 CAN ID。 然后每秒传输一条消息、
//! 使用简单的延迟环路进行计时。 发送的消息是4
//! 包含递增模式的字节消息。 CAN 中断
//! 处理程序用于确认消息传输并计算数量
//! 已发送的消息。
//!
//! 此示例使用以下外设和 I/O 信号。 您必须执行的操作
//! 查看这些内容并根据您自己的董事会的需要进行更改:
//! - CAN0外设
//! - GPIO 端口 B 外设(用于 CAN0引脚)
//! - CAN0RX - PA0
//! - CAN0TX - PA1
//!
//! 以下 UART 信号仅配置为显示控制台
//! 消息。 CAN 的运行不需要这些参数。
//! - GPIO 端口 A 外设(用于 UART0引脚)
//! - UART0RX - PA0
//! - UART0TX - PA1
//!
//! 此示例使用以下中断处理程序。 来使用该示例
//! 在您自己的应用程序中、您必须将这些中断处理程序添加到
//! 矢量表。
//! - INT_CAN0 - CANIntHandler
//
//

//
//
//系统时钟速率,单位为 Hz。
//
//
uint32_t g_ui32SysClock;

//
//
//跟踪 TX 中断次数的计数器
//发生,它应与发送的 TX 消息数匹配。
//
//
volatile uint32_t g_ui32MsgCount = 0;
volatile uint32_t count = 0;
unsigned char error = 0;

//
//
//指示发生了某些传输错误的标志。
//
//
volatile bool g_BErrFlag = 0;


//
//
//此函数使用简单的轮询方法提供1秒的延迟。
//
//
无效
SimpleDelay (空)

//
//延迟周期1秒
//
SysCtlDelay (16000000 / 3);

//
//
//此函数是 CAN 外设的中断处理程序。 它会进行检查
//查找中断原因,并保留所有消息的计数
//已传输。
//
//
无效
CANIntHandler (空)

uint32_t ui32Status;

//
//读取 CAN 中断状态以查找中断原因
//
ui32Status = CANIntStatus (CAN0_BASE、CAN_INT_STS_CAUST);

//
//如果原因是控制器状态中断,则获取状态
//
if (ui32Status = CAN_INT_INTID_STATUS)

//
//读取控制器状态。 这将返回状态字段
//可以指示各种错误的错误位。 错误处理
//本示例中不是为了简单起见。 请参阅
// API 文档,了解有关错误状态位的详细信息。
//读取此状态的操作将清除中断。 如果
// CAN 外设未与其它 CAN 器件连接到 CAN 总线
//存在,则会发生错误,并在中指示
//控制器状态。
//
ui32Status = CANStatusGet (CAN0_BASE、CAN_STS_CONTROL);

//
//设置一个标志来指示可能发生的某些错误。
//
G_bErrFlag = 1;

//
//检查原因是否是我们正在使用的消息对象1
//发送消息。
//
否则、如果(ui32Status = 1)

//
//到达这一点意味着 TX 中断发生在上
//消息对象1、消息 TX 完成。 清除
//消息目标中断。
//
CANIntClear (CAN0_BASE、1);

//
//递增计数器以跟踪已有多少消息
//已发送。 在实际应用中、这可用于将标志设置为
//指示何时发送消息。
//
G_ui32MsgCount++;

//
//由于消息已发送,请清除所有错误标志。
//
G_bErrFlag = 0;

//
//否则,发生意外导致中断的情况。 这应该是
//永远不会发生。
//
其他

//
//可以在此处执行伪中断处理。
//

//
//
//配置 CAN 并输入循环以传输周期性 CAN 消息。
//
//
内部
main (空)

tCANMsgObject sCANMessage;
uint32_t ui32MsgData;
uint8_t * pui8MsgData;

pui8MsgData =(uint8_t *) ui32MsgData;

//
//将时钟设置为直接从外部晶振/振荡器运行。
// TODO:必须更改 SYSCTL_XTAL_VALUE 以匹配的值
板上的//晶体。
//
G_ui32SysClock = MAP_SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
SYSCTL_OSC_MAIN | SYSCTL_USE_PLL |
SYSCTL_CFG_VCO_480)、120000000);

//
//对于此示例、CAN0与端口 B4和 B5上的 RX 和 TX 引脚一起使用。
//您使用的实际端口和引脚可能有所不同,请参阅
//数据表以了解更多信息。
// GPIO 端口 B 需要启用、以便可以使用这些引脚。
// TODO:将其更改为您正在使用的 GPIO 端口
//
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);

//
//配置 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 ()的调用用于确定该时钟速率
//用于为 CAN 外设计时。 可将其替换为
//固定值如果您知道系统时钟的值,则节省额外的值
//函数调用。 对于某些器件、CAN 外设采用固定计时
// 8MHz,无论在哪种情况下调用的系统时钟如何
// SysCtlClockGet ()应替换为80000。 请查阅数据
//表以了解有关 CAN 外设计时的更多信息。
//
CANBitRateSet (CAN0_BASE、g_ui32SysClock、50000);

//
//在 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 的消息对象
//消息。 消息将是包含一个递增的4个字节
//值。 最初它将设置为0。
//
ui32MsgData = 0;
sCANMessage.ui32MsgID = 1;
sCANMessage.ui32MsgIDMask = 0;
sCANMessage.ui32Flags = MSG_OBJ_TX_INT_ENABLE;
sCANMessage.ui32MsgLen = sizeof (pui8MsgData);
sCANMessage.pui8MsgData = pui8MsgData;

//
//输入循环以发送消息。 根据、将发送一条新消息
//秒。 4字节的消息内容将被视为 uint32_t
//并每次递增1。
//
while (1)

//
//使用对象1发送 CAN 消息(与不一样
// CAN ID、在本例中也是1)。 此函数将导致
//要立即传输的消息。
//
CANMessageSet (CAN0_BASE、1、&sCANMessage、MSG_OBJ_TYPE_TX);

//
//现在等待1秒后再继续
//
SimpleDelay();

//
//检查错误标志以查看是否发生错误
//
if (g_bErrFlag)

错误= 1;//错误-电缆已连接?;

其他

//
//如果没有错误,则打印已发送消息的计数
//
计数= g_ui32MsgCount;//总计计数=%u\n"、g_ui32MsgCount;

//
//递增消息数据中的值。
//
ui32MsgData++;

//
//返回无错误
//
返回(0);

//
//重新分发源代码必须保留上述版权
//注意、此条件列表和以下免责声明。
//
//二进制形式的重新分发必须复制上述版权
//注意、中的条件列表和以下免责声明
//随提供的文档和/或其他材料
//分布。
//
//德州仪器公司的名称和的名称都不是
//其贡献者可用于认可或推广衍生产品
//未经特定的事先书面许可,从该软件下载。
//
//本软件由版权所有者和作者提供
//“原样”以及任何明示或暗示的保证,包括但不包括
//限于对适销性和适用性的暗示保证
//一个特定的目的是免责的。 在任何情况下、版权均不得
//所有者或贡献者应对任何直接、间接、偶然、
//特殊、典型或必然的损害(包括但不包括)
//仅限于采购替代货物或服务;
//数据或利润;或业务中断)
//责任理论,无论是合同责任、严格责任还是侵权行为
//(包括疏忽或其他)以任何方式因使用而产生
//此软件,即使已被告知可能会发生此类损坏。
//
//这是 Tiva 固件开发包的版本2.1.0.12573的一部分。
//
//

#include
#include
#include "inc/hw_ca.h"
#include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "driverlib/CAN.h"
#include "driverlib/gpio.h"
#include "driverlib/interrupt.h"
#include "driverlib/pin_map.h"
#include "driverlib/sysctl.h"
#include "driverlib/uart.h"
#include "utils/uartstdio.h"
#include "driverlib/rom_map.h"

//
//
//! addtogroup CAN_examples_list
//!

简单 CAN TX (simple_tx)


//!
//! 此示例显示了 CAN 传输消息的基本设置
//! 总线上的电流。 CAN 外设配置为发送报文
//! 具有特定的 CAN ID。 然后每秒传输一条消息、
//! 使用简单的延迟环路进行计时。 发送的消息是4
//! 包含递增模式的字节消息。 CAN 中断
//! 处理程序用于确认消息传输并计算数量
//! 已发送的消息。
//!
//! 此示例使用以下外设和 I/O 信号。 您必须执行的操作
//! 查看这些内容并根据您自己的董事会的需要进行更改:
//! - CAN0外设
//! - GPIO 端口 B 外设(用于 CAN0引脚)
//! - CAN0RX - PA0
//! - CAN0TX - PA1
//!
//! 以下 UART 信号仅配置为显示控制台
//! 消息。 CAN 的运行不需要这些参数。
//! - GPIO 端口 A 外设(用于 UART0引脚)
//! - UART0RX - PA0
//! - UART0TX - PA1
//!
//! 此示例使用以下中断处理程序。 来使用该示例
//! 在您自己的应用程序中、您必须将这些中断处理程序添加到
//! 矢量表。
//! - INT_CAN0 - CANIntHandler
//
//

//
//
//系统时钟速率,单位为 Hz。
//
//
uint32_t g_ui32SysClock;

//
//
//跟踪 TX 中断次数的计数器
//发生,它应与发送的 TX 消息数匹配。
//
//
volatile uint32_t g_ui32MsgCount = 0;
volatile uint32_t count = 0;
unsigned char error = 0;

//
//
//指示发生了某些传输错误的标志。
//
//
volatile bool g_BErrFlag = 0;


//
//
//此函数使用简单的轮询方法提供1秒的延迟。
//
//
无效
SimpleDelay (空)

//
//延迟周期1秒
//
SysCtlDelay (16000000 / 3);

//
//
//此函数是 CAN 外设的中断处理程序。 它会进行检查
//查找中断原因,并保留所有消息的计数
//已传输。
//
//
无效
CANIntHandler (空)

uint32_t ui32Status;

//
//读取 CAN 中断状态以查找中断原因
//
ui32Status = CANIntStatus (CAN0_BASE、CAN_INT_STS_CAUST);

//
//如果原因是控制器状态中断,则获取状态
//
if (ui32Status = CAN_INT_INTID_STATUS)

//
//读取控制器状态。 这将返回状态字段
//可以指示各种错误的错误位。 错误处理
//本示例中不是为了简单起见。 请参阅
// API 文档,了解有关错误状态位的详细信息。
//读取此状态的操作将清除中断。 如果
// CAN 外设未与其它 CAN 器件连接到 CAN 总线
//存在,则会发生错误,并在中指示
//控制器状态。
//
ui32Status = CANStatusGet (CAN0_BASE、CAN_STS_CONTROL);

//
//设置一个标志来指示可能发生的某些错误。
//
G_bErrFlag = 1;

//
//检查原因是否是我们正在使用的消息对象1
//发送消息。
//
否则、如果(ui32Status = 1)

//
//到达这一点意味着 TX 中断发生在上
//消息对象1、消息 TX 完成。 清除
//消息目标中断。
//
CANIntClear (CAN0_BASE、1);

//
//递增计数器以跟踪已有多少消息
//已发送。 在实际应用中、这可用于将标志设置为
//指示何时发送消息。
//
G_ui32MsgCount++;

//
//由于消息已发送,请清除所有错误标志。
//
G_bErrFlag = 0;

//
//否则,发生意外导致中断的情况。 这应该是
//永远不会发生。
//
其他

//
//可以在此处执行伪中断处理。
//

//
//
//配置 CAN 并输入循环以传输周期性 CAN 消息。
//
//
内部
main (空)

tCANMsgObject sCANMessage;
uint32_t ui32MsgData;
uint8_t * pui8MsgData;

pui8MsgData =(uint8_t *) ui32MsgData;

//
//将时钟设置为直接从外部晶振/振荡器运行。
// TODO:必须更改 SYSCTL_XTAL_VALUE 以匹配的值
板上的//晶体。
//
G_ui32SysClock = MAP_SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
SYSCTL_OSC_MAIN | SYSCTL_USE_PLL |
SYSCTL_CFG_VCO_480)、120000000);

//
//对于此示例、CAN0与端口 B4和 B5上的 RX 和 TX 引脚一起使用。
//您使用的实际端口和引脚可能有所不同,请参阅
//数据表以了解更多信息。
// GPIO 端口 B 需要启用、以便可以使用这些引脚。
// TODO:将其更改为您正在使用的 GPIO 端口
//
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);

//
//配置 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 ()的调用用于确定该时钟速率
//用于为 CAN 外设计时。 可将其替换为
//固定值如果您知道系统时钟的值,则节省额外的值
//函数调用。 对于某些器件、CAN 外设采用固定计时
// 8MHz,无论在哪种情况下调用的系统时钟如何
// SysCtlClockGet ()应替换为80000。 请查阅数据
//表以了解有关 CAN 外设计时的更多信息。
//
CANBitRateSet (CAN0_BASE、g_ui32SysClock、50000);

//
//在 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 的消息对象
//消息。 消息将是包含一个递增的4个字节
//值。 最初它将设置为0。
//
ui32MsgData = 0;
sCANMessage.ui32MsgID = 1;
sCANMessage.ui32MsgIDMask = 0;
sCANMessage.ui32Flags = MSG_OBJ_TX_INT_ENABLE;
sCANMessage.ui32MsgLen = sizeof (pui8MsgData);
sCANMessage.pui8MsgData = pui8MsgData;

//
//输入循环以发送消息。 根据、将发送一条新消息
//秒。 4字节的消息内容将被视为 uint32_t
//并每次递增1。
//
while (1)

//
//使用对象1发送 CAN 消息(与不一样
// CAN ID、在本例中也是1)。 此函数将导致
//要立即传输的消息。
//
CANMessageSet (CAN0_BASE、1、&sCANMessage、MSG_OBJ_TYPE_TX);

//
//现在等待1秒后再继续
//
SimpleDelay();

//
//检查错误标志以查看是否发生错误
//
if (g_bErrFlag)

错误= 1;//错误-电缆已连接?;

其他

//
//如果没有错误,则打印已发送消息的计数
//
计数= g_ui32MsgCount;//总计计数=%u\n"、g_ui32MsgCount;

//
//递增消息数据中的值。
//
ui32MsgData++;

//
//返回无错误
//
返回(0);

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

    重复输入 MCU 的器件型号-包含在您的关键"主题行"中、证明"无聊/令人不安"-同时不能深入了解您(重要)发布的内容!

    这不是这种"隐藏的主题"的第一次出现-不以"吸引读者发表您的帖子"而闻名!

    存在"描述性标题"有充分理由的-它们不是吗?   当"标题"如此沉默时、报纸或在这里发布的帖子不太可能"出售"...

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Azim、
    您能否展示您的包含路径? 您可能已经在包含路径中包含了 C 文件。

    您能否从编译并复制 simple_tx.c 的已知工作示例开始?