请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:LAUNCHXL-F28377S
工具/软件:TI C/C++编译器
您好!
我想使用 CAN_EXTERNAL_Transmit。c 来测试 CAN 总线
我将 MCP2551 (CAN 收发器)的2与 LAUNCHXL-F28377S 一起使用
结果是
这是我的源代码
//###################################################################################################################### // ////文件:CAN_external_transmit。c // //标题:演示 CAN 外部传输的示例 // ! addtogroup cpu01_example_list //!CAN-A 至 CAN-B 外部发送(CAN_EXTERNAL_Transmit)
//! //! 此示例初始化 CAN 模块 A 和 CAN 模块 B 的外部 //! 通信。 CAN-A 模块被设置为传输"n"的递增数据 //! 到 CAN-B 模块的次数、其中"n"为 TXCOUNT 的值。 //! CAN-B 模块设置为在 //! 接收数据。 如果传输的数据不 是//! 匹配接收到的数据。 //! //! 注意设备上的两个 CAN 模块都需要是 //! 通过 CAN 收发器相互连接。 //! //! b 外部连接\n //! - CANA 位于 GPIO31 (CANTXA)和 GPIO30 (CANRXA)// ! - CANB 位于 GPIO8 (CANTXB)和 GPIO10 (CANRXB)// ! //! b 监视\b 变量\n //! - TXCOUNT -调整以设置要传输的消息数 //! - txMsgCount -发送消息数的计数 器//! - rxMsgCount -接收到的消息数的计数 器//! - txMsgData -一个包含正在发送数据的数组 //! - rxMsgData -包含接收到的数据的数组 //! -errorFlag -指示发生错误 的标志//! // //########################################################################################################################## //$TI 发行版:F2837xS 支持库 V210 $ //$发行 日期:TUE 11月1日15:35:23 CDT 2016 $ //$版权:版权所有(C) 2014-2016 Texas Instruments Incorporated - // http://www.ti.com/ 保留所有权利$//########################################## // //包含的文件 // #include "F28x_Project.h"//设备头文件和示例包含文件 #include #include #include "inc/hw_types.h" #include "inc/hw_memmap.h" #include "inc/hw_ca.h" #include "driverlib/ca.h" // define TXCOUNT 100 #define unsigned_data_length 4 #define TX_MSG_OBJ_ID 1 #RX_CODE"// define 32 volatile Msgt_int_0 = volatile 0xt_int_uint_32;volatile MSG_0xt_uint_uint_32;volatile MSG_0xt_int_int_uint_uint_int_uint_int_int_u_int_int_int_ex 32;volatile unsigned char rxMsgData[4]; tCANMsgObject sTXCANMessage; tCANMsgObject sRXCANMessage; // //函数原型 // __interrupt void canbISR (void); // // Main // void main (void) { // //初始化系统控制: // PLL,看门狗,启用外设时钟 // InitSysCtrl (); // GPIO,并配置 CANTX/CANRX // 模块 A 和 B 上的 GPIO 引脚/ InitGpio ();// // //为 CAN-A TX/RX 和 CAN-B TX/RX 设置 GPIO 引脚多路复用 // //* GPIO_SetupPinMux (30、GPIO_MUX_CPU1、1);// GPIO30 - CANRXA GPIO_SetupPinOptions (30、GPIO_input、GPIO_Async); GPIO_SetupPinMux (31、CPU1_CPU1、GPIO_SetupPinOptions) 1);/GPIO31 - CANTXA GPIO_SetupPinOptions (31、GPIO_OUTPUT、GPIO_PushPull); GPIO_SetupPinMux (10、GPIO_MUX_CPU1、 2);//GPIO10 - CANRXB GPIO_SetupPinOptions (10、GPIO_INPUT、GPIO_异 步); GPIO_SetupPinMux (8、GPIO_MUX_CPU1、 2);//GPIO8 - CANTXB GPIO_SetupPinOptions (8、GPIO_OUTPUT、GPIO_PushPull);*/ GPIO_SetupPinMux (18、GPIO_MUX_CPU1、3); //PIN76-J8 - CANRXA GPIO_SetupPinOptions (18、GPIO_INPUT、GPIO_异 步); GPIO_SetupPinMux (19、GPIO_MUX_CPU1、 3);//PIN75-J8 - CANTXA GPIO_SetupPinOptions (19、GPIO_OUTPUT、GPIO_PushPull); GPIO_SetupPinMux (21、GPIO_MUX_CPU1、 3);//引脚33-J4 - CANRXB GPIO_SetupPinOptions (17、GPIO_INPUT、GPIO_异 步); GPIO_SetupPinMux (20、GPIO_MUX_CPU1、 3);//引脚34-J4 - CANTXB GPIO_SetupPinOptions (16、GPIO_OUTPUT、GPIO_PushPull); // 初始化 CAN 控制器 // CANInit (CANA_base); CANInit (CANB_BASE); // 设置可以从 PLL 输出时钟// CANClkbase"(CANB_500kHz);CANSourceClkB-0_BASE (CAN100kHz);CANSourceSelect (CAN100kHz) // 500kHz CAN 时钟 // //为每个模块将 CAN 总线位速率设置为500kHz //此函数为标称配置设置 CAN 总线时序。 // 如果需要,可以使用//函数 CANBitTimingSet()而不是这个函数来实现对 CAN 总线时序的更多控制。 //此外、有关 // CAN 模块计时的更多信息、请查阅器件数据表。 // CANBitRateSet (CANA_base、200000000、50000); CANBitRateSet (CANB_BASE、200000000、 500000); // //在 CAN B 外设上启用中断。 // CANIntEnable (CANB_BASE、CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS); // 清除所有中断并初始化 PIE 矢量表: //禁用 CPU 中断 // DINT; // 将 PIE 控制寄存器初始化为默认状态。 //默认状态是禁用所有 PIE 中断并 清除标志//。 // InitPieCtrl(); // 禁用 CPU 中断并清除所有 CPU 中断标志 // IER = 0x0000; IFR = 0x0000; // 使用指向 shell 中断 //服务例程(ISR)的指针初始化 PIE 矢量表。 //这将填充整个表,即使在 本示例中未使用中断//也是如此。 这对于调试很有用。 // InitPieVectTable (); // //本示例中使用的中断被重新映射到 该文件中的// ISR 函数。 //这在 PIE 矢量表中注册中断处理程序。 // EALLOW; PieVectTable.CANB0_INT = canbISR; EDIS; // //在处理器上启用 CAN-B 中断(PIE)。 // PieCtrlRegs.PIEIER9.bit.INTx7 = 1; IER |= M_INT9; EINT; // //启用 CAN-B 中断信号 // CANGLALIntEnable (CANB_BASE、CAN_GLB_INT_CANINT0); // 初始化用于发送 CAN 消息的发送消息对象。 //报文对象参数: //报文标识符:0x5555 //报文 ID 掩码:0x55// 报文对象标志:无 //报文数据长度:4字节 //报文发送数据:txMsgData // sTXCANMessage.ui32MsgID = 0x5555; sTXCANMessage.ui32txMsgMask = 0;sTXCANMessage.u32MsgMSG = 0; sTXCANMessage.u32TXCng_TX32MsgMSG 数据长度= 0; sTXCANId=sTXCng_TXCng_TX32MsgMSG // //初始化用于接收 CAN 消息的接收消息对象。 //报文对象参数: //报文标识符:0x55// 报文 ID 掩码:0x0 //报文对象标志:接收中断 //报文数据长度:4字节 //报文接收数据:rxMsgData // sRXCANMessage.ui32MsgID = 0x5555; sRXCANMessage.ui32MsgMSG 掩码= 0;sRXCANMsgId=sRX32_RX_RXCngId=SION_RX32_SION_SION_SION_SIF_RX32_RXCANMsgMSG = 0;sRXCANMsg_RX32_RXSION_RXSION_SION_SIF_RX32_RXSION_RXSION_RXSI CANMessageSet (CANB_BASE、RX_MSG_OBJ_ID、&sRXCANMessage、 MSG_OBJ_TYPE_RX); // 初始化要发送的发送消息对象数据缓冲 区// txMsgData[0]= 0x12; txMsgData[1]= 0x34; txMsgData[2]= 0x56;txMsgData[0] = 0x78; CANMsb/ CANMsb/sBase = 0x78;CANCANCANCANCANCANCANMsb[ENDULLE]( CANB) // //将消息从 CAN-A 发送到 CAN-B // for (i = 0;i < TXCOUNT;i++) { // //检查错误标志以查看是否发生错误 // if (errorFlag) { asm (" ESTOP0"); } // //验证传输消息的数量是否等于 //发送新消息之前接收到的消息的数量 // if (txMsgCount ==rxMsgCount) { // //发送消息 // CANMessageSet (CANA_base、TX_Count_obj_ID、&sTXCANMessage、 MSG_OBJ_TYPE_TX); txMsg+ } 否则 { errorFlag = 1; } // //在继续之前延迟0.25秒 // delay_US (1000 * 250); // //递增已发送消息数据中的值。 // txMsgData[0]+= 0x01; txMsgData[1]+= 0x01; txMsgData[2]+= 0x01; txMsgData[3]+= 0x01; } // 停止应用 // asm (" ESTOP0"); } // // CAN B ISR - CAN 模块 B 上触发 CAN 中断时调用的中断服务例程。 // __interrupt void canbISR (void) { uint32_t status; // //读取 CAN-B 中断状态以查找中断原因 // status = CANIntStatus (CANB_BASE、CAN_INT_STS_CAUSE); // //如果原因是控制器状态中断,则获取状态 // if (status =CAN_INT_INT0ID_STATUS) { // 读取控制器状态。 这将返回一个状态 //错误位字段,该字段可以指示各种错误。 为 简单起见、本示例中未执行错误处理//。 有关 错误状态位的详细信息、请参阅// API 文档。 //读取此状态的操作将清除中断。 // status = CANStatusGet (CANB_BASE、CAN_STS_CONTROL); // 检查是否发生错误。 // if (((status &~(CAN_ES_RXOK))!= 7)&& (status &~(CAN_ES_RXOK)!= 0) ){ // 设置一个标志来指示可能发生的一些错误。 // errorFlag = 1; } }// //检查原因是否为 CAN-B 接收消息对象1 // 否则(status = RX_MSG_OBJ_ID) { // 获取接收到的消息 // CANMessageGet (CANB_BASE、RX_MSG_OBJ_ID、&sCANRXMessage、TRUE); // //到达这一点意味着 RX 中断发生在 //消息对象1上,并且消息 RX 完成。 清除 //消息目标中断。 // CANIntClear (CANB_BASE、RX_MSG_OBJ_ID); // 递增计数器以跟踪 已接收的消息数//。 在实际应用中、这可用于将标志设置为 //指示何时接收到消息。 // rxMsgCount++; // //自收到消息以来,清除所有错误标志。 // errorFlag = 0; } // //如果发生意外导致中断的情况,这将对中断进行处理。 // 否则 { // ////杂散中断处理可以转到此处。 // } // //清除 CAN 中断线路的全局中断标志 // CANGLALIntClear (CANB_BASE、CAN_GLB_INT_CANINT0); // 确认位于组9中的此中断 // PieCtrlRegs.PIEACK.all = PIEACK_group9; } // 结束文件