查看: 2818|回复: 4

[求助] KE06 MSCAN无法发送

[复制链接]

该用户从未签到

2

主题

7

帖子

0

新手上路

Rank: 1

积分
48
最后登录
2021-5-10
发表于 2016-5-2 17:14:56 | 显示全部楼层 |阅读模式
本帖最后由 conan_zlc 于 2016-5-4 22:04 编辑

          (1)使用例程代码修改为外部时钟输入外部晶振16MHz,配置总线时钟20Mhz,设置对应的BRP,TSEG1,TSEG2到波特率250K能够实现发送。     (2)使用自己编写的程序时,LOOPB=1时能够正常进入接收中断,收到数据正常。但配置成对外输出时,MSCANTFLG_TXEx清零启动发送后始终无法完成发送(即TXEx不置1),在主程序中查看MSCAN_CANRFLG值在0x08和0x3c跳变。下附源程序如下:
// Bit Rate = fCANCLK/{(1+TimeSegment1+TimeSegment2)*(Prescale value)}
// fCANCLK = OSC_Frequency = 16000000Mhz
// (1+TimeSegment1+TimeSegment2)*(Prescale value) = 64
// BRP = 4, TSEG1 = 11, TSEG2 = 4
#define SJW                 1
#define BRP                 4
#define TSEG1         11
#define TSEG2                4


void MSCAN_Init(void){
        
        uint8_t tmp;
        
        SIM_PINSEL1 |= SIM_PINSEL1_MSCANPS_MASK;        
        SIM->SCGC |= SIM_SCGC_MSCAN_MASK;        
        
        MSCAN_CANCTL1 |= MSCAN_CANCTL1_CANE_MASK;        
        
       MSCAN_CANCTL0 |= MSCAN_CANCTL0_INITRQ_MASK;
        
        while((MSCAN_CANCTL1 & MSCAN_CANCTL1_INITAK_MASK) == 0) {;}                //wait INITRQ ==1

        MSCAN_CANCTL1 &= ~MSCAN_CANCTL1_CLKSRC_MASK;
        MSCAN_CANCTL1 &= ~MSCAN_CANCTL1_LISTEN_MASK;
        MSCAN_CANCTL1 &= ~MSCAN_CANCTL1_LOOPB_MASK;
        //MSCAN_CANCTL1 |= MSCAN_CANCTL1_LOOPB_MASK;
        //MSCAN_CANCTL0 |= MSCAN_CANCTL0_TIME_MASK;
        
        // Bit Rate = fCANCLK/{(1+TimeSegment1+TimeSegment2)*(Prescale value)}
           tmp = SJW - 1;
           tmp = tmp << 6;
           tmp |= (BRP - 1);
                                       
           MSCAN_CANBTR0 = tmp;                                //Bit
                                       
          tmp = TSEG2 - 1;
          tmp = tmp << 4;
          tmp |= (TSEG1 - 1);
          MSCAN_CANBTR1 = tmp;
        
         MSCAN_CANIDAR0 = 0x00;                   // 16 bit Filter 0
          MSCAN_CANIDMR0 = 0xFF;
          MSCAN_CANIDAR1 = 0x00;
          MSCAN_CANIDMR1 = 0xFF;

          MSCAN_CANIDAR2 = 0x00;                   // 16 bit Filter 1
          MSCAN_CANIDMR2 = 0xFF;
          MSCAN_CANIDAR3 = 0x00;
          MSCAN_CANIDMR3 = 0xFF;

          MSCAN_CANIDAR4 = 0x00;                   // 16 bit Filter 2
          MSCAN_CANIDMR4 = 0xFF;
          MSCAN_CANIDAR5 = 0x00;
          MSCAN_CANIDMR5 = 0xFF;

          MSCAN_CANIDAR6 = 0x00;                   // 16 bit Filter 3
          MSCAN_CANIDMR6 = 0xFF;
          MSCAN_CANIDAR7 = 0x00;
          MSCAN_CANIDMR7 = 0xFF;
                                       
        MSCAN_CANIDAC |= MSCAN_CANIDAC_IDAM_MASK;
                                       
        MSCAN_CANCTL0 &= 0xFE;            // Exit initialization mode request
                                       
          while((MSCAN_CANCTL1 & MSCAN_CANCTL1_INITAK_MASK) == 0x1)      // Wait for normal mode
          {
                   ;
          }

          while((MSCAN_CANCTL0 & MSCAN_CANCTL0_SYNCH_MASK) == 0)    // Wait for CAN synchronization
          {
                   ;
          }
                        
      MSCAN_CANRFLG |= MSCAN_CANRFLG_RXF_MASK;       // Clear receiver flags                        
      MSCAN_CANRIER |= MSCAN_CANRIER_RXFIE_MASK;     // Enable Full Receive Buffer
                                       
      NVIC_EnableIRQ(MSCAN_RX_IRQn);

      MSCAN_CANCTL1 |= MSCAN_CANCTL1_CANE_MASK;
                                             
}





//发送函数如下:
uint8_t MSCAN_SendFrame_Std(uint32_t id, uint8_t priority, uint8_t length, uint8_t *pData)
{
          uint8_t  i = 0;
          uint16_t j = 0;
          uint8_t  txbuffer = 0;
        
          watch1 = MSCAN_CANTFLG;

          if((MSCAN_CANTFLG&0x07) == 0x00)
          {
             return ERR_TXBUF_FULL;
          }

          MSCAN_CANTBSEL = MSCAN_CANTFLG;  
                                                                                                                        
          txbuffer = MSCAN_CANTBSEL;            

          MSCAN_TSIDR0 = (uint8_t)((id>>3)&0x00FF);  //ID[10:3]

          MSCAN_TSIDR1 = (uint8_t)((id<<5)&0x00E0);  //ID[2:0] + RTR(=0) + IDE(=0)
                        
          for(i=0; i<length; i++)  //Load data to Tx buffer Data Segment Registers
          {
              *(&MSCAN_TEDSR0 + i) = pData;
          }

          MSCAN_TDLR = length;        //Set Data Length

          MSCAN_TBPR = priority;     //Set Priority

          MSCAN_CANTFLG = txbuffer;          //Write "1" to Clear the TXEx Flag bit and Start correspond TXx transmission

          while((j<10000) && ((MSCAN_CANTFLG & txbuffer) != txbuffer))  //Wait for Transmission completion
          {
             j++;
          }
                                        watch2 = MSCAN_CANTFLG;
          if(j >= 10000)   
          {
                                                
             return ERR_TIMEOUT;
          }

          return ERR_NONE;
                                         
}





我知道答案 目前已有4人回答
回复

使用道具 举报

该用户从未签到

2

主题

7

帖子

0

新手上路

Rank: 1

积分
48
最后登录
2021-5-10
 楼主| 发表于 2016-5-2 17:16:12 | 显示全部楼层
坐等高人指出问题。。
回复 支持 反对

使用道具 举报

  • TA的每日心情
    慵懒
    2018-11-15 16:18
  • 签到天数: 39 天

    连续签到: 1 天

    [LV.5]常住居民I

    16

    主题

    259

    帖子

    3

    高级会员

    Rank: 4

    积分
    993
    最后登录
    2023-1-6
    发表于 2016-5-3 19:41:14 | 显示全部楼层
    没主函数,不好分析,can通信硬件发送有延时的,你发送间隔不能太短,你250k波特滤的话每帧间隔起码3毫秒,可以的话拿个示波器看看芯片tx脚有没有波形,有波形就基本成功了,没波形就研究下波特滤吧,我也个帖子里有现成的底层驱动,适合kinetis芯片,你下了可以研究下
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    2

    主题

    7

    帖子

    0

    新手上路

    Rank: 1

    积分
    48
    最后登录
    2021-5-10
     楼主| 发表于 2016-5-3 23:33:23 | 显示全部楼层
    小华-415468 发表于 2016-5-3 19:41
    没主函数,不好分析,can通信硬件发送有延时的,你发送间隔不能太短,你250k波特滤的话每帧间隔起码3毫秒 ...

    我主函数只进行了一次发送,就循环读取CANRFLG的值。也试过500ms间隔发送,都没反应。波特率设置应该的寄存器值应该没问题。关于CANH和CANL应该是没有信号出来的,因为我试过用USB转CAN自动侦测波特率,结果一次侦测的事件都没发生。就从上述函数看不出什么问题吗?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    2

    主题

    7

    帖子

    0

    新手上路

    Rank: 1

    积分
    48
    最后登录
    2021-5-10
     楼主| 发表于 2016-5-4 22:03:10 | 显示全部楼层
    小华-415468 发表于 2016-5-3 19:41
    没主函数,不好分析,can通信硬件发送有延时的,你发送间隔不能太短,你250k波特滤的话每帧间隔起码3毫秒 ...

    问题找到了,和CAN模块没有关系,上述代码是OK的。具体原因是CAN芯片的STANDBY控制引脚被接到了PTA6(手册中描述PTA6默认功能是ADC),然后我误解了ADC_APCTL1的意思,以为置1是禁用PTA6的ADC,其实置1是禁用IO功能。于是就CAN传送器就一直工作在STANDBY模式了。还是谢谢仁兄了!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-9-10 14:05 , Processed in 0.095696 second(s), 25 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表