主题中讨论的其他器件:C2000WARE
大家好、
首先、我是一名学生工程师、与经验丰富的工程师相反、因此请原谅我明显的愚蠢行为。
现在、我使用的是 C2000示例项目"CAN_ex3_external_transmit "、我已将接收模块从 CAN-B 更改为 CAN-A、并删除了与 CAN-B 相关的每个命令
我设置了一个收发器、它在4V 高电平下工作、这不应该是问题(?)
我将一个示波器连接到 Rx 引脚 GPIO30、我看到消息以50kbps 的速率发送。
现在、从不会触发任何中断、因此没有 ACK、这是我的 CAN 总线分析器在"error passive" TX ERR 上的结果:128...
我不确定下一步该做什么、希望得到帮助。
提前感谢
Chris
在这里、我的代码:
//$
//########################################################################################################################
//
//包含的文件
//
#include "driverlib.h"
#include "device.h"
//
//定义
//
#define TXCOUNT 100
#define MSG_DATA_LENGTH 4.
#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;
uint16_t txMsgData[4];
uint16_t rxMsgData[4];
//
//函数原型
//
_interrupt void canaISR (void);
//
//主函
//
void main (void)
{
//
//初始化设备时钟和外设
//
device_init();
//
//初始化 GPIO 并为 CANTX/CANRX 配置 GPIO 引脚
//在模块 A 和 B 上
//
DEVICE_initGPIO();
GPIO_setPinConfig (DEVICE_GPIO_CFG_CANRXA);
GPIO_setPinConfig (DEVICE_GPIO_CFG_CANTXA);
//
//初始化 CAN 控制器
//
CAN_initModule (CANA_base);
//
//为每个模块将 CAN 总线位速率设置为500kHz
//有关如何设置的信息,请参阅驱动程序库用户指南
//更严格的计时控制。 此外、请参阅器件数据表
//了解有关 CAN 模块计时的更多信息。
//
CAN_setBitRate (CANA_base、DEVICE_SYSCLK_FREQ、50000、20);
//
//在 CAN B 外设上启用中断。
//
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_REGTER (INT_CANA0、&CANaISR);
//
//启用 CAN-B 中断信号
//
INTERRUPT_ENABLE (INT_CANA0);
CAN_enableGlobalInterrupt (CANA_base、CAN_GLOBAL_INT_CANINT0);
//初始化用于接收 CAN 消息的接收消息对象。
//消息对象参数:
// CAN 模块:b.
//消息对象 ID 号:1.
//消息标识符:0x95555555
//消息帧:扩展
//消息类型:接收
//消息 ID 掩码:0x0
//消息对象标志:接收中断
//消息数据长度:4字节
//
CAN_setupMessageObject (CANA_base、RX_MSG_OBJ_ID、0x001、
CAN_MSG_FRAME_STD、CAN_MSG_OBJ_TYPE_RX、0、
CAN_MSG_OBJ_RX_INT_ENABLE、MSG_DATA_LENGTH);
//
//启动 CAN 模块 A 和 B 操作
//
CAN_startModule (CANA_base);
//
//将消息从 CAN-A 发送到 CAN-B
//
对于(I = 0;I < TXCOUNT;I++)
{
//
//检查错误标志以查看是否发生错误
//
if (错误标志)
{
asm (" ESTOP0");
}
}
for (;;)
{IDLE;}
//
//停止应用程序
//
asm (" ESTOP0");
}
//
// CAN B ISR -当 CAN 中断为时调用的中断服务例程
//在 CAN 模块 B 上触发
//
_interrupt void
CANAISR (空)
{
//
//获取收到的消息
//
CAN_readMessage (CANA_base、RX_MSG_obj_ID、rxMsgData);
//
//到达这一点意味着 RX 中断发生在上
//报文对象1、报文 RX 完成。 清除
//消息目标中断。
//
CAN_clearInterruptStatus (CANA_base、RX_MSG_OBJ_ID);
//
//递增计数器以跟踪已有多少消息
//已收到。 在实际应用中、这可用于将标志设置为
//指示何时接收到消息。
//
rxMsgCount++;
//
//清除 CAN 中断线的全局中断标志
//
CAN_clearGlobalInterruptStatus (CANA_base、CAN_GLOBAL_INT_CANINT0);
//
//确认位于组9中的此中断
//
INTERRUPT_clearACKGROUP (INTERRUPT_ACK_group9);
}
//
//文件结束
//