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.

[参考译文] TMS320F28069:eCAN 不在 CAN 总线上发送数据、也不在接收数据。

Guru**** 2538950 points
Other Parts Discussed in Thread: TMS320F28335

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1309785/tms320f28069-ecan-not-transmitting-and-also-receiving-data-in-can-bus

器件型号:TMS320F28069
主题中讨论的其他器件:TMS320F28335

您好!  

我在 eCAN 的实施中遇到了一个问题、它不发送数据和接收数据。 代码中没有显示错误。

在代码下方:

#include "F2806x_Device.h"
#include "DSP28x_Project.h"
#define RX_BUFFER_SIZE 16

UINT32 RxBuffer[RX_BUFFER_SIZE];
UINT32 RxBufferIndex = 0;

void InitECAN (void);
void CAN_TransmitMessage (void);
void CAN_ReceiveMessage (void);
__interrupt void CanIsr (void);

UINT32 TxMsgCount = 0;
UINT32 RxMsgCount = 0;
UINT8 eCAN_Rx_BYTE = 0;
uint8 eCAN_Rx_buff [64];


空 main (void)
{
//系统初始化
InitSysCtrl();
//禁用所有中断
Dint;
//初始化所有中断线路的 pie 矢量
InitPieCtrl();
//禁用所有 CPU 中断
IER = 0x0000;
IFR = 0x0000;

InitPieVectTable();

EALLOW;
PieVectTable.ECAN0INTA =&CANIsr;
EDIS;
////启用全局中断和更高优先级的实时调试
PieCtrlRegs.PIEIER1.bit.INTx1 =1;//在 PIE 中启用 INT 1.1
IER |=M_INT1;//启用 CPU 中断
EINT;//启用全局中断
ERTM;//启用全局中断实时调试

InitECAN();


用于(;;)
{
DELAY_US (1000);

CAN_TransmitMessage();
CAN_ReceiveMessage();
}//用于结束

}//main end

空 InitECAN (空)
{
EALLOW;


//启用 ECAN 模块时钟
SysCtrlRegs.PCLKCR0.bit.ECANAENCLK = 1;

//为 ECAN-A 配置 GPIO 引脚
GpioCtrlRegs.GPAPUD.bit.GPIO30 = 0;//启用 GPIO30的上拉电阻(CANRXA)
GpioCtrlRegs.GPAPUD.bit.GPIO31 = 0;//启用 GPIO31的上拉电阻(CANTXA)
GpioCtrlRegs.GPAQSEL2.bit.GPIO30 = 3;//异步输入 GPIO30 (CANRXA)
GpioCtrlRegs.GPAMUX2.bit.GPIO30 = 1;//将 GPIO30配置为 CANRXA
GpioCtrlRegs.GPAMUX2.bit.GPIO31 = 1;//将 GPIO31配置为 CANTXA

//配置 CAN 控制器
ECanaRegs.CANGAM.bit.AMI = 1;//全局接受屏蔽模式
ECanaRegs.CANMIM.all = 0;//清除所有邮箱以接收任何消息
ECanaRegs.CANGIF1.all = 0x01FF;//清除所有中断标志
ECanaRegs.CANMIL.all = 0;//清除所有邮箱中断级别
ECanaRegs.CANMIM.bit.MIM0 = 1;//启用邮箱0中断
ECanaRegs.CANMIL.bit.MIL0 = 1;//设置邮箱0中断级别

//配置邮箱0以进行接收
ECanaMBboxes.MBOX0.MSGCTRL.bit.DLC = 8;//数据长度代码
ECanaMbags.MBOX0.MSGID.bit.ide = 0;//标准标识符
ECanaMbags.MBOX0.MSGID.all = 0x201;//消息 ID (11位)
ECanaMBboxs.MBOX0.MSGID.bit.AME = 0;//接受屏蔽被禁用
ECanaMbags.MBOX0.MSGID.bit.AAM = 0;//接受屏蔽无关
ECanaRegs.CANMD.all = 0;//清除邮箱方向位
ECanaRegs.CANMD.bit.md0 = 1;//邮箱0是接收邮箱

//配置邮箱1以进行传输
ECanaMBboxes.MBOX1.MSGCTRL.bit.DLC = 8;//数据长度代码
ECanaMboxes.MBOX1.MSGID.bit.ide = 0;//标准标识符
ECanaMbags.MBOX1.MSGID.all = 0x200;//消息 ID (11位)
ECanaMboxes.MBOx1.MSGID.bit.AME = 0;//接受屏蔽被禁用
ECanaMbags.MBOX1.MSGID.bit.AAM = 0;//接受屏蔽无关
ECanaRegs.CANMD.bit.MD1 = 0;//邮箱1是发送邮箱

//启用 ECAN 中断
ECanaRegs.CANMIM.bit.MIM0 = 1;//启用邮箱0中断

//在 CAN 控制寄存器中启用全局中断(GINT)
ECanaRegs.CANGIF1.all = 0xFFFFFFFF;//清除所有中断标志
ECanaRegs.CANGIM.bit.gil = 1;//启用全局中断线路 l`

//在 PIE 中启用 CAN 中断
PieCtrlRegs.PIEIER9.bit.INTx5 = 1;//在 PIE 中启用 ECAN-A0中断
IER |= M_INT9;//启用组9中断
EINT;//启用全局中断
ERTM;//启用全局实时中断

//启动 CAN 模块
// ECanaRegs.CANGAM.bit.ami = 1;
ECanaRegs.CANMC.bit.CCR = 1;//设置 CCR 以配置 CAN 控制器
while (ECanaRegs.canes.bit.CCE!= 0);//等待 CCE 被清零
{


//将 eCAN 配置为自检模式
ECanaRegs.CANMC.bit.STM = 0;
EDIS;

void CAN_TransmitMessage (void)
{
//检查邮箱1的发送请求(TXRQST)是否设置
如果(ECanaRegs.CANA.bit.TA1 = 1)
{
//将 TXRQST 位清零以确认请求
ECanaRegs.CANA.bit.TA1 = 1;

//递增发送消息计数
TxMsgCount++;
ECanaMboxes.MBOX1.MDL.all = 0x01001010;
ECanaMboxes.MBOX1.MDH.all = 0x10101010;

ECanaRegs.CANTRS.all =(1 << 0);

void CAN_ReceiveMessage (void)
{
//检查邮箱0是否设置了新数据标志
如果(ECanaRegs.CANRMP.bit.RMP0 = 1)
{
//从邮箱0复制接收到的数据
RxBuffer[RxBufferIndex]= ECanaMBboxes.MBOX0.MDL.all;
RxBuffer[RxBufferIndex + 1]= ECanaMBags.MBOX0.MDH.all;
//以循环方式递增缓冲区索引
RxBufferIndex =(RxBufferIndex + 2)% RX_BUFFER_SIZE;
//清除新数据标志
ECanaRegs.CANRMP.bit.RMP0 = 1;

//递增接收消息计数
RxMsgCount++;

__中断无效
CanIsr (空)
{
//确认中断
ECanaRegs.CANGIF0.bit.MIV0 = 0;
//
//要从该 PIE 组接收更多的中断,请确认该中断

PieCtrlRegs.PIEACK.all = PIEACK_group9;

谢谢。此致、

S·库马尔

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

    Siva Kumar、

               我们不能在 e2e 上支持对代码进行调试。 请下载我的应用报告 http://www.ti.com/lit/SPRA876。 该示例包含许多经过测试的示例。 请注意、这些示例是为 TMS320F28335器件编写的。 但是、如果您注意 SYSCLKOUT 速度的变化和由此引起的对 CANBTC 寄存器的更改、则可以将其轻松地用于任何具有 eCAN 的28x 器件。 我还要求您查看提供的调试提示。 通过查看此检查清单、可以解决大多数 CAN 问题。  

    请注意、对于正常运行、CCR 必须为0。

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

    Siva Kumar、

      你拒绝了我的答复,没有说明任何理由。 如前所述、我们无法支持在 e2e 上进行代码调试。 我已经为您提供了足够的指导来解决您的问题。