|
最近用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, 杜汶泽)
|