打印
[技术问题解答]

TRK_KEA128板子(Rev D),MSCAN发不出数据

[复制链接]
1244|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
biyimifan|  楼主 | 2017-4-1 15:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在做KEA128系列的MSCAN驱动,驱动配置好了以后感觉也没什么,反复调试了很多次,就是没办法把数据发出去。
硬件仿真的情况是:每次数据都是已经正确写入到发送缓冲区了的,但是缓冲区的数据就是没有向外发送,一共有3个发送缓冲区,写入三次以后就无法再继续写入了。
希望有相关经验的大牛能够指点一下问题所在。非常感谢!

附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);
        }
}


相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

15

帖子

0

粉丝