查看: 7883|回复: 7

[其他] 求大神帮忙解决MSCAN的问题!(接收程序不能进入中断)

[复制链接]

该用户从未签到

3

主题

11

帖子

0

注册会员

Rank: 2

积分
85
最后登录
2016-7-22
发表于 2014-12-27 22:26:42 | 显示全部楼层 |阅读模式
        大家好!我正在学MSCAN模块,用的是MC9S12X128,可是作为接收结点的开发板始终没有接收到数据,应该是接收程序没有进入中断,可初始化CAN模块接收器中断使能打开了,是什么原因?急啊!搞了好几天了,有没有高手指教一番!小生在此不胜感激!

这是CAN模块的程序:
#include "derivative.h" /* include peripheral declarations */
#include "CAN.h"

/*************************************************************/
/*                        初始化CAN0                         */
/*************************************************************/
void INIT_CAN0(void)
{
  if(CAN0CTL0_INITRQ==0)      // 查询是否进入初始化状态   
    CAN0CTL0_INITRQ =1;        // 进入初始化状态

  while (CAN0CTL1_INITAK==0);  //等待进入初始化状态

  CAN0BTR0_SJW = 0;            //设置同步
  CAN0BTR0_BRP = 7;            //设置波特率  
  CAN0BTR1 = 0x1c;       //设置时段1和时段2的Tq个数 ,总线频率为250kb/s

// 关闭滤波器                                 
  CAN0IDMR0 = 0xFF;
  CAN0IDMR1 = 0xFF;
  CAN0IDMR2 = 0xFF;
  CAN0IDMR3 = 0xFF;
  CAN0IDMR4 = 0xFF;
  CAN0IDMR5 = 0xFF;
  CAN0IDMR6 = 0xFF;
  CAN0IDMR7 = 0xFF;

  CAN0CTL1 = 0xC0;             //使能MSCAN模块,设置为一般运行模式、使用总线时钟源

  CAN0CTL0 = 0x00;             //返回一般模式运行

  while(CAN0CTL1_INITAK);      //等待回到一般运行模式

  while(CAN0CTL0_SYNCH==0);    //等待总线时钟同步

  CAN0RIER_RXFIE = 1;          //使能接收中断
}

/*************************************************************/
/*                       CAN0发送                            */
/*************************************************************/
Bool MSCAN0SendMsg(struct can_msg msg)
{
  unsigned char send_buf, sp;

  // 检查数据长度
  if(msg.len > 8)
    return(FALSE);

  // 检查总线时钟
  if(CAN0CTL0_SYNCH==0)
    return(FALSE);

  send_buf = 0;
  do
  {
    // 寻找空闲的缓冲器
    CAN0TBSEL=CAN0TFLG;
    send_buf=CAN0TBSEL;
  }

  while(!send_buf);

  // 写入标识符
  CAN0TXIDR0 = (unsigned char)(msg.id>>3);
  CAN0TXIDR1 = (unsigned char)(msg.id<<5);

  if(msg.RTR)
    // RTR = 阴性
    CAN0TXIDR1 |= 0x10;

  // 写入数据
  for(sp = 0; sp < msg.len; sp++)
    *((&CAN0TXDSR0)+sp) = msg.data[sp];

  // 写入数据长度
  CAN0TXDLR = msg.len;

  // 写入优先级
  CAN0TXTBPR = msg.prty;

  // 清 TXx 标志 (缓冲器准备发送)
  CAN0TFLG = send_buf;

  return(TRUE);

}

/*************************************************************/
/*                       CAN0接收                            */
/*************************************************************/
Bool MSCAN0GetMsg(struct can_msg *msg)
{
  unsigned char sp2;

  // 检测接收标志
  if(!(CAN0RFLG_RXF))
    return(FALSE);

  // 检测 CAN协议报文模式 (一般/扩展) 标识符
  if(CAN0RXIDR1_IDE)
    // IDE = Recessive (Extended Mode)
    return(FALSE);

  // 读标识符
  msg->id = (unsigned int)(CAN0RXIDR0<<3) |
            (unsigned char)(CAN0RXIDR1>>5);

  if(CAN0RXIDR1&0x10)
    msg->RTR = TRUE;
  else
    msg->RTR = FALSE;

  // 读取数据长度
  msg->len = CAN0RXDLR;

  // 读取数据
  for(sp2 = 0; sp2 < msg->len; sp2++)
    msg->data[sp2] = *((&CAN0RXDSR0)+sp2);

  // 清 RXF 标志位 (缓冲器准备接收)
  CAN0RFLG = 0x01;

  return(TRUE);
}
这是主程序
#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */
#include "CAN.h"      
#include "LCD.h"      

#define LEDCPU PORTK_PK4
#define LEDCPU_dir DDRK_DDRK4
#define  BUS_CLOCK                   32000000           //总线频率
#define  OSC_CLOCK                   16000000           //晶振频率

char *xianshi[3] = {
"飞翔科技开发板",
"接收到的数据为:",
};

#define ID                  0x0001       //发送标识符
#define data_len_TX          7           //发送数据长度

unsigned char k;

unsigned char senddata[8] = {'F','R','E','E','F','L','Y',0};     //发送的数据

struct can_msg msg_send, msg_get;
unsigned char datain=0;

/*************************************************************/
/*                      初始化锁相环                         */
/*************************************************************/
void INIT_PLL(void)
{
   。。。。。。。。。。。。。。。。。。。。
}

/************************************************************/
/*                    初始化ECT模块                         */
/************************************************************/
void initialize_ect(void){
。。。。。。。。。。。。。。。。。。。。。
}

/************************************************************/
/*                在液晶上显示接收到的数据                  */
/************************************************************/
void play_data(void)
{
   。。。。。。。。。。。。。。。。。。。。。
}

/*************************************************************/
/*                      中断接收函数                         */
/*************************************************************/
#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt CAN_receive(void)
{
      LEDCPU = ~LEDCPU;(在这里用指示灯检查是否进入中断,结果指示灯一直亮)
      if(MSCAN0GetMsg(&msg_get))
      {
        // LEDCPU = ~LEDCPU;
        // 接收新信息
         if(msg_get.id == ID && (!msg_get.RTR))
         {
                // LEDCPU = ~LEDCPU;
                 datain=1;      
         }
      }
      else
      {
       for(;;);
      }
}
#pragma CODE_SEG DEFAULT

/*************************************************************/
/*                        主函数                             */
/*************************************************************/
void main(void) {
  DisableInterrupts;
  INIT_PLL();
  initialize_ect();
  INIT_CAN0();
  INIT_PORT();
  LEDCPU_dir=1;
  LEDCPU=0;
  EnableInterrupts;


  for(;;)
  {
      if(datain==1)
      {
          lcd_clear();
          lcd_string(0,0,xianshi[0]);
          lcd_string(1,0,xianshi[1]);
          play_data();
          datain=0;
      }
  }
}



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

使用道具 举报

该用户从未签到

3

主题

11

帖子

0

注册会员

Rank: 2

积分
85
最后登录
2016-7-22
 楼主| 发表于 2015-1-22 20:21:54 | 显示全部楼层
谢谢你们的回答,问题我已解决,是硬件上的问题。
回复 支持 1 反对 0

使用道具 举报

该用户从未签到

1

主题

802

帖子

0

金牌会员

Rank: 6Rank: 6

积分
1763
最后登录
1970-1-1
发表于 2015-1-4 16:44:08 | 显示全部楼层
你先别释放接收缓冲区,看看接收中断标志位
回复 支持 反对

使用道具 举报

  • TA的每日心情
    开心
    2021-12-10 16:14
  • 签到天数: 1442 天

    连续签到: 1 天

    [LV.10]以坛为家III

    17

    主题

    3862

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    8291
    最后登录
    2021-12-10
    发表于 2015-1-4 19:11:06 | 显示全部楼层
    没有接收到资料?那发送呢?有时候这2者是有关连的。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2019-4-1 22:48
  • 签到天数: 302 天

    连续签到: 1 天

    [LV.8]以坛为家I

    87

    主题

    7322

    帖子

    4

    金牌会员

    Rank: 6Rank: 6

    积分
    4614
    最后登录
    2021-1-25
    发表于 2015-1-4 22:00:15 | 显示全部楼层
    你设置的中断有没有一点点去检查呢,主要是地址
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    24

    主题

    252

    帖子

    0

    高级会员

    Rank: 4

    积分
    504
    最后登录
    1970-1-1
    发表于 2015-1-4 22:34:07 | 显示全部楼层
    在初始化中关于SCAN的系统时钟是不是没有ENABLE??
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    6

    帖子

    0

    注册会员

    Rank: 2

    积分
    56
    最后登录
    2019-12-11
    发表于 2015-2-11 16:25:46 | 显示全部楼层
    psypj 发表于 2015-1-22 20:21
    谢谢你们的回答,问题我已解决,是硬件上的问题。

    楼主,我也遇到同样的问题,可以发送,但不能接收。请问你具体怎么解决的?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    1

    帖子

    0

    新手上路

    Rank: 1

    积分
    4
    最后登录
    2016-6-10
    发表于 2016-6-10 22:00:07 | 显示全部楼层
    psypj 发表于 2015-1-22 20:21
    谢谢你们的回答,问题我已解决,是硬件上的问题。

    遇到类似的问题,能不能留个QQ请教你一下
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-7-20 14:01 , Processed in 0.102911 second(s), 29 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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