工具与软件:
工程师、您好、我最近在 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);
}