请选择 进入手机版 | 继续访问电脑版
查看: 136|回复: 1

[S12] MC9S12XEQ512 CAN通讯求支援

[复制链接]

该用户从未签到

1

主题

1

帖子

0

金豆

新手上路

Rank: 1

积分
32
最后登录
2019-1-14
发表于 2019-1-10 19:03:09 | 显示全部楼层 |阅读模式
大家好,我剛接觸Freescale控制器。

正在學習CAN通訊的功能,參考官方自還測試的範例碼,但是在run的時候的會卡住。

根本不知道問題在哪邊,請版上高手指導一下,萬分感謝。

晶片代號:MC9S12XEQ512
外部晶振:ˋ4MHz

執行時畫面
圖片1.png

以下是程式碼
#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */
#define ST_ID_100 0x100

#define ACC_CODE_ID100 0x2000
#define ACC_CODE_ID100_HIGH ((ACC_CODE_ID100 & 0xFF00)>>8)
#define ACC_CODE_ID100_LOW (ACC_CODE_ID100 & 0x00FF)

/* Mask Code Definitions */
#define MASK_CODE_ST_ID 0x0007
#define MASK_CODE_ST_ID_HIGH ((MASK_CODE_ST_ID & 0xFF00)>>8)
#define MASK_CODE_ST_ID_LOW (MASK_CODE_ST_ID & 0xFF)

void canInit()
{
  //MSCAN Initial mode
  CAN0CTL0 = 0x01;
  
  //Check Entry the MSCAN Initial mode  
  while(!(CAN0CTL1 & 0x01));
  
  //MSCAN Enable & Loop Enable
  CAN0CTL1 = 0xA0;
  
  //fOSC=4MHz,CAN speed=250kbps
  CAN0BTR0 = 0xC0;
  CAN0BTR1 = 0x67;
  
  /* Close Filters */
  CAN0IDAC = 0x11;
  //CAN0IDAR0 = ACC_CODE_ID100_HIGH;  //|\ 16-bit Filter 0
  //CAN0IDMR0 = MASK_CODE_ST_ID_HIGH; //| \__ Accepts Standard Data Frame Msg
  //CAN0IDAR1 = ACC_CODE_ID100_LOW;   //| / with ID 0x100
  //CAN0IDMR1 = MASK_CODE_ST_ID_LOW;  //|/
  /* Acceptance Filters */
  //CAN0IDAC = 0x10; /* Set four 16-bit Filters */
  //CAN0IDAR2 = 0x00;                 //|\ 16-bit Filter 1
  //CAN0IDMR2 = MASK_CODE_ST_ID_HIGH; //| \__ Accepts Standard Data Frame Msg
  //CAN0IDAR3 = 0x00;                 //| / with ID 0x100
  //CAN0IDMR3 = MASK_CODE_ST_ID_LOW;  //|/
  //CAN0IDAR4 = 0x00;                 //|\ 16-bit Filter 2
  //CAN0IDMR4 = MASK_CODE_ST_ID_HIGH; //| \__ Accepts Standard Data Frame Msg
  //CAN0IDAR5 = 0x00;                 //| / with ID 0x100
  //CAN0IDMR5 = MASK_CODE_ST_ID_LOW;  //|/
  //CAN0IDAR6 = 0x00;                 //|\ 16-bit Filter 3
  //CAN0IDMR6 = MASK_CODE_ST_ID_HIGH; //| \__ Accepts Standard Data Frame Msg
  //CAN0IDAR7 = 0x00;                 //| / with ID 0x100
  //CAN0IDMR7 = MASK_CODE_ST_ID_LOW;  //|/
  
  /* Exit Initialization Mode Request */
  CAN0CTL0 = 0x00;
  
  /* Wait for Normal Mode */
  while ((CAN0CTL1&0x00) != 0);
}

unsigned char canSendFrame(unsigned long id, unsigned char priority, unsigned char length, unsigned char *txdata)
{
  unsigned char txbuffer;
  unsigned char index;

  //Check TXE  Buffer
  if(!CAN0TFLG) return 1;
  
  //Set TXE Buffer
  CAN0TBSEL = CAN0TFLG;
  txbuffer = CAN0TBSEL;
  
  //Write ID
  *((unsigned long *) ((unsigned long)(&CAN0TXIDR0))) = id;
  
  //Write Data
  for (index=0;index<length;index++) {
    *(&CAN0TXDSR0 + index) = txdata[index];
  }
  /* Set Data Length Code */
  CAN0TXDLR = length;
  /* Set Priority */
  CAN0TXTBPR = priority;
  
  /* Start transmission */
  CAN0TFLG = txbuffer;
  
  /* Wait transmission */
  while ( (CAN0TFLG & txbuffer) != txbuffer);
}
#pragma CODE_SEG NON_BANKED

void interrupt CAN0RxISR(void) {
    unsigned char length, index;
    unsigned char rxdata[8];

    length = (CAN0RXDLR & 0x0F);
        for (index=0; index<length; index++)
              rxdata[index] = *(&CAN0RXDSR0 + index); /* Get received data */

    CAN0RFLG = 0x01;   /* Clear RXF */
}

#pragma CODE_SEG DEFAULT

void main(void)
{  
  unsigned char errorflag;
  unsigned char txbuff[] = "abcd";
  
  //MSCAN Setting Function
  canInit();
  
  //Wait CAN BUS SYNCH
  while (!(CAN0CTL0 & 0x10));
  
  //Clear CAN0 RXF flag
  CAN0RFLG &= 0x01;
  //Enable CAN0 RX interrupt
  CAN0RIER = 0x01;
  //Enable all interrupt  
  EnableInterrupts;
  
  for (;;)
  {
    //CAN0 Send Data
    errorflag = canSendFrame((ST_ID_100), 0x00, sizeof(txbuff)-1, txbuff);
  }
}


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

使用道具 举报

  • TA的每日心情
    奋斗
    6 天前
  • 签到天数: 83 天

    [LV.6]常住居民II

    7

    主题

    139

    帖子

    1

    金豆

    中级会员

    Rank: 3Rank: 3

    积分
    429
    最后登录
    2019-5-14
    发表于 2019-1-19 08:22:41 | 显示全部楼层
    程序是自己写的,还是自动生成的?CAN控制芯片硬件没有接好也会没有数据接收发送。
    平衡起床情绪,开始实干
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

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

    GMT+8, 2019-5-20 21:40 , Processed in 0.091736 second(s), 17 queries , MemCache On.

    Powered by Discuz! X3.4

    © 2001-2013 Comsenz Inc.

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