最近在做KEA128系列的MSCAN驱动,驱动配置好了以后感觉也没什么,反复调试了很多次,就是没办法把数据发出去。
硬件仿真的情况是:每次数据都是已经正确写入到发送缓冲区了的,但是缓冲区的数据就是没有向外发送,一共有3个发送缓冲区,写入三次以后就无法再继续写入了。
回环测试也试过了,回环测试模式下在can接收函数中加了printf打印到串口调试助手,数据是正常的。
希望有相关经验的大牛能够指点一下问题所在。急!急!急!非常感谢!
附MSCAN初始化代码:
void MSCAN_Initialize(void)
{
MSCAN_ConfigType MSCAN_Config;
MSCAN_Config.sSetting.bCLKSRC = 1; // 等于1,则 MSCAN 选用总线时钟20M ;等于0,则 MSCAN 选用 振荡器时钟(复位值)
MSCAN_Config.u8IDARHit = ID_ACCEPT_FILTER0_HIT; // 000-111 : 滤波器0-7
MSCAN_Config.u8IDARMode = 0; // 00 两个 32 位验收滤波器。01 四个 16 位验收滤波器。10 八个 8 位验收滤波器。11 滤波器关闭。
/*对于扩展标识符,应用所有四个验收和屏蔽寄存器。对于标准标识符,仅应用前两个(CANIDAR0/1、CANIDMR0/1)寄存器。 MSCAN_CANBTRx */
MSCAN_Config.u32IDAR0 = 0x12345678; //8位掩码??
MSCAN_Config.u32IDAR1 = 0x12345678;
MSCAN_Config.u32IDMR0 = 0xffffffff; //忽略对应的验收代码寄存器(ARn)
MSCAN_Config.u32IDMR1 = 0xffffffff;
/*MSCAN波特率配置 MSCAN_CANBTRx*/
MSCAN_Config.sBaudRateSetting.SAMP = 0; // 0 :一个样本 1 :三个样本
MSCAN_Config.sBaudRateSetting.SJW = 0x00; // 0-3 :1到4个Tq
MSCAN_Config.sBaudRateSetting.TSEG1 = 0x04; // 0-15 : 1到16个Tq
MSCAN_Config.sBaudRateSetting.TSEG2 = 0x03; // 0-7 : 1到8个Tq
MSCAN_Config.sBaudRateSetting.BRP = 0x01; // 0-63 :1-64分频
/*MSCAN模式配置 MSCAN_CANCTLx*/
MSCAN_Config.sSetting.bListenModeEn = 0; //仅监听模式 0:正常 1:仅监听
MSCAN_Config.sSetting.bLoopModeEn = 0; //回环自测模式 0:禁用 1:使能
MSCAN_Config.sSetting.bStopEn = 0; //该模块在Wait模式期间 0:不受影响 1:停止
MSCAN_Config.sSetting.bWUPM = 0; //唤醒模式 0:任意显性电平唤醒 1:Twup长度显性电平唤醒
MSCAN_Config.sSetting.bBusOffUser = 0; //总线关闭恢复模式 0:自动 1:用户请求时恢复
/*MSCAN中断配置 MSCAN_CANRIER*/
// MSCAN_Config.sSetting.bOverRunIEn = 0; //溢出中断
// MSCAN_Config.sSetting.bRxFullIEn = 0; //接收器满中断
// MSCAN_Config.sSetting.bStatusChangeIEn = 0; //CAN状态变更中断
// MSCAN_Config.sSetting.bTxEmptyIEn = 0; //发送器空 中断
// MSCAN_Config.sSetting.bTxStatusChangeIEn = 0; //同bRxStatusChangeIEn
// MSCAN_Config.sSetting.bWakeUpIEn = 0; //唤醒中断,开中断时需“唤醒使能
// MSCAN_Config.sSetting.bRxStatusChangeIEn = 0; /*接收器状态变更中断(2位),这里只用到“00”和“11”。
// 00:对所有状态关中断 01:仅接收器进入\退出“总线关闭”中断
// 10:仅接收器进入\退出“TxErr”或“总线关闭”中断 11:对所有状态开中断*/
/*MSCAN_CANCTL0*/
MSCAN_Config.sSetting.bWakeUpEn = 1; //唤醒使能 1:使能 0:关闭
// MSCAN_Config.sSetting.bTimerEn = 0; /*16位定时器 1:使能 0:关闭 。
// 如果该定时器使能,那么有效TX/RX 缓冲区中每条已发送/已接收的报文都会分配到一个16位时间标志。
// 回环模式下,不会生成任何接收时间标志。*/
/*MSCAN_CANCTL0*/
MSCAN_Config.sSetting.bCanEn = 1; // CAN使能
CAN_Init(MSCAN,&MSCAN_Config);
}
附MSCAN发送代码:
void SEND_TEST(void)
{
// MSCAN_FrameType MSCAN_FrameStruct;
uint32 LID = 0x12345678;
MSCAN_RegisterFrameType MSCAN_RegisterFrameStruct;
MSCAN_RegisterFrameStruct.BPR = 0x00;
MSCAN_RegisterFrameStruct.DLR = 0x08;
MSCAN_RegisterFrameStruct.EDSR[0] = 0x00;
MSCAN_RegisterFrameStruct.EDSR[1] = 0x01;
MSCAN_RegisterFrameStruct.EDSR[2] = 0x02;
MSCAN_RegisterFrameStruct.EDSR[3] = 0x03;
MSCAN_RegisterFrameStruct.EDSR[4] = 0x04;
MSCAN_RegisterFrameStruct.EDSR[5] = 0x0a;
MSCAN_RegisterFrameStruct.EDSR[6] = 0x0b;
MSCAN_RegisterFrameStruct.EDSR[7] = 0x0c;
MSCAN_RegisterFrameStruct.EIDR0 = ((uint8_t)(LID >> 21));
MSCAN_RegisterFrameStruct.EIDR1 = ((((uint8_t)(LID>>13))&0xe0) | (((uint8_t)(LID>>15))&0x07) | 0x18);
MSCAN_RegisterFrameStruct.EIDR2 = ((uint8_t)(LID>>7)&0xff); //((uint8_t)(LID>>7)); (uint8_t)((LID & 0x7f80)>>7);
MSCAN_RegisterFrameStruct.EIDR3 = (((uint8_t)(LID<<1)) & 0xfe);
while(1)
{
Delay(0x6E3600);
CAN_LoadOneFrameToBuff(MSCAN,&MSCAN_RegisterFrameStruct);
// CAN_ReadOneFrameFromBuff(MSCAN,&MSCAN_FrameStruct);
}
}
|