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.

[参考译文] TMS320F28388D:有关28388D 中 CAN 的问题

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1455219/tms320f28388d-questions-about-can-in-the-28388d

器件型号:TMS320F28388D

工具与软件:

工程师、您好、我最近在 CCS11.1中调试了28388D 中的 CAN、并且当 CAN 的波特率为50万时、我的程序运行正常。 但是、当我将 CAN 的波特率设置为1000K 时
STATUS = CAN_getInterruptCASE (CANA_BASE);返回值状态为32768。 我将我的程序发布在:下面

#include "driverlib.h"
#include "device.h"
#define RX_MSG_OBJ_ID 1.
#define MSG_DATA_LENGTH 8.
//#define MSGCOUNT 16.


_interrupt void canaISR (void);

Volatile uint32_t errorFlag = 0;
char send_flag=0;
char send_buf[150]={0};
uint16_t rxMsgData[8]={0};
char send_temp_buf[150]={0};
int send_temp_buf_i = 0;
char head_FLAG = 0;
uint16_t my_i = 0;
char heng_cnt = 0;
void main (void)

uint16_t = 0;
//
//初始化器件时钟和外设
//
device_init();
//
//初始化 GPIO 并为 CANTX/CANRX 配置 GPIO 引脚
//模块 A
//
device_initGPIO();
GPIO_setPinConfig (DEVICE_GPIO_CFG_CANRXA);
GPIO_setPinConfig (DEVICE_GPIO_CFG_CANTXA);
//
//将共享外设分配给 C28x
//
SYSCTL_allocateSharedPeripheral (SYSCTL_PALLOCATE_CAN_A、0x0U);
SYSCTL_allocateSharedPeripheral (SYSCTL_PALLOCATE_CAN_B、0x0U);
//
//初始化 CAN 控制器
//
can_initModule (cana_base);
//
//设置 CAN 总线比特率
//
CAN_setBitRate (CANA_BASE、DEVICE_SYSCLK_FREQ、1000000、8);
//
//在 CAN A 外设上启用中断。
//
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);
//
//初始化用于接收 CAN 消息的接收消息对象。
//消息对象参数:
// CAN 模块:A
//消息对象 ID 号:1.
//消息标识符:0x000000
//消息帧:标准
//消息类型:接收
//消息 ID 掩码:0x0
//消息对象标志:接收中断
//消息数据长度:8字节(请注意 DLC 字段是"无关"位
//对于接收邮箱
//
CAN_setupMessageObject (CANA_BASE、RX_MSG_OBJ_ID、0x000000、CAN_MSG_FRAME_STD、CAN_MSG_OBJE_TYPE_RX、0、CAN_MSG_OBJ_RX_INT_ENABLE MSG_DATA_LENGTH);
//
//启动 CAN 模块 A 操作
//
can_startModule (cana_base);
//

//SCIB TX 422
GPIO_setMasterCore (10、GPIO_CORE_CPU1);
GPIO_setPinConfig (GPIO_10_SCIB_TX);
GPIO_setDirectionMode (10、GPIO_DIR_MODE_OUT);
GPIO_setPadConfig (10、GPIO_PIN_TYPE_STD);
GPIO_setQualificationMode (10、GPIO_QUAL_ASYNC);

SCI_setConfig (SCIB_BASE、DEVICE_LSPCLK_FREQ、256000、(SCI_CONFIG_WLEN_8 | SCI_CONFIG_STOP_ONE | SCI_CONFIG_PAR_NONE));
SCI_resetChannels (SCIB_BASE);
SCI_enableModule (SCIB_BASE);
SCI_performSoftwareReset (SCIB_BASE);

while (1)

if (send_FLAG)

SEND_FLAG = 0;
GPIO_writePin (DEVICE_GPIO_PIN_422、0);
T = 0;
for (t=1;t<150;t++)

SCI_writeCharBlockingNonFIFO (SCIB_BASE、send_buf[t]);
if (send_buf[t]='\n")

send_buf[t]= 0;
休息;
}
send_buf[t]= 0;
}
}
}
}
_interrupt void canaISR (void)

uint16_t i = 0;
uint32_t status = 0;
//
//读取 CAN 中断状态以找出中断原因
//
STATUS = CAN_getInterruptCASE (CANA_BASE);
//
//如果原因是控制器状态中断、则获取状态
//
if (STATUS == CAN_INT_INT0ID_STATUS)

状态= can_getStatus (cana_base);
if ((((STATUS &~(CAN_STATUS_RXOK))!= CAN_STATUS_LEC_MSK)&&((STATUS &~(CAN_STATUS_RXOK))!= CAN_STATUS_LEC_NONE))

errorFlag = 1;
}
}
否则 if (STATUS == RX_MSG_OBJ_ID)

//
//获取接收到的消息
//
can_readMessage (CANA_BASE、RX_MSG_OBJ_ID、rxMsgData);
for (i=0;i<8;i++)

if (rxMsgData[i]=='$')

GPIO_writePin (DEVICE_GPIO_PIN_CANA、0);
HEAD_FLAG = 1;
send_temp_buf_i = 0;
}
if (head_FLAG)

if (rxMsgData[i]== 0)

继续;
}
if (rxMsgData[i]=='、')

heng_cnt++;
}
send_temp_buf[send_temp_buf_i++]= rxMsgData[i];
}
if (rxMsgData[i]=='\n"&& Heng_cnt >= 18)

for (my_i=0;my_i<send_temp_buf_i;my_i++)

send_buf[my_i]= send_temp_buf[my_i];
send_temp_buf[my_i]= 0;
if (send_buf[my_i]='\n")
休息;
}
HEAD_FLAG = 0;
SEND_FLAG = 1;
send_temp_buf_i = 0;
heng_cnt = 0;
rxMsgData[i]= 0;
GPIO_writePin (DEVICE_GPIO_PIN_CANA、1);
休息;
}
}
can_clearInterruptStatus (CANA_BASE、RX_MSG_OBJ_ID);
errorFlag = 0;
}
CAN_clearGlobalInterruptStatus (CANA_BASE、CAN_GLOBAL_INT_CANINT0);
interrupt_clearACKGroup (interrupt_ACK_group9);
}

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

    尊敬的 Zhou:

    检查函数  CAN_setBitRate (CANA_BASE、DEVICE_SYSCLK_FREQ、1000000、8)中的 bitTime 参数;  确保对1Mbps 波特率使用正确的值。

    此致、

    Joseph

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

    您好、Joseph  

    我在位时使用 DCAN_CANBTR_values.xlsx 文件、并尝试了8、10、16、20、25、 但是所有这些结果都导致 STATUS = CAN_getInterruptCASE (CANA_BASE);返回值状态是32768、我认为这可能不是位时间问题、非常感谢!

    此致、

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

    您好、Joseph  

    配置 CAN_setBitRate (CANA_BASE、DEVICE_SYSCLK_FREQ、1000000、25)后、是否需要配置 CAN_setBitTiming (CANA_BASE、7、0、15、7、3);我是否正确配置它?