我用的ATmega16单片机,sja1000的ALE、RD、WR、CS、RST分别和单片机的PD7,PD5,PD6,PC7,PC6连接。下面是一部分程序:<br />#define REG_CONTROL 0x00 //内部控制寄存器<br />#define REG_COMMAND 0x01 //命令寄存器<br />#define REG_STATUS 0x02 //状态寄存器<br />#define REG_INTERRUPT 0x03 //中断寄存器<br />#define REG_ACR 0x04 //验收代码寄存器<br />#define REG_AMR 0x05 //验收屏蔽寄存器<br />#define REG_BTR0 0x06 //总线定时寄存器0 <br />#define REG_BTR1 0x07 //总线定时寄存器1 <br />#define REG_OCR 0x08 //输出控制寄存器<br />//以address为地址,从sja1000中读取一个字节<br />uchar BYTEREAD(uchar address)<br />{<br /> uchar mid;<br /> PORTC&=~BIT(7); //片选信号有效<br /> PORTD|=BIT(7); //置ALE为1<br /> DDRA= 0xff; //设置A口为输出<br /> PORTA= address; //A口输出地址<br /> PORTD&=~BIT(7); //置ALE为0<br /> DDRA= 0x00; //设置A口为输入<br /> PORTD&=~BIT(5); //读信号有效<br /> mid = PINA;<br /> PORTD|=BIT(5); //读信号置1<br /> PORTC|=BIT(7); //片选信号置1<br /> return mid;<br />}<br /><br />//以address为地址,向sja1000中写一个字节<br />void BYTEWRITE(uchar address,uchar x)<br />{<br /> uchar mid;<br /> PORTC&=~BIT(7); //片选信号有效<br /> PORTD|=BIT(7); //置ALE为1<br /> DDRA= 0xff; //设置A口为输出<br /> PORTA= address; //A口输出地址<br /> PORTD&=~BIT(7); //置ALE为0<br /> PORTD&=~BIT(6); //写信号有效<br /> PORTA = x; //A口输出数据<br /> PORTD|=BIT(6); //写信号置1<br /> PORTC|=BIT(7); //片选信号置1 <br />}<br /><br />//can总线的复位程序<br />void CAN_RESET(void)<br />{<br /> PORTC&=~BIT(6); //CAN总线复位<br /> PORTC|=BIT(6); <br /> CLI();//禁止中断<br /> BYTEWRITE(REG_CONTROL,0x01);<br /> while(((BYTEREAD(REG_CONTROL))&0x01)==0)<br /> {<br /> BYTEWRITE(REG_CONTROL,0x01);<br /> }<br /> BYTEWRITE(REG_CDR,0x48);<br /> BYTEWRITE(REG_COMMAND,0x0E);<br /> BYTEWRITE(REG_ACR,0x01);<br /> BYTEWRITE(REG_AMR,0x00);<br /> BYTEWRITE(REG_OCR,0xaa);<br /> BYTEWRITE(REG_BTR0,0x01);<br /> BYTEWRITE(REG_BTR1,0x1c); //250kbps<br /> BYTEWRITE(REG_CONTROL,0x1F);<br /> BYTEWRITE(REG_CONTROL,0x1E);<br /> while(((BYTEREAD(REG_CONTROL))&0x01)==1)<br /> { <br /> PORTC&=~0x04;<br /> BYTEWRITE(REG_CONTROL,0x1E);//问题出在这里<br /> }<br />}<br /><br />请教各位高手,现在我的问题是当我给sja1000的控制器写值0x1E(让它回到操作模式)<br />却进入了上面程序的“问题出在这里”,而且奇怪的是sja1000的复位脚的电平是高电平,那就说明回到了操作模式,可是又怎么会进入到这个里面去呢?(我怎么觉得好象sja1000的内部控制器的值一直保持为0x01没变)请问这个问题怎么解决啊,谢谢!!<br /> <br /> <br /> |
|