器件型号:LAUNCHXL-F28377S
工具/软件:Code Composer Studio
大家好、我想使用 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 支持库 V200 $// $发行 日期:星期二6月21日13:52:16 CDT 2016 $// 版权所有:版权所有(C) 2014-2016德州仪器(TI)公司-// 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 10 #define unsigned_data_length 4 #define TX_MSG_OBJ_ID 1 #RX_CODE"// define 32 volatile Msgt_int_0 = volatile 0xt_uint_32;/volatile Msgt_int_uint_eq_uint1 = 32;volatile 0xt_int_int_uint_int_int_uint_uint_int_int_int_int_int_int_int_int_int_int_int_int_int_int_ unsigned char rxMsgData[4]; tCANMsgObject sTXCANMessage; tCANMsgObject sRXCANMessage; // //函数原型 // __interrupt void canbISR (void); // Main // void main (void) { // //初始化系统控制: // PLL、安全装置、启用外设时钟 // InitSysCtrl(); // //初始化 GPIO 并为 CANTX/CANRX 配置 GPIO 引脚 //在模块 A 和 B 上 // InitGpio(); // //为 CAN-A TX/RX 和 CAN-B TX/RX 设置 GPIO 引脚多路复用器 // 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 (17、GPIO_MUX_CPU1、2);//引脚35-J4 - CANRXB GPIO_SetupPinOptions (17、GPIO_INPUT、GPIO_异 步); GPIO_SetupPinMux (16、GPIO_MUX_CPU1、2);//引脚36-J4 - CANTXB GPIO_SetupPinOptions (16、GPIO_output、GPIO_PushPull);*/ GPIO_SetupPinMux (21、GPIO_MUX_CPU1、3);//引脚33-J4 - CANRXB GPIO_SetupPinOptions (21、GPIO_INPUT、GPIO_异 步); GPIO_SetupPinMux (20、GPIO_MUX_CPU1、3);//引脚34-J4 - CANTXB GPIO_SetupPinOptions (20、GPIO_OUTPUT、GPIO_PushPull); // //初始化 CAN 控制器 // CANInit (CANA_base); CANInit (CANB_BASE); // //设置可以从 PLL 输出时钟计时 // CANClkSourceSelect (CANA_base、0);// 500kHz CAN 时钟 CANClkSourceSelect (CANB_BASE、0);// 500kHz CAN 时钟 // //为每个模块将 CAN 总线位速率设置为500kHz //此函数为标称配置设置 CAN 总线时序。 //您可以使用实现对 CAN 总线时序的更多控制 //函数 CANBitTimingSet()代替这个函数(如果需要)。 //此外、请查阅器件数据表以了解更多相关信息 // CAN 模块计时。 // CANBitRateSet (CANA_base、200000000、50000); CANBitRateSet (CANB_BASE、200000000、50000); // //在 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 中断的指针初始化 PIE 矢量表 //服务例程(ISR)。 //这将填充整个表,即使是中断也是如此 //在本例中未使用。 这对于调试很有用。 // InitPieVectTable(); // //此示例中使用的中断被重新映射到 //此文件中的 ISR 函数。 //这在 PIE 矢量表中注册中断处理程序。 // EALLOW; PieVectTable.CANB0_INT = CANbISR; EDIS; // //在处理器(PIE)上启用 CAN-B 中断。 // PieCtrlRegs.PIEIER9.bit.INTx7=1; IER |= M_INT9; EINT; // //启用 CAN-B 中断信号 // CANGLALIntEnable (CANB_BASE、CAN_GLB_INT_CANINT0); // //初始化用于发送 CAN 消息的发送消息对象。 //消息对象参数: // 消息标识符:0x5555 // 消息 ID 掩码:0x0 // 消息对象标志:无 // 消息数据长度:4字节 // 报文发送数据:txMsgData // sTXCANMessage.ui32MsgID = 0x5555; sTXCANMessage.ui32MsgIDMask = 0; sTXCANMessage.ui32Flags = 0; sTXCANMessage.ui32MsgLen = MSG_DATA_LENGTH; sTXCANMessage.pucMsgData = txMsgData; // //初始化用于接收 CAN 消息的接收消息对象。 //消息对象参数: // 消息标识符:0x5555 // 消息 ID 掩码:0x0 // 报文对象标志:接收中断 // 消息数据长度:4字节 // 消息接收数据:rxMsgData // sRXCANMessage.ui32MsgID = 0x5555; sRXCANMessage.ui32MsgIDMask = 0; sRXCANMessage.ui32Flags = MSG_OBJ_RX_INT_ENABLE; sRXCANMessage.ui32MsgLen = MSG_DATA_LENGTH; sRXCANMessage.pucMsgData = rxMsgData; CANMessageSet (CANB_BASE、RX_MSG_OBJ_ID、sRXCANMessage、 MSG_OBJ_TYPE_RX); // //初始化要发送的发送消息对象数据缓冲区 // txMsgData[0]= 0x12; txMsgData[1]= 0x34; txMsgData[2]= 0x56; txMsgData[3]= 0x78; // //启动 CAN 模块 A 和 B 操作 // CANEnable (CANA_base); CANEnable (CANB_BASE); // //将消息从 CAN-A 发送到 CAN-B // 对于(I = 0;I < TXCOUNT;I++) { // //检查错误标志以查看是否发生错误 // if (错误标志) { asm (" ESTOP0"); } // //验证传输的消息数是否等于的数量 //发送新消息之前收到的消息 // if (txMsgCount = rxMsgCount) { // //发送消息 // CANMessageSet (CANA_base、TX_MSG_OBJ_ID、&sTXCANMessage、 MSG_OBJ_TYPE_TX); txMsgCount++; } 其他 { 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 中断为 //时调用的中断服务例程 在 CAN 模块 B 上触发。 // _interrupt void canbISR (void) { uint32_t status; // //读取 CAN-B 中断状态以查找中断原因 // 状态= CANIntStatus (CANB_BASE、CAN_INT_STS_CAUST); // //如果原因是控制器状态中断,则获取状态 // 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、&sRXCANMessage、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; } // //文件结束 //