大家好、
我可以通过 driverlib 示例代码在 PCAN 上看到消息 ID 和消息数据、使用 bitfield 尝试的相同代码(没有消息接收处理)无法正常工作、问题在 https://e2e.ti.com/support/microcontrollers/c2000/f/171/t/608641中进行了解释
我是否可以知道原因、请您发表任何评论???
//######################################################################################################################
//
//文件:CAN_EXTERNAL_Transmit
//
//标题:演示 CAN 外部传输的示例
//
//! addtogroup cpu01_example_list
//!
CAN-A 至 CAN-B 外部发送(CAN_EXTERNAL_Transmit)
//!
//! 此示例对 CAN 模块 A 和 CAN 模块 B 进行外部初始化
//! 通信。 CAN-A 模块被设置为发送"n"的递增数据
//! 到 CAN-B 模块的次数、其中"n"为 TXCOUNT 的值。
//! 当设置为触发中断服务例程(ISR)时、CAN-B 模块被设置为触发中断服务例程(ISR)
//! 接收数据。 如果传输的数据不是、则会设置错误标志
//! 匹配接收到的数据。
//!
//! 注意设备上的两个 CAN 模块都需要
//! 通过 CAN 收发器相互连接。
//!
//! b 外部连接\n
//! - CANA 位于 GPIO31 (CANTXA)和 GPIO30 (CANRXA)上
//! - CANB 位于 GPIO8 (CANTXB)和 GPIO10 (CANRXB)上
//!
//! b 监视\b 变量\n
//! - TXCOUNT -调整以设置要发送的消息数
//! - txMsgCount -发送消息数的计数器
//! -rxMsgCount-接收报文数量的计数器
//! - txMsgData -一个包含正在发送的数据的数组
//! -rxMsgData-一个包含接收到的数据的数组
//! -errorFlag-表示发生错误的标志
//!
//
//######################################################################################################################
//$TI 发行版:F2837xD 支持库 v3.01.00.00 $
//$Release Date:Mon May 22 15:43:40 CDT 2017 $
//版权所有:
//版权所有(C) 2013-2017 Texas Instruments Incorporated - http://www.ti.com/
//
//以源代码和二进制形式重新分发和使用,有无
//如果满足以下条件,则允许进行修改
//满足:
//
//重新分发源代码必须保留上述版权
//注意、此条件列表和以下免责声明。
//
//二进制形式的重新分发必须复制上述版权
//注意、中的条件列表和以下免责声明
//随提供的文档和/或其他材料
//分布。
//
//德州仪器公司的名称和的名称都不是
//其贡献者可用于认可或推广衍生产品
//未经特定的事先书面许可,从该软件下载。
//
//本软件由版权所有者和作者提供
//“原样”以及任何明示或暗示的保证,包括但不包括
//限于对适销性和适用性的暗示保证
//一个特定的目的是免责的。 在任何情况下、版权均不得
//所有者或贡献者应对任何直接、间接、偶然、
//特殊、典型或必然的损害(包括但不包括)
//仅限于采购替代货物或服务;
//数据或利润;或业务中断)
//责任理论,无论是合同责任、严格责任还是侵权行为
//(包括疏忽或其他)以任何方式因使用而产生
//此软件,即使已被告知可能会发生此类损坏。
//$
//######################################################################################################################
//
//包含的文件
//
#include "F28x_Project.h"//设备头文件和示例 include 文件
#include
#include
#include "inc/hw_types.h"
#include "inc/hw_memmap.h"
#include "inc/hw_ca.h"
#include "driverlib/CAN.h"
//
//定义
//
//#define MSG_DATA_LENGTH 4.
#define MSG_DATA_LENGTH 8.
#define TX_MSG_OBJ_ID 1.
#define RX_MSG_OBJ_ID 1.
//
//全局
//
volatile unsigned long i;
volatile uint32_t txMsgCount = 0;
volatile uint32_t rxMsgCount = 0;
volatile uint32_t errorFlag = 0;
//unsigned char txMsgData[4];
unsigned char txMsgData[8];
unsigned char rxMsgData[4];
tCANMsgObject sTXCANMessage;
tCANMsgObject sRXCANMessage;
//
//函数原型
//
_interrupt void canaISR (void);
//
//主函
//
void main (void)
{
//
//初始化系统控制:
// PLL、安全装置、启用外设时钟
//
InitSysCtrl();
//
//初始化 GPIO 并为 CANTX/CANRX 配置 GPIO 引脚
//在模块 A 和 B 上
//
InitGpio();
//
//为 CAN-A TX/RX 和 CAN-B TX/RX 设置 GPIO 引脚多路复用器
//
GPIO_SetupPinMux (70、GPIO_MUX_CPU1、5);//GPIO70 - CANRXA
GPIO_SetupPinMux (71、GPIO_MUX_CPU1、5);//GPIO71 - CANTXA
GPIO_SetupPinOptions (70、GPIO_INPUT、GPIO_异 步);
GPIO_SetupPinOptions (71、GPIO_OUTPUT、GPIO_PushPull);
//
//初始化 CAN 控制器
//
CANInit (CANA_base);
//设置可以从 PLL 输出时钟计时
//
CANClkSourceSelect (CANA_base、0);// 500kHz CAN 时钟
//
//为每个模块将 CAN 总线位速率设置为500kHz
//此函数为标称配置设置 CAN 总线时序。
//您可以使用实现对 CAN 总线时序的更多控制
//函数 CANBitTimingSet()代替这个函数(如果需要)。
//此外、请查阅器件数据表以了解更多相关信息
// CAN 模块计时。
//
CANBitRateSet (CANA_base、200000000、50000);
//
//在 CAN 外设上启用中断。
//
CANIntEnable (CANA_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.CANA0_INT = CANaISR;
EDIS;
//
//在处理器(PIE)上启用 CAN-A 中断。
//
PieCtrlRegs.PIEIER9.bit.INTx5 = 1;
IER |= M_INT9;
EINT;
//
//启用 CAN-A 中断信号
//
//启用 CAN-A 中断信号
CANGLALIntEnable (CANA_base、CAN_GLB_INT_CANINT0);
//
//初始化用于发送 CAN 消息的发送消息对象。
//消息对象参数:
//消息标识符:0x5555
//消息 ID 掩码:0x0
//消息对象标志:无
//消息数据长度:4字节
//消息发送数据:txMsgData
//
//sTXCANMessage.ui32MsgID = 0x5555;
sTXCANMessage.ui32MsgID = 0x58c;
sTXCANMessage.ui32MsgIDMask = 0;
sTXCANMessage.ui32Flags = 0;
sTXCANMessage.ui32MsgLen = MSG_DATA_LENGTH;
sTXCANMessage.pucMsgData = txMsgData;
//
//初始化要发送的发送消息对象数据缓冲区
//
txMsgData[0]= 0x01;
txMsgData[1]= 0x23;
txMsgData[2]= 0x45;
txMsgData[3]= 0x67;
txMsgData[0]= 0x89;
txMsgData[1]= 0xab;
txMsgData[2]= 0xcd;
txMsgData[3]= 0xef;
//
//启动 CAN 模块 A 和 B 操作
//
CANEnable (CANA_base);
//
//将消息从 CAN-A 发送到 CAN-B //启用 VCM 的 CANA 发送到 CANA
//
while (1)
{
CANMessageSet (CANA_base、TX_MSG_OBJ_ID、&sTXCANMessage、
MSG_OBJ_TYPE_TX);
//
//在继续前延迟0.25秒
//
DELAY_US (1000 * 250);
//
//递增发送消息数据中的值。
//
txMsgData[0]+= 0x01;
txMsgData[1]+= 0x01;
txMsgData[2]+= 0x01;
txMsgData[3]+= 0x01;
//
//如果超过一个字节、则复位数据
//
if (txMsgData[0]> 0xFF)
{
txMsgData[0]= 0;
}
if (txMsgData[1]> 0xFF)
{
txMsgData[1]= 0;
}
if (txMsgData[2]> 0xFF)
{
txMsgData[2]= 0;
}
if (txMsgData[3]> 0xFF)
{
txMsgData[3]= 0;
}
}
//
//停止应用程序
//
asm (" ESTOP0");
}
//
// CAN ISR -当 CAN 中断为时调用的中断服务例程
//在 CAN 模块 A 上触发
//
_interrupt void
CANAISR (空)
{
uint32_t status;
//
//读取 CAN-A 中断状态以查找中断原因
//
状态= CANIntStatus (CANA_base、CAN_INT_STS_CAUST);
//
//如果原因是控制器状态中断,则获取状态
//
if (status =CAN_INT_INT0ID_STATUS)
{
//
//读取控制器状态。 这将返回状态字段
//可以指示各种错误的错误位。 错误处理
//本示例中不是为了简单起见。 请参阅
// API 文档,了解有关错误状态位的详细信息。
//读取此状态的操作将清除中断。
//
状态= CANStatusGet (CANA_base、CAN_STS_CONTROL);
}
//
//如果发生意外导致中断的情况,这将对中断进行处理。
//
其他
{
//
//可以在此处执行伪中断处理。
//
}
//
//清除 CAN 中断线的全局中断标志
//
CANGLALIntClear (CANA_base、CAN_GLB_INT_CANINT0);
//
//确认位于组9中的此中断
//
PieCtrlRegs.PIEACX.ALL = PIEACK_group9;
}
//
//文件结束
//
(一
谢谢