write_sja(AMR0,0xff); //设置AMR,所有数据都可接收
write_sja(AMR0,0xff);
write_sja(AMR0,0xff);
write_sja(AMR0,0xff);
write_sja(IER,0x01);
write_sja(CMR,0x0c); //设置命令寄存器,清除数据溢出和释放接收缓冲器
write_sja(MODE,0x08); //进入工作模式
}
/*************************************************
SJA1000发送子程序
*************************************************/
void CanTransmit(void)
{
uchar status;
CLI();
while(!(read_sja(SR)&0x10)); //判断是否正在接收
while(!(read_sja(SR)&0x04)); //等待reg2^2==1,即判断发送缓冲器的状态
write_sja(TXEFF,0x88); //数据的第一个字节,设置成扩展帧,数据长度为8个字节
write_sja(TXID0,0xff); //ID码
write_sja(TXID1,0xff);
write_sja(TXID2,0xff);
write_sja(TXID3,0xff);
write_sja(TXDATA0,0x00); //8个字节的数据
write_sja(TXDATA1,0x11);
write_sja(TXDATA2,0x22);
write_sja(TXDATA3,0x33);
write_sja(TXDATA4,0x44);
write_sja(TXDATA5,0x55);
write_sja(TXDATA6,0x66);
write_sja(TXDATA7,0x77);
write_sja(CMR,0x01); //启动发送
while(!(read_sja(SR) & 0x08));//判断发送是否完成
PORTD ^= BIT(5); //改变小灯状态(程序已能正确运行到这里,每次起动发送后,小灯的状态变化正常)
SEI();
}