搜索
bottom↓
回复: 0

SJA1000能正常发送和自收发,但只听模式不能工作

[复制链接]

出0入0汤圆

发表于 2012-8-16 17:20:30 | 显示全部楼层 |阅读模式
最近用STC单片机+SJA1000+82C250组成CAN通信,在PeliCAN模式下,自收发和正常模式都能正常工作,但在只听模式时不能工作,求高手指点
程序如下:

unsigned char Read_SJA1000(unsigned char Addr)        //读SJA1000 寄存器的值 ;
{
   unsigned char Buf;
   Buf = *(SJA_base_addr+Addr);
   return(Buf);
}


void Write_SJA1000(unsigned char Addr,unsigned char Data)//写值到SJA1000 指定的寄存器。地址,值                  发送数据
{       
      *(SJA_base_addr+Addr) = Data;
}

void WriteSJARegBlock(unsigned char addr,unsigned char *Pbuf,unsigned char len)        //地址,数组,长度,        向SJA1000 发送缓冲寄存器 写数组           发送数据
{
    unsigned char i;
    for(i=0;i<len;i++)
    {
        Write_SJA1000(addr+i,*Pbuf);
        Pbuf++;
    }
}

void SJAEntryResetMode()   //进入复位模式
{
    unsigned char Judge;
    Judge = Read_SJA1000(CAN_MOD);
    Judge = Judge | 0x01;
    do
    {
        Write_SJA1000(CAN_MOD,Judge);
     }while((Read_SJA1000(CAN_MOD)&0x01)==0);  //等待进入复位模式
}

void SJAQuitResetMode()                //退出复位模式,进入工作模式
{
    unsigned char Judge;
    Judge = Read_SJA1000(CAN_MOD);
    Judge = Judge&0xfe;
    do
    {
        Write_SJA1000(CAN_MOD,Judge);
     }while((Read_SJA1000(CAN_MOD)&0x01)==1);//等待进入工作模式.
}

void SJA1000_Config_Normal(void)        //SJA1000进入正常模式配置 (复位模式下的配置SJA寄存器)
{
   
    unsigned char RegBuf,BTR0,BTR1;
    BTR0=CAN_Value;
    BTR1=CAN_Value >> 8;                    //设置为波特率通信   
   SJAEntryResetMode();                            //进入复位模式
   Write_SJA1000(CAN_CDR,0xc8);                    //配置时钟分频寄存器,选择PeliCAN模式  f/10          RX0激活,禁止CLOCK输出
   RegBuf = Read_SJA1000(CAN_MOD);                 //读模式寄存器
   RegBuf &= 0x01;
    RegBuf = RegBuf | 0x02;                                          //设置只听模式
   Write_SJA1000(CAN_MOD,RegBuf);                  //配置模式寄存器,选择单滤波
   WriteSJARegBlock(16,Send_CAN_Filter,8); //配置验收代码/屏蔽寄存器
   Write_SJA1000(CAN_BTR0,BTR0);                   //配置总线定时器         波特率=CLK/2/(BRP*(TSEG1+TSEG2)
    Write_SJA1000(CAN_BTR1,BTR1);                   //配置总线定时器         设置为    中高速波特率三次采样
   Write_SJA1000(CAN_OCR,0xaa);                        //配置输出控制寄存器,正常输出模式
   SJAQuitResetMode();                             //退出复位模式,进入工作模式
   Write_SJA1000(CAN_IER,0xA1);                        //打开接收,总线错误中断使能
}

void main(void)
{
   SJA1000_Config_Normal();     //初始化SJA1000
  while(1);
}

以上程序在正常工作模式下能正常运作,但配置成只听不受接受任何数据,连错误中断都没有,求高手解救

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 22:16

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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