发表于:2006-03-02 16:04:00
楼主
硬件电路是按照各种资料上给出的标准电路搭的(SJA1000+PCA82C250方案),唯一有怀疑的地方是SJA1000的复位脚,我直接从ATMEGA8515的RST处给出,不知道有没有影响。
软件部分,看了资料,也看了很多例程,但就是调不通!我现在正利用ZLG的CAN232MB(也就是CAN与232的转换器,利用它可以直接在PC上通过串口调试软件与CAN设备进行通讯)调试,在我的程序里,CAN的发送已经完成,但是在上位机的串口调试软件中没有收到数据。下面是CAN初识化及发送部分的程序:
/*************************************************
初始化SJA1000控制器子程序
*************************************************/
void Init_CAN(void)
{
uchar temp;
do
{
write_sja(MODE,0x01); //进入复位模式
}
while(!(read_sja(MODE)&0x01)); //检测是否已进入复位工作模式
write_sja(BTR0,0x07); //设置时钟分频器,速度为20KHZ
write_sja(BTR1,0x7f);
write_sja(OCR,0x1a); //输出设置,正常模式
write_sja(CDR,0x88); //设置PeliCAN模式,同时禁能CLOCKOUT
write_sja(RXERR,0x00);
write_sja(TXERR,0x00);
write_sja(ECC,0x00);
write_sja(RBSA,0x00); //缓存器起始地址寄存器设置为0
write_sja(ACR0,0x00); //设置ACR
write_sja(ACR1,0x00);
write_sja(ACR2,0x00);
write_sja(ACR3,0x00);
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);
&