CAN总线求助 点击:1337 | 回复:8



gongkongedit

    
  • 精华:1099帖
  • 求助:0帖
  • 帖子:14392帖 | 54470回
  • 年度积分:0
  • 历史总积分:622
  • 注册:2008年9月08日
发表于:2003-10-13 22:56:00
楼主
我用8051和SJA1000做CAN总线,但向控制器SJA1000的模式寄存器写入0x0d后,读出来却是00,请各位大虾指点一二。



windwand

  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 24回
  • 年度积分:0
  • 历史总积分:218
  • 注册:2003年10月07日
发表于:2003-10-10 07:48:00
1楼
朋友,我也对此感兴趣,你我是否可以经常保持联系呢

收益

  • 精华:1帖
  • 求助:0帖
  • 帖子:13帖 | 224回
  • 年度积分:0
  • 历史总积分:282
  • 注册:2003年10月01日
发表于:2003-10-10 09:09:00
2楼
如果不是简单的mistake,很有可能根本就未能成功地访问SJA1000。 仅供参考。

子轩

  • 精华:0帖
  • 求助:0帖
  • 帖子:6帖 | 9回
  • 年度积分:0
  • 历史总积分:77
  • 注册:2003年5月26日
发表于:2003-10-10 20:57:00
3楼
windwand,很高兴能常和你保持联系。

子轩

  • 精华:0帖
  • 求助:0帖
  • 帖子:6帖 | 9回
  • 年度积分:0
  • 历史总积分:77
  • 注册:2003年5月26日
发表于:2003-10-10 21:05:00
4楼
SJA1000的BasicCAN模式和PeliCAN模式的地址0的定义不一样, BasicCAN的地址0为CR,PeliCAN的地址0为MODE. 可我看了很多资料都是先给地址0赋值,再给CDR赋值选择用 BasicCAN模式还是PeliCAN模式,对此我不太明白,请各位指点, 谢谢!

HALFS

  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 13回
  • 年度积分:0
  • 历史总积分:22
  • 注册:2003年6月27日
发表于:2003-10-12 10:55:00
5楼
请问收益先生: 1、如何验证成功访问到SJA1000呢: 2、我遇到的问题是:查询发送时,正接收等待检测标志为0通过,但检测上次发送没有完成等待时进入循环,是否也属于没有访问到目标地址呢,造成数据为零? 请指教!

gz_hjg

  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 14回
  • 年度积分:0
  • 历史总积分:23
  • 注册:2002年8月22日
发表于:2003-10-13 10:29:00
6楼
SJA1000在硬件复位的时候就处于BasicCAN复位模式,测试确认为复位模式之后,如果要进入到PeliCAN模式,则需要操作ClockDivideReg 寄存器模式控制位,因为ClockDivideReg寄存器的改写必须在复位模 式状态下才可写数据,所以初始化过程是先给地址0赋值,再给CDR赋 值选择用BasicCAN模式还是PeliCAN模式 一个8051下的SJA1000初试化例子: /* ********************************************************************************************************* * 初始化CAN控制器 * * 描述 : 1)接收广播地址: 0xFF; * 2)接收本机地址: Node; * 3)总线速率 : 1M bit/s at 24 MHz * 参数 : 无. * 返回 : CAN_NO_ERR : 初始化操作成功. * CAN_ERR_INIT : 初始化操作失败. ********************************************************************************************************* */ INT8U CanInit (void) reentrant { INT16U timeout; timeout = 2000; /*--------------------------------- 设置SJA100T进入复位模式 ---------------------------------------*/ while ((ModeControlReg & RM_RR_Bit ) == 0x00) { ModeControlReg = ModeControlReg | RM_RR_Bit ; if (timeout-- == 0) { return (CAN_ERR_INIT); } } /* 设置PeliCAN 模式,关闭输入比较器,关闭时钟输出Pin. */ ClockDivideReg = CANMode_Bit | CBP_Bit | ClkOff_Bit; InterruptEnReg = 0x00; /* 禁止CAN控制器中断. */ /*------------------------------ 滤波器分组1: 接收广播地址 0xFF -----------------------------------*/ AcceptCode0 = 0xFF; AcceptCode1 = 0xFF; AcceptMask0 = 0xFF; AcceptMask1 = 0x00; /*------------------------------ 滤波器分组2: 接收本机地址 CANNode --------------------------------*/ AcceptCode2 = 0xFF; AcceptCode3 = Module.ID; AcceptMask2 = 0xFF; AcceptMask3 = 0x00; /* 设置总线速率为1M bit/s @ 24 MHz,采样为一次. */ BusTiming0Reg = SJW_1MB_24M | Presc_1MB_24M; BusTiming1Reg = TSEG2_1MB_24M | TSEG1_1MB_24M; OutControlReg = Tx1Float | Tx0PshPull | NormalMode; /* 设置TX1浮空,TX0推挽,正常输出方式. */ timeout = 2000; /*------------ 设置: 清除复位bit; 选择双过滤器模式; 关闭自检测模式,只听模式,休眠模式. -------------*/ do{ ModeControlReg = 0x00; if (timeout-- == 0) { return (CAN_ERR_INIT); } } while ((ModeControlReg & RM_RR_Bit ) != 0x00); InterruptEnReg = 0xFF; /* 开启SJA100T中断. */ EX0 = 1; /* 开放CAN通讯中断. */ return (CAN_NO_ERR); }

收益

  • 精华:1帖
  • 求助:0帖
  • 帖子:13帖 | 224回
  • 年度积分:0
  • 历史总积分:282
  • 注册:2003年10月01日
发表于:2003-10-13 16:14:00
7楼
1、如何验证成功访问到SJA1000呢: 〉在复位状态下,写地址0一个数据,如:0x02,然后再读地址0,如果是同一数据,估计就没什么问题。 2、我遇到的问题是:查询发送时,正接收等待检测标志为0通过,但检测上次发送没有完成等待时进入循环,是否也属于没有访问到目标地址呢,造成数据为零? 〉有这个可能。

HALFS

  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 13回
  • 年度积分:0
  • 历史总积分:22
  • 注册:2003年6月27日
发表于:2003-10-13 22:56:00
8楼
to子轩:检查一下仿真器的数据空间设定是否为硬件空间

热门招聘
相关主题

官方公众号

智造工程师