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.

[参考译文] TMS320F280021:具有 Code Composer Studio 的 C2000编译器

Guru**** 2535750 points
Other Parts Discussed in Thread: TMS320F280021

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1136548/tms320f280021-c2000-compiler-with-code-composer-studio

器件型号:TMS320F280021

tms320f280021的 CAN 通信不工作、

使用的代码来自 ti-c2000器件 (CAN 收发器)

即使调试器未显示任何错误、为 CAN_TX 配置的引脚也会在整个仿真过程中显示高电平有效(+3.3 V)。  

如果使用 SSAME 代码完成步骤运行,则它将在 while 语句()中结束。  

我使用的代码在下面共享。

//########################################################################################################################
//
//文件:CAN_Ex5_Transmit _Receive.c
//
//标题:发送和接收的 CAN 配置。
//
//! \addtogroup driver_example_list
//!

CAN 发送和接收配置


//!
//! 此示例显示了 CAN 的发送或接收基本设置
//! 具有特定报文 ID 的 CAN 总线上的报文。 CAN 控制器
//! 根据定义的选择进行配置。
//!
//! 当选择了发送定义时、CAN 控制器将用作
//! 发送器并将数据发送到连接的第二个 CAN 控制器
//! 外部.如果未定义 TRANMSIT、CAN 控制器将用作接收器
//! 并等待外部 CAN 控制器发送消息。
//! 请参阅应用手册编程示例和调试策略
//! 有关 DCAN 模块的说明(www.ti.com/lit/SPRACE5)、以了解有用信息
//! 有关该示例的更多信息
//!
//! 注意设备上的 CAN 模块需要通过 CAN 连接
//! 收发器。
//!
//! 要求\n 硬件
//! -具有 CAN 收发器的 C2000板。
//!
//! b 外部连接\n
//! - controlCARD CANA 位于 DEVICE_GPIO_PIN_CANTXA (CANTXA)上
//! 和 DEVICE_GPIO_PIN_CANRXA (CANRXA)
//!
//! b 监视\b 变量\b 发送\Configuration \n
//! - MSGCOUNT -调整以设置消息数
//! - txMsgCount -发送消息数的计数器
//! - txMsgData -一个包含正在发送的数据的数组
//! -errorFlag-表示发生错误的标志
//! - rxMsgCount -初始值为要接收的消息数
//! 并随每条消息递减。
//!
//
//########################################################################################################################

//
//包含的文件
//
#include "driverlib.h"
#include "device.h"

//
//注释以使 CAN 控制器作为接收器工作。
//
#define 传输

//
//定义
//
#ifdef 发送
#define TX_MSG_OBJ_ID 1.
其他
#define RX_MSG_OBJ_ID 1.
#endif
#define MSG_DATA_LENGTH 4.
#define MSGCOUNT 10.

//
//全局
//
#ifdef 发送
volatile uint32_t txMsgCount = 0;
uint32_t txMsgSuccessful = 1;
uint16_t txMsgData[4];
其他
volatile uint32_t rxMsgCount = MSGCOUNT;
uint16_t rxMsgData[4];
#endif
volatile unsigned long i;
volatile uint32_t errorFlag = 0;

//
//函数原型
//
_interrupt void canaISR (void);

//
//主函
//
void main (void)

//
//初始化设备时钟和外设
//
device_init();

//
//初始化 GPIO 并为 CANTX/CANRX 配置 GPIO 引脚
//在模块 A 上
//
DEVICE_initGPIO();
GPIO_setPinConfig (DEVICE_GPIO_CFG_CANRXA);
GPIO_setPinConfig (DEVICE_GPIO_CFG_CANTXA);//DEVICE_GPIO_CFG_CANTXA

//
//初始化 CAN 控制器
//
CAN_initModule (CANA_base);

//
//为每个模块将 CAN 总线位速率设置为500kHz
//有关如何设置的信息,请参阅驱动程序库用户指南
//更严格的计时控制。 此外、请参阅器件数据表
//了解有关 CAN 模块计时的更多信息。
//
CAN_setBitRate (CANA_base、DEVICE_SYSCLK_FREQ、50000、20);

//
//在 CAN 外设上启用中断。
//
CAN_enableInterrupt (CANA_base、CAN_INT_IE0 | CAN_INT_ERROR |
CAN_INT_STATUS);

//
//初始化 PIE 并清除 PIE 寄存器。 禁用 CPU 中断。
//
interrupt_initModule();

//
//使用指向 shell 中断的指针初始化 PIE 矢量表
//服务例程(ISR)。
//
interrupt_initVectorTable();

//
//启用全局中断(INTM)和实时中断(DBGM)
//
EINT;
ERTM;

//
//此示例中使用的中断被重新映射到
//此文件中的 ISR 函数。
//这在 PIE 矢量表中注册中断处理程序。
//
interrupt_register (INT_CANA0、canaISR);

//
//启用 CAN-A 中断信号
//
INTERRUPT_ENABLE (INT_CANA0);

CAN_enableGlobalInterrupt (CANA_base、CAN_GLOBAL_INT_CANINT0);

#ifdef 发送
//
//初始化用于发送 CAN 消息的发送消息对象。
//消息对象参数:
// CAN 模块:A
//消息对象 ID 号:1.
//消息标识符:0x15555555
//消息帧:扩展
//消息类型:发送
//消息 ID 掩码:0x0
//消息对象标志:无
//消息数据长度:4字节
//
CAN_setupMessageObject (CANA_base、TX_MSG_OBJ_ID、0x15555555、
CAN_MSG_FRAME_EXT、CAN_MSG_OBJ_TYPE_TX、0、
CAN_MSG_OBJ_TX_INT_ENABLE、MSG_DATA_LENGTH);
//
//初始化要发送的发送消息对象数据缓冲区
//
txMsgData[0]= 0x12;
txMsgData[1]= 0x34;
txMsgData[2]= 0x56;
txMsgData[3]= 0x78;
其他
//
//初始化用于接收 CAN 消息的接收消息对象。
//消息对象参数:
// CAN 模块:A
//消息对象 ID 号:1.
//消息标识符:0x15555555
//消息帧:扩展
//消息类型:接收
//消息 ID 掩码:0x0
//消息对象标志:接收中断
//消息数据长度:4字节(请注意 DLC 字段是"无关"字段
//用于接收邮箱
//
CAN_setupMessageObject (CANA_base、RX_MSG_obj_ID、0x15555555、
CAN_MSG_FRAME_EXT、CAN_MSG_OBJ_TYPE_RX、0、
CAN_MSG_OBJ_RX_INT_ENABLE、MSG_DATA_LENGTH);
#endif

//
//启动可以模块 A 操作
//
CAN_startModule (CANA_base);

#ifdef 发送
//
//从 CAN-A 发送消息
//
对于(I = 0;I < MSGCOUNT;I++)

//
//检查错误标志以查看是否发生错误
//
if (错误标志)

asm (" ESTOP0");

//
//发送消息。
//
CAN_sendMessage (CANA_base、TX_MSG_OBJ_ID、MSG_DATA_LENGTH、
txMsgData);

//
//在继续前延迟0.25秒
//
DEVICE_DELAY_US (250000);

while (txMsgSuccessful);
//
//递增发送消息数据中的值。
//
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;

//
//更新下一条消息的标志。
//
txMsgSuccessful = 1;

其他
//
//循环以保持从另一个 CAN 控制器接收数据。
//
while (rxMsgCount)


#endif

//
//完成后停止应用程序。
//
asm (" ESTOP0");

//
// CAN ISR -当 CAN 中断为时调用的中断服务例程
//在 CAN 模块 A 上触发
//
_interrupt void
CANAISR (空)

uint32_t status;

//
//读取 CAN-B 中断状态以查找中断原因
//
状态= CAN_getInterruptCus层(CANA_base);

//
//如果原因是控制器状态中断,则获取状态
//
if (status =CAN_INT_INT0ID_STATUS)

//
//读取控制器状态。 这将返回状态字段
//可以指示各种错误的错误位。 错误处理
//本示例中不是为了简单起见。 请参阅
// API 文档,了解有关错误状态位的详细信息。
//读取此状态的操作将清除中断。
//
状态= CAN_getStatus (CANA_base);

//
//检查是否发生错误。
//
#ifdef 发送
if (((status &~(CAN_STATUS_TXOK))!= CAN_STATUS_LEC_MSK)&&
((STATUS &μ~(CAN_STATUS_TXOK))!= CAN_STATUS_LEC_NONE))
其他
if (((status &~(CAN_STATUS_RXOK))!= CAN_STATUS_LEC_MSK)&&
((STATUS &μ~(CAN_STATUS_RXOK))!= CAN_STATUS_LEC_NONE))
#endif

//
//设置一个标志来指示可能发生的某些错误。
//
errorFlag = 1;


#ifdef 发送
否则、如果(status == TX_MSG_OBJ_ID)

//
//到达这一点意味着 TX 中断发生在上
//消息对象1、消息 TX 完成。 清除
//消息目标中断。
//
CAN_clearInterruptStatus (CANA_base、TX_MSG_OBJ_ID);

//
//递增计数器以跟踪已有多少消息
//已发送。 在实际应用中、这可用于将标志设置为
//指示消息的传输时间。
//
txMsgCount++;

//
//由于消息已发送,因此清除所有错误标志。
//
错误标志= 0;

//
//清除消息传输成功标志。
//
txMsgSuccessful = 0;

其他
否则、如果(status == RX_MSG_OBJ_ID)

//
//获取收到的消息
//
CAN_readMessage (CANA_base、RX_MSG_obj_ID、rxMsgData);

//
//到达这一点意味着 RX 中断发生在上
//报文对象1、报文 RX 完成。 清除
//消息目标中断。
//
CAN_clearInterruptStatus (CANA_base、RX_MSG_OBJ_ID);

//
//在收到消息后减去计数器。
//
rxMsgCount--;

//
//由于接收到消息,请清除所有错误标志。
//
错误标志= 0;

#endif
//
//如果发生意外导致中断的情况,这将对中断进行处理。
//
其他

//
//可以在此处执行伪中断处理。
//

//
//清除 CAN 中断线的全局中断标志
//
CAN_clearGlobalInterruptStatus (CANA_base、CAN_GLOBAL_INT_CANINT0);

//
//确认位于组9中的此中断
//
INTERRUPT_clearACKGROUP (INTERRUPT_ACK_group9);

//
//文件结束
//

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

    您好、Nijas、

    我将邀请一位 CAN 专家来研究与我们的软件示例相关的这个问题

    此致、

    Peter

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

    Nijas、  

    您是否使用 F28002x 系列 LaunchPad 进行上述测试?

    如果是、我想提请您注意 用户指南中的以下部分

    希望这会有所帮助。

    谢谢。