请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:EK-TM4C1294XL 工具/软件:Code Composer Studio
大家好、我正在尝试测试 TI 的'simple_TX'代码、以便与 EK-TM4C1294XL 电路板进行 CAN 总线通信。
我只想看到一个简单的信号、它在进入 CAN 收发器之前从 CAN TX 引脚获取信息。
我为 CAN TX 的 PA1配置了输出引脚、但我看不到任何包含该信息的信号(它仅显示3.3V 的平坦信号)。
可以帮帮我吗?
// // //// simple_tx.c -演示简单 CAN 消息传输的示例。 // //版权所有(c) 2010-2015 Texas Instruments Incorporated。 保留所有权利。 //软件许可协议 // 以源代码和二进制形式重新分发和使用,无论是否 进行//修改,只要 满足以下条件//: // 重新分发源代码必须保留上述版权 //声明、此条件列表和以下免责声明。 // //二进制形式的再发行必须复制上述版权 //声明、此条件列表和// 分发随附的//文档和/或其他材料中的以下免责声明。 //// 未经 事先书面许可,不能使用德州仪器公司的名称或//其贡献者的名称来认可或推广源自此软件的产品//。 //// 本软件由版权所有者和贡献者提供 //“按原样”,不 承认任何明示或暗示的保证,包括但不限于//适销性和对//特定用途适用性的暗示保证。 在任何情况下、版权 //所有者或贡献者都不对任何直接、间接、偶然、 //特殊、模范、 或相应的损害(包括但不 限于采购替代产品或服务;丧失使用、 //数据或利润; 或业务中断)、无论 出于何种原因使用 本软件(即使被告知可能会造成此类损坏)、还是出于任何原因而产生的任何//责任理论(无论是合同、严格责任还是侵权行为)//(包括疏忽或其他)。 // //这是 Tiva 固件开发包的修订版本2.1.2.111的一部分。 //// ***************** #include #include #include #include "inc/hw_ca.h" #include "inc/hw_ints.h" #include "inc/hw_memmap.h" #include "ca.h" //######## 使用前:将 can.h 和 CAN.c 复制到 Work Dir #include "driverlib/gpio.h" #include "driverlib/interrupt.h" #include "driverlib/pin_map.h" #include "driverlib/sysctl.h" #include "driverlib/uartstdio.h" //######## 使用前:将 uartstdio.h 和 uartstdio.c 复制到 Work Dir //######################## 含义:Prosch 所做的更改 //********* // //! \addtogroup CAN_examples_list //!简单 CAN TX (simple_tx)
//! //! 此示例显示了 CAN 的基本设置、以便传输消息 //! 总线上的电流。 CAN 外设配置为发送消息 //! 具有特定的 CAN ID。 然后每秒传输一条消息 、//! 使用简单的延迟环路进行计时。 发送的消息是4 //! 包含递增模式的字节消息。 A CAN 中断 //! 处理程序用于确认消息传输并计数 //! 已发送的消息。 //! //! 此示例使用以下外设和 I/O 信号。 您必须 //! 查看这些内容并根据您自己的董事会需要进行更改: //! - CAN0外设 //! - GPIO 端口 B 外设(用于 CAN0引脚) //! - CAN0RX - PB4 PA0 //################################## //! - CAN0TX - PB5 PA1 //#################### //! //! 以下 UART 信号仅配置为显示控制台 //! 消息。 CAN 的运行不需要这些参数。 //! - GPIO 端口 A 外设(用于 UART0引脚) //! - UART0RX - PA0 PP0 //########################## //! - UART0TX - PA1 PP1 //################################ //! //! 此示例使用以下中断处理程序。 要使用此示例 //! 在您自己的应用程序中、您必须将这些中断处理程序添加到 您的//! 矢量表。 //! - INT_CAN0 - CANIntHandler // /********* // // //跟踪 TX 中断次数 的计数器//发生,该计数器应与发送的 TX 消息数匹配。 //// ***************** 易失性 uint32_t g_ui32MsgCount = 0; //********* // //指示发生了一些传输错误的标志。 //// ***************** volatile bool g_BErrFlag = 0; //********* // //此函数将 UART0设置为用于控制台,以便 在示例运行时显示信息//。 //// ***************** void InitConsole (void) { // //启用用于 UART0引脚的 GPIO 端口 A。 // TODO:将其更改为您正在使用的 GPIO 端口。 // SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA); SysCtlPeripheralEnable (sysctl_Periph_GPIOP);//############################## // //为端口 A0和 A1上的 UART0功能配置引脚复用。 //如果您的器件不支持引脚复用、则无需执行此步骤。 // TODO:更改此选项以选择您正在使用的端口/引脚。 // GPIOPinConfigure (GPIO_PP0_U6RX);//#################################################### GPIOP1_U6TX;//#################### // //启用 UART0以便我们可以配置时钟。 // SysCtlPeripheralEnable (SYSCTL_Periph_UART6);//########################################################## // //使用内部16MHz 振荡器作为 UART 时钟源。 // UARTClockSourceSet (UART6_BASE、UART_CLOCK _PIOSC);//############################################################## // //为这些引脚选择替代(UART)功能。 // TODO:更改此选项以选择您正在使用的端口/引脚。 // GPIOPinTypeUART (GPIO_PORTP_BASE、GPIO_PIN_0 | GPIO_PIN_1);//################################################################## // //初始化控制台 I/O 的 UART // UARTStdioConfig (1、115200、16000000); } //********* // //此函数使用简单的轮询方法提供1秒延迟。 //// ***************** void SimpleDelay (void) { // //延迟周期1秒 // SysCtlDelay (16000000 / 3); } //********* // //此函数是 CAN 外设的中断处理程序。 它会检查 //中断原因,并保持 //已传输的所有消息的计数。 //// ***************** void CANIntHandler (void) { 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 消息。 //// ***************** int main (void) { #if defined (target_IS_TM4C129_RA0)|| \ 已定义(TARGET_IS_TM4C129_RA1)|| \ 已定义(TARGET_IS_TM4C129_RA2) uint32_t ui32SysClock; #endif tCANMsgObject sCANMessage; uint32_t ui32MsgData; uint8_t * pui8MsgData; pui8MsgData =(uint8_t *) ui32MsgData; // //将时钟设置为直接从外部晶振/振荡器运行。 // 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(); // //对于此示例、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 的消息对象 //消息。 消息将是包含一个递增的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) {unsigned int x; // //将显示消息计数和的消息打印到控制台 //正在发送的消息的内容。 // printf ("正在发送网格:0x%02x %02x %02x %02x\n"、 //#################################################################################### pui8MsgData[0]、pui8MsgData[1]、pui8MsgData[2]、 pui8MsgData[3]); // printf ("B\n"); // UARTprintf //使用对象1发送 CAN 消息(与不一样 // CAN ID、在本例中也是1)。 此函数将导致 //要立即传输的消息。 // CANMessageSet (CAN0_BASE、1、&sCANMessage、MSG_OBJ_TYPE_TX); // //现在等待1秒后再继续 // SimpleDelay ();//############## printf ("B\n"); // //检查错误标志以查看是否发生错误 // if (g_bErrFlag) { printf ("错误-电缆已连接?\n"); } 其他 { // //如果没有错误,则打印已发送消息的计数 // printf ("总计数=%u\n"、g_ui32MsgCount);//########################## ## // //递增消息数据中的值。 // ui32MsgData++; } // //返回无错误 // 返回(0); }