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.

[参考译文] TMS320F28379D:位字段与 driverlib CAN 示例代码

Guru**** 2539500 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/608690/tms320f28379d-bitfields-vs-driverlib-dcan-example-code

器件型号:TMS320F28379D

大家好、

我可以通过 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;

//
//文件结束
//

(一

谢谢

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

    bitfield 示例代码仅适用于 extendend 消息 ID、stanard 消息 ID (11位)、必须添加以下逻辑、有关更多信息、请查看(e2e.ti.com/.../608641)
    if (!CanaRegs.CAN_IF1ARB.bit.XTD)

    msgid =(msgid << CAN_IF1ARB_STD_ID_S);
    msgid = msgid & CAN_IF1ARB_STD_ID_M;


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

    我不关注您的问题。 示例是否存在问题? 示例并非专门针对 PCAN 进行设置。

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

    感谢您的回复。
    我不是说必须为 PCAN 设置示例。
    这些示例针对标准帧进行设置、在位字段版本中不正确、在 driverlib 版本中正确。

    谢谢
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我明白了。 我将会有一个错误归档来纠正这种情况。

    谢谢你

    此致
    Chris