打印
[CAN-bus/DeviceNet]

有哪位用过PIC18F2580的CAN功能

[复制链接]
4085|6
手机看帖
扫描二维码
随时随地手机跟帖
沙发
dawai|  楼主 | 2007-2-28 09:02 | 只看该作者

接收端寄存器什么也收不到啊

我搭建了这样一个硬件电路:用两套PIC18F2580和82C250分别构成发送数据端和接收数据端。发送数据端应该没问题,用示波器可以观察到一串串的波形,经过82C250收发器后,在PIC18F2580接收引脚也看到波形变化,但是在线调试时接收寄存器不变化。

使用特权

评论回复
板凳
wxj1952| | 2007-2-28 13:39 | 只看该作者

其实特简单

根本不用示波器。设置好并打开发送中断,发送一帧后,如果发送中断发生,说明发送端正常发出,并且接收端工作正常,已接收到总线上的帧并且回复了ACK。(没有ACK,发送中断是不会发生的。)
此时接收端没有产生接收中断或者发送数据没有进入接收缓存,是因为滤波器设置的ID与发送帧ID不一致。检验方法很简单,把接收端滤波器ID设置为全局ID,接收网络上所有帧即可。

如果发送中断不发生,那就是你判断错了,你说发送正常?(即使接收端不正常,也不能肯定发送正常。)
不过即使那样也很简单,把两个节点的功能换位一下,让B发送,A接收。(凡是初始化正常的节点都能正确识别网络上的帧,并发出ACK信号。)

 一个节点,不是发送器就是接收器。不在发送状态的节点必是接收器。它自动监视网络工作使得一个正常发送帧完成的节点能够进入中断/停止重发。

使用特权

评论回复
地板
dawai|  楼主 | 2007-2-28 20:23 | 只看该作者

帮我看看吧

谢谢大家帮忙啦。下面分别是发送单片机和接收单片机的程序,肯请帮我看看哪里出错了,
//发送数据,第一片PIC18F2580的发送数据程序
#include "p18f2580.h"                        
char    CAN_TX_Adress_H,CAN_TX_Adress_L;    

void    initial()
{
//    TRISC=0;
    INTCON=0x00;            
    ADCON1=0X07;                
    PIE1=0;                                
    PIE2=0;                        
    PIE3=0;                        
}    

void    initcan()
{
    TXB0CONbits.TXREQ=0;
    CAN_TX_Adress_H=0x33;    
    CAN_TX_Adress_L=0xe0;
    CAN_TX_Adress_L=CAN_TX_Adress_L&0xe0;        
    
    TRISB=(TRISB|0x08)&0XFB;
    CANCON=0X80;                
    while((CANSTAT&0X80)==0)    
    {                            
        ;
    }                                
    BRGCON1=0;                
    BRGCON2=0X90;            
    BRGCON3=0X42;            

    TXB0CON=0X03;            
    TXB0SIDL=CAN_TX_Adress_L&0xe0;
    TXB0SIDH=CAN_TX_Adress_H;        
    TXB0DLC=0X08;                    
    TXB0D0=0;                    
    TXB0D1=0;                
    TXB0D2=0;
    TXB0D3=0;
    TXB0D4=0;
    TXB0D5=0;
    TXB0D6=0;
    TXB0D7=0;

    CANCON=0X00;            
    while((CANSTAT&0XE0)!=0)        
    {
        ;
    }
        
}


void main()
{
    initial();                            
    initcan();                    
    RCONbits.IPEN=1;                            
    INTCON=INTCON|0xc0;        
    TXB0CONbits.TXREQ=1;                        
    while(1)
    {
           TXB0CONbits.TXREQ=0;
        if(TXB0CONbits.TXABT==1)
        {            

            TXB0D0=0xff;            
            TXB0D1=0xff;
            TXB0D2=0xff;
            TXB0D3=0xff;
            TXB0D4=0xff;
            TXB0D5=0xff;
            TXB0D6=0xff;
            TXB0D7=0xff;

            TXB0CONbits.TXREQ=1;        
        }
    }
}
//收数据,另一片18F2580的数据接收程序
#include    "p18f2580.h"                        
char       CAN_RX_Adress_H,CAN_RX_Adress_L;
int  CAN_FLAG;
int  i;
void InterruptHandlerHigh(void );

void    initial()
{
    INTCON=0x00;            
    ADCON1=0X07;                
    PIE1=0;                                
    PIE2=0;                        
    PIE3=0;    
    i=0;
    CAN_FLAG=0;                    
}    

void    initcan()
{
    TXB0CONbits.TXREQ=0;
    CAN_RX_Adress_H=0x33;
    CAN_RX_Adress_L=0xe0;
    CAN_RX_Adress_L=CAN_RX_Adress_L&0xe0;        
    
    TRISB=(TRISB|0x08)&0XFB;
    CANCON=0X80;                
    while((CANSTAT&0X80)==0)    
    {                            
        ;
    }                                
    BRGCON1=0;                
    BRGCON2=0X90;            
    BRGCON3=0X42;            

    RXB0SIDL=CAN_RX_Adress_L&0xe0;
    RXB0SIDH=CAN_RX_Adress_H;
    RXB0CON=0x20;
    RXB0DLC=0x08;
    RXB0D0=0;
    RXB0D1=0;
    RXB0D2=0;
    RXB0D3=0;
    RXB0D4=0;
    RXB0D5=0;
    RXB0D6=0;
    RXB0D7=0;
  
    RXF0SIDH=CAN_RX_Adress_H;
    RXF0SIDL=CAN_RX_Adress_L&0xE0;
    RXM0SIDH=0xFF;
    RXM0SIDL=0xE0;

    CANCON=0X00;            
    while((CANSTAT&0XE0)!=0)        
    {
        ;
    }

    PIR3=0;
    PIE3=PIE3|0x01;
    IPR3=IPR3|0x01;        
}

# pragma code InterruptVectorHigh=0x08
void InterruptVectorHigh (void)
{
  _asm
  goto InterruptHandlerHigh
  _endasm
}

# pragma code
# pragma interrupt InterruptHandlerHigh
void InterruptHandlerHigh( )
{
    if(PIR3bits.RXB0IF==1)
    {
          CAN_FLAG=1;            
        PIR3bits.RXB0IF=0;                
        RXB0CONbits.RXFUL=0;                    
    }
}

void main()
{
    initial();                            
    initcan();                            
    RCONbits.IPEN=1;                            
    INTCON=INTCON|0xc0;                            
    while(1)
    {       
     if(CAN_FLAG=1)
      {
         i=++i;
         CAN_FLAG=0;
       }
                  
    }
}
急死人啦,各位一定要帮忙啊

使用特权

评论回复
5
motor666| | 2007-4-26 10:19 | 只看该作者

这样改试试

不要直接用书中的例子,这几个变量要直接赋值:

    INTCON=INTCON|0xc0;   
    RXF0SIDH=CAN_RX_Adress_H;
    RXF0SIDL=CAN_RX_Adress_L&0xE0;
    TRISB=(TRISB|0x08)&0XFB;
    直接写:RXF0SIDH=0xFF;
            RXF0SIDL=0xE0; 等
     另外:
    RXM0SIDH=0x0;
    RXM0SIDL=0x0;
    让所有信息全接收,试试

使用特权

评论回复
6
haididechenai| | 2012-4-15 14:55 | 只看该作者
我也遇到过着个问题,我最终把82C250换成TJA1050就可以了,具体什么问题   不知道。。。

使用特权

评论回复
7
haididechenai| | 2012-4-15 14:55 | 只看该作者
我也遇到过着个问题,我最终把82C250换成TJA1050就可以了,具体什么问题   不知道。。。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

15

帖子

0

粉丝