迪文科技论坛

 找回密码
 立即注册
搜索
查看: 326|回复: 2

【提问】标准帧改扩展帧

[复制链接]

2

主题

1

回帖

75

积分

注册会员

Rank: 2

积分
75
发表于 2023-2-19 16:02:21 | 显示全部楼层 |阅读模式
为什么我的标准帧改扩展帧,对中断9进行了更改,主要为移位操作,利用CAN分析仪与电脑连接后,只能发送更改数字变量的数据,一旦发送文本显示的就会死机呢,就没有通讯了。希望能得到解答。


中断程序如下:
void CAN_Isr() interrupt 9//canÖжϳÌÐò
{
  unsigned char i = 0;
        unsigned long  TempWord = 0;        
        unsigned long TempDWord = 0;
        
        EA = 0;                     //½øÈëCANÖжϷþÎñ³ÌÐòºó£¬¹Ø±Õ×ÜÖжÏ
        if((CAN_IR&0xC0) == 0xC0)   //Ô¶³ÌÖ¡½ÓÊÕÖжϱê¼ÇÖà 1 ÇÒ½ÓÊÕÍê³É±ê¼ÇÖà 1
        {
                CAN_IR &= 0x3F;                //Ô¶³ÌÖ¡½ÓÊÕÖжϱê¼ÇÇåÁãÇÒ½ÓÊÕÍê³É±ê¼ÇÇåÁã
                ADR_H = 0xFF;           //ÅäÖà DGUS±äÁ¿´æ´¢Æ÷µØÖ·
                ADR_M = 0x00;
                ADR_L = 0x68;//0x69;
                ADR_INC = 1;           //ÅäÖõØÖ·ÔöÁ¿
                RAMMODE = 0xAF;        //¶Á²Ù×÷
                while(!APP_ACK);       //µÈ´ýÈ·ÈÏ£¬APP_ACKÓ²¼þ¶Ô8051Õ¼ÓñäÁ¿´æ´¢Æ÷ÇëÇóµÄÓ¦´ð£¬1=OK£¬0=BUSY£¬ÐèÒª¼ÌÐøµÈ´ý¡£
                //FF0068Êý¾Ý
                APP_EN = 1;
                while(APP_EN);       //½ÓÊÕÊý¾Ýµ½»º³åÇø
                rx_buf[12] = DATA3;   
                rx_buf[13] = DATA2;   
                rx_buf[14] = DATA1;   
                rx_buf[15] = DATA0;   
                //FF0069Êý¾Ý
                APP_EN = 1;   
                while(APP_EN);         //½ÓÊÕÊý¾Ýµ½»º³åÇø
                rx_buf[0] = DATA3;
                rx_buf[1] = DATA2;
                rx_buf[2] = DATA1;
                rx_buf[3] = DATA0;
               
                RAMMODE = 0;           //½áÊø¶ÔDGUS±äÁ¿´æ´¢Æ÷µÄ·ÃÎÊ
                rx_done = 1;           //½ÓÊÕÍê³É (Ô¶³ÌÖ¡)
        }
        else if((CAN_IR&0xC0) == 0x40)   //½ÓÊÕÍê³É±ê¼ÇÖà 1
        {
                CAN_IR &= 0xBF;             //½ÓÊÕÍê³É±ê¼ÇλÇåÁã
                ADR_H = 0xFF;
                ADR_M = 0x00;
                ADR_L = 0x68;//0x69
                ADR_INC = 1;         //ÅäÖõØÖ·ÔöÁ¿
                RAMMODE = 0xAF;                 //¶Á²Ù×÷
                while(!APP_ACK);     //µÈ´ýÈ·ÈÏ£¬APP_ACKÓ²¼þ¶Ô8051Õ¼ÓñäÁ¿´æ´¢Æ÷ÇëÇóµÄÓ¦´ð£¬1=OK£¬0=BUSY£¬ÐèÒª¼ÌÐøµÈ´ý¡£
                //FF0068Êý¾Ý
                APP_EN = 1;
                while(APP_EN);       //½ÓÊÕÊý¾Ýµ½»º³åÇø
                rx_buf[12] = DATA3;   
                rx_buf[13] = DATA2;   
                rx_buf[14] = DATA1;   
                rx_buf[15] = DATA0;   
                APP_EN = 1;               
                //FF0069Êý¾Ý
                while(APP_EN);       //½ÓÊÕÊý¾Ýµ½»º³åÇø
                rx_buf[0] = DATA3;   //ID3
                rx_buf[1] = DATA2;   //ID2
                rx_buf[2] = DATA1;   //ID1
                rx_buf[3] = DATA0;   //ID0               
                //FF006AÊý¾Ý
                APP_EN = 1;
                while(APP_EN);
                rx_buf[4] = DATA3;
                rx_buf[5] = DATA2;
                rx_buf[6] = DATA1;
                rx_buf[7] = DATA0;               
                //FF006BÊý¾Ý
                APP_EN = 1;
                while(APP_EN);
                rx_buf[8] = DATA3;
                rx_buf[9] = DATA2;
                rx_buf[10] = DATA1;
                rx_buf[11] = DATA0;
                RAMMODE = 0;             //½áÊø¶ÔDGUS±äÁ¿´æ´¢Æ÷µÄ·ÃÎÊ
                rx_done = 2;                 //½ÓÊÕÍê³É (Êý¾ÝÖ¡)
        }
        if((CAN_IR&0x20) == 0x20)
        {
                CAN_IR &= 0xDF;        //Çå¿Õ·¢ËÍÖ¡±ê¼Çλ
        }
        if((CAN_IR&0x10) == 0x10)
        {
                CAN_IR &= 0xEF;        //Çå¿Õ½ÓÊÕÒç³ö±ê¼Çλ
        }
        if((CAN_IR&0x08) == 0x08)
        {
                CAN_IR &= 0xF7;        //Çå¿Õ´íÎó±ê¼Çλ
                CAN_ET &= 0xE0;        //Çå¿Õ´íÎó±ê¼Ç        
        }
        if((CAN_IR&0x04) == 0x04)
        {
                CAN_IR &= 0xFB;        //Çå¿ÕÖÙ²Ãʧ°Ü±ê¼Çλ
                CAN_CR |= 0x04;        //ÖØÐÂÆô¶¯·¢ËÍ        
        }
  EA = 1;         
        if((rx_buf[12]&0x40) == 0x40)
    {      
           Rx_Message.RTR = 1;     //Ô¶³ÌÖ¡
                }
                else         
        {               
           Rx_Message.RTR = 0;     //Êý¾ÝÖ¡
        }         
    if((rx_buf[12]&0x80) == 0x80)
    {      
           Rx_Message.IDE = 1;     //À©Õ¹Ö¡
    }
        else        
        {               
           Rx_Message.IDE = 0;     //±ê×¼Ö¡
        }   
        Rx_Message.len = (rx_buf[12]&0x0f);
        
        if(Rx_Message.IDE == 0)    //±ê×¼Ö¡
        {
//                  TempWord=(rx_buf[0]+rx_buf[1]+rx_buf[2]+rx_buf[3]);
//                  Rx_Message.Id =(TempWord>>18);
           TempWord = ((unsigned int)rx_buf[0])<<3;
           Rx_Message.Id = TempWord|((rx_buf[1]&0xe0)>>5);
        }
        else
        {
           TempDWord = ((unsigned long)rx_buf[0])<<21;
           TempDWord |= (((unsigned long)rx_buf[1])<<13);           
           TempDWord |= (((unsigned long)rx_buf[2])<<5);
           Rx_Message.Id = TempDWord|((rx_buf[3]&0xf8)>>3);
        }

        for(i=1;i<9;i++)
        {
                Rx_Message.Data = rx_buf[i+3];
        }
        Can_RX_Data_Parse();
        //DWIN_CANRxData_Process();
}

发送程序如下:

void Can_RX_Data_Parse()//½ÓÊÕ³ÌÐò
{
        //unsigned char i=0;
        u16 value_3[4]={0};
        u16 value[5]={0};
  unsigned char temp_word[8]={0};
        unsigned char temp_word_1[8]={0};

                if(Rx_Message.Id==0x180BA001)
                {
                temp_word[0]=Rx_Message.Data[1];
                temp_word[1]=Rx_Message.Data[2];        
                temp_word[2]=Rx_Message.Data[3];
                temp_word[3]=Rx_Message.Data[4];        
                temp_word[4]=Rx_Message.Data[5];
                temp_word[5]=Rx_Message.Data[6];        
                temp_word[6]=Rx_Message.Data[7];
    temp_word[7]=Rx_Message.Data[8];
                        
                value_3[0]=((u16)temp_word[1]<<8)+temp_word[0]; //AÏàµçѹ
                value_3[1]=((u16)temp_word[3]<<8)+temp_word[2]; //BÏàµçѹ
                value_3[2]=((u16)temp_word[5]<<8)+temp_word[4]; //CÏàµçѹ
                value_3[3]=((u16)temp_word[7]<<8)+temp_word[6]; //»·¾³Î¶È
               
                sys_write_vp(0x5020,(u8*)&value_3[0],1);  
                sys_write_vp(0x5030,(u8*)&value_3[1],1);  
                sys_write_vp(0x5040,(u8*)&value_3[2],1);  
                sys_write_vp(0x5050,(u8*)&value_3[3],1);
          }
        if(Rx_Message.Id==0x1801A001)
         {
                temp_word_1[0]=Rx_Message.Data[1];
                temp_word_1[1]=Rx_Message.Data[2];
                temp_word_1[2]=Rx_Message.Data[3];
                temp_word_1[3]=Rx_Message.Data[4];
                temp_word_1[4]=Rx_Message.Data[5];
                temp_word_1[5]=Rx_Message.Data[6];
                temp_word_1[6]=Rx_Message.Data[7];
                temp_word_1[7]=Rx_Message.Data[8];
               
    value[2]=temp_word_1[0];               
                value[0]=((u16)temp_word_1[2]<<8)+temp_word_1[1]; //½âÂëµçѹ1
                value[1]=((u16)temp_word_1[4]<<8)+temp_word_1[3]; //½âÂëµçÁ÷ 1               
    value[3]=((u16)temp_word_1[6]<<8)+temp_word_1[5]; //¹ÊÕÏÐÅÏ¢         
    value[4]=temp_word_1[7];//PFC¹ÊÕÏ        
                //³äµçÄ£¿é״̬               
                if(value[2]==0x00)
                {
                        sys_write_vp(0x3000,(u8*)&FIRST_TXT_1,sizeof(FIRST_TXT_1)/2+1);//Êä³öÕý³£¹Ø»ú״̬
                        sys_delay_ms(5);
                }
                if(value[2]==0x01)
                {
                        sys_write_vp(0x3000,(u8*)&FIRST_TXT_2,sizeof(FIRST_TXT_2)/2+1);//Êä³ö¿ª»ú״̬
                        sys_delay_ms(5);
                }
                if(value[2]==0x11)
                {
                        sys_write_vp(0x3000,(u8*)&FIRST_TXT_3,sizeof(FIRST_TXT_3)/2+1);//Êä³ö¹ÊÕϹػú״̬
                        sys_delay_ms(5);
                }/*
//¹ÊÕϸ澯
                if(value[3]==0x0000)
                {
                        sys_write_vp(0x3050,(u8*)&FIRST_TXT_28,sizeof(FIRST_TXT_28)/2+1);//Êä³öÕý³£
                        sys_write_vp(0x3100,(u8*)&FIRST_TXT_28,sizeof(FIRST_TXT_28)/2+1);//Êä³öÕý³£
                        sys_delay_ms(5);
                }
                if(value[3]==0x0001)
                {
                        sys_write_vp(0x3050,(u8*)&FIRST_TXT_4,sizeof(FIRST_TXT_4)/2+1);//Êä³öÄ£¿éÊäÈëǷѹ
                        sys_write_vp(0x3100,(u8*)&FIRST_TXT_29,sizeof(FIRST_TXT_29)/2+1);//ÎÞ
                        sys_delay_ms(5);
                }
                if(value[3]==0x0002)
                {
                        sys_write_vp(0x3050,(u8*)&FIRST_TXT_5,sizeof(FIRST_TXT_5)/2+1);//Êä³öÄ£¿éÊäÈëȱÏà
                        
                        sys_delay_ms(5);
                }
                if(value[3]==0x0004)
                {
                        sys_write_vp(0x3050,(u8*)&FIRST_TXT_6,sizeof(FIRST_TXT_6)/2+1);//Êä³öÄ£¿éÊäÈë¹ýѹ
                        sys_delay_ms(5);
                }
                if(value[3]==0x0008)
                {
                        sys_write_vp(0x3050,(u8*)&FIRST_TXT_7,sizeof(FIRST_TXT_7)/2+1);//Êä³öÄ£¿éÊä³ö¹ýѹ
                        sys_delay_ms(5);
                }
                if(value[3]==0x0010)
                {
                        sys_write_vp(0x3050,(u8*)&FIRST_TXT_8,sizeof(FIRST_TXT_8)/2+1);//Êä³öÄ£¿éÊä³ö¹ýÁ÷
                        sys_delay_ms(5);
                }
                if(value[3]==0x0020)
                {
                        sys_write_vp(0x3050,(u8*)&FIRST_TXT_9,sizeof(FIRST_TXT_9)/2+1);//Êä³öÄ£¿éζȹý¸ß
                        sys_delay_ms(5);
                }
                if(value[3]==0x0040)
                {
                        sys_write_vp(0x3050,(u8*)&FIRST_TXT_10,sizeof(FIRST_TXT_10)/2+1);//Êä³öÄ£¿é·çÉȹÊÕÏ
                        sys_delay_ms(5);
                }
                if(value[3]==0x0080)
                {
                        sys_write_vp(0x3050,(u8*)&FIRST_TXT_11,sizeof(FIRST_TXT_11)/2+1);//Êä³öÄ£¿éÓ²¼þ¹ÊÕÏ
                        sys_delay_ms(5);
                }
                if(value[3]==0x0180)
                {
                        sys_write_vp(0x3100,(u8*)&FIRST_TXT_11,sizeof(FIRST_TXT_11)/2+1);//Êä³öÄ£¿éÓ²¼þ¹ÊÕÏ
                        sys_write_vp(0x3050,(u8*)&FIRST_TXT_12,sizeof(FIRST_TXT_12)/2+1);//ĸÏßÒì³£
                        sys_delay_ms(5);
                }
                if(value[3]==0x0280)
                {
                        sys_write_vp(0x3100,(u8*)&FIRST_TXT_11,sizeof(FIRST_TXT_11)/2+1);//Êä³öÄ£¿éÓ²¼þ¹ÊÕÏ
                        sys_write_vp(0x3050,(u8*)&FIRST_TXT_13,sizeof(FIRST_TXT_13)/2+1);//SCIͨÐÅÒì³£
                        sys_delay_ms(5);
                }
                if(value[3]==0x0480)
                {
                        sys_write_vp(0x3100,(u8*)&FIRST_TXT_11,sizeof(FIRST_TXT_11)/2+1);//Êä³öÄ£¿éÓ²¼þ¹ÊÕÏ
                        sys_write_vp(0x3050,(u8*)&FIRST_TXT_14,sizeof(FIRST_TXT_14)/2+1);//й·Å¹ÊÕÏ
                        sys_delay_ms(5);
                }
                if(value[3]==0x0880)
                {
                        sys_write_vp(0x3100,(u8*)&FIRST_TXT_11,sizeof(FIRST_TXT_11)/2+1);//Êä³öÄ£¿éÓ²¼þ¹ÊÕÏ
                        sys_write_vp(0x3050,(u8*)&FIRST_TXT_15,sizeof(FIRST_TXT_15)/2+1);//PFCÒì³£¹Ø»ú
                  sys_delay_ms(5);
                }
                if(value[3]==0x1080)
                {
                        sys_write_vp(0x3100,(u8*)&FIRST_TXT_11,sizeof(FIRST_TXT_11)/2+1);//Êä³öÄ£¿éÓ²¼þ¹ÊÕÏ
                        sys_write_vp(0x3500,(u8*)&FIRST_TXT_16,sizeof(FIRST_TXT_16)/2+1);//Ƿѹ¾¯¸æ               
                        sys_delay_ms(5);
                }
                if(value[3]==0x2080)
                {
                        sys_write_vp(0x3100,(u8*)&FIRST_TXT_11,sizeof(FIRST_TXT_11)/2+1);//Êä³öÄ£¿éÓ²¼þ¹ÊÕÏ
                        sys_write_vp(0x3050,(u8*)&FIRST_TXT_17,sizeof(FIRST_TXT_17)/2+1);//¹ýѹ¸æ¾¯               
                        sys_delay_ms(5);
                }
                if(value[3]==0x4000)
                {
                        sys_write_vp(0x3100,(u8*)&FIRST_TXT_11,sizeof(FIRST_TXT_11)/2+1);//Êä³öÄ£¿éÓ²¼þ¹ÊÕÏ
                        sys_write_vp(0x3050,(u8*)&FIRST_TXT_18,sizeof(FIRST_TXT_18)/2+1);//¸ßÎÂÏÞ¹¦ÂÊ                        
                        sys_delay_ms(5);
                }
                if(value[3]==0x8000)
                {
                        sys_write_vp(0x3100,(u8*)&FIRST_TXT_19,sizeof(FIRST_TXT_19)/2+1);//Êä³ö¶Ì·¹ÊÕÏ
                        sys_write_vp(0x3050,(u8*)&FIRST_TXT_29,sizeof(FIRST_TXT_29)/2+1);//ÎÞ
                        sys_delay_ms(5);
                }                 
//PFC¹ÊÕÏ        
                if(value[4]==0x00)
                {
                        sys_write_vp(0x3150,(u8*)&FIRST_TXT_28,sizeof(FIRST_TXT_28)/2+1);//Êä³öÕý³£
                        sys_delay_ms(5);
                }
               
                if(value[4]==0x01)
                {
                        sys_write_vp(0x3150,(u8*)&FIRST_TXT_20,sizeof(FIRST_TXT_20)/2+1);//Êä³öÊäÈë¹ýÁ÷¹ÊÕÏ
                        sys_delay_ms(5);
                }
                if(value[4]==0x02)
                {
                        sys_write_vp(0x3150,(u8*)&FIRST_TXT_21,sizeof(FIRST_TXT_21)/2+1);//Êä³öÊеçƵÂʹÊÕÏ
                        sys_delay_ms(5);
                }
                if(value[4]==0x04)
                {
                        sys_write_vp(0x3100,(u8*)&FIRST_TXT_11,sizeof(FIRST_TXT_11)/2+1);//Êä³öÄ£¿éÓ²¼þ¹ÊÕÏ
                        sys_write_vp(0x3150,(u8*)&FIRST_TXT_22,sizeof(FIRST_TXT_22)/2+1);//Êе粻ƽºâ¹ÊÕÏ               
                        sys_delay_ms(5);
                }
                if(value[4]==0x08)
                {
                        sys_write_vp(0x3150,(u8*)&FIRST_TXT_23,sizeof(FIRST_TXT_23)/2+1);//Êä³öDCTz¹ÊÕÏ
                        sys_delay_ms(5);
                }
                if(value[4]==0x10)
                {
                        sys_write_vp(0x3150,(u8*)&FIRST_TXT_24,sizeof(FIRST_TXT_24)/2+1);//Êä³öµØÖ·³åÍ»
                        sys_delay_ms(5);
                }
                if(value[4]==0x20)
                {
                        sys_write_vp(0x3150,(u8*)&FIRST_TXT_25,sizeof(FIRST_TXT_25)/2+1);//Êä³öĸÏßƫѹ
                        sys_delay_ms(5);
                }
                if(value[4]==0x40)
                {
                        sys_write_vp(0x3150,(u8*)&FIRST_TXT_26,sizeof(FIRST_TXT_26)/2+1);//Êä³öÏàλÒì³£¹ÊÕÏ
                        sys_delay_ms(5);
                }
                if(value[4]==0x80)
                {
                        sys_write_vp(0x3100,(u8*)&FIRST_TXT_11,sizeof(FIRST_TXT_11)/2+1);//Êä³öÄ£¿éÓ²¼þ¹ÊÕÏ
                        sys_write_vp(0x3150,(u8*)&FIRST_TXT_27,sizeof(FIRST_TXT_27)/2+1);//ĸÏß¹ýѹ¹ÊÕÏ               
                        sys_delay_ms(5);
                }        */
                sys_write_vp(0x5100,(u8*)&value[0],1); //µçÁ÷Öµ
    sys_write_vp(0x5110,(u8*)&value[1],1);  //dwin ÏÔʾÊý¾Ý   µçѹֵ                        
        }
          memset(can_receive_data,0,8);        
}



回复

使用道具 举报

0

主题

4

回帖

1033

积分

金牌会员

Rank: 6Rank: 6

积分
1033
发表于 2023-2-20 11:08:19 | 显示全部楼层
您好,跟发数字还是字符无关的,因为本质上都是发的数据值,字符也有对应的ASCII值
回复

使用道具 举报

1

主题

35

回帖

552

积分

高级会员

Rank: 4

积分
552
发表于 2023-2-20 11:15:08 | 显示全部楼层
发送这样发:
case 0:
                                                        {
                                                                        soc = soc + 1;
                                                                        if(soc > 250)
                                                                        {
                                                                                soc = 0;
                                                                        }
                                                                        TestData.Id = 0x1801FFF4;
                                                                        TestData.IDE = 1;
                                                                        TestData.RTR = 0;
                                                                        TestData.len = 8;       
                                                                        TestData.Data[0] = (u8)soc;               
                                                                        TestData.Data[1] = 1;       
                                                                        TestData.Data[2] = 1;
                                                                        TestData.Data[3] = 1;
                                                                        TestData.Data[4] = 1;
                                                                        TestData.Data[5] = 1;               
                                                                        TestData.Data[6] = 1;
                                                                        TestData.Data[7] = 1;
                                                                        CAN_Tx(TestData);
                                                                        //TestData.Id = 0x1801FFF4;
                                                                        //num ++;
                                                                        TestData.Id=0;
                                                                break;


//======================================================
//中断程序这样:
void CAN_Isr(void) interrupt 9
{
    unsigned char i = 0;
        unsigned long  TempWord = 0;       
        unsigned long TempDWord = 0;
       
        ECAN = 0;                     //进入CAN中断服务程序后,关闭CAN中断不关闭总中断EA,以免影响其他的中断导致卡死
        if((CAN_IR&0xC0) == 0xC0)   //远程帧接收中断标记置 1 且接收完成标记置 1
        {
                CAN_IR &= 0x3F;                //远程帧接收中断标记清零且接收完成标记清零
                ADR_H = 0xFF;           //配置 DGUS变量存储器地址
                ADR_M = 0x00;
                ADR_L = 0x68;//0x69;
                ADR_INC = 1;           //配置地址增量
                RAMMODE = 0xAF;        //读操作
                while(!APP_ACK);       //等待确认,APP_ACK硬件对8051占用变量存储器请求的应答,1=OK,0=BUSY,需要继续等待。
                //FF0068数据
                APP_EN = 1;
                while(APP_EN);       //接收数据到缓冲区
                rx_buf[12] = DATA3;   
                rx_buf[13] = DATA2;   
                rx_buf[14] = DATA1;   
                rx_buf[15] = DATA0;   
                //FF0069数据
                APP_EN = 1;   
                while(APP_EN);         //接收数据到缓冲区
                rx_buf[0] = DATA3;
                rx_buf[1] = DATA2;
                rx_buf[2] = DATA1;
                rx_buf[3] = DATA0;
               
                RAMMODE = 0;           //结束对DGUS变量存储器的访问
                rx_done = 1;           //接收完成 (远程帧)
        }
        else if((CAN_IR&0xC0) == 0x40)   //接收完成标记置 1
        {
                CAN_IR &= 0xBF;             //接收完成标记位清零
                ADR_H = 0xFF;
                ADR_M = 0x00;
                ADR_L = 0x68;//0x69
                ADR_INC = 1;         //配置地址增量
                RAMMODE = 0xAF;                 //读操作
                while(!APP_ACK);     //等待确认,APP_ACK硬件对8051占用变量存储器请求的应答,1=OK,0=BUSY,需要继续等待。
                //FF0068数据
                APP_EN = 1;
                while(APP_EN);       //接收数据到缓冲区
                rx_buf[12] = DATA3;   
                rx_buf[13] = DATA2;   
                rx_buf[14] = DATA1;   
                rx_buf[15] = DATA0;   
                APP_EN = 1;               
                //FF0069数据
                while(APP_EN);       //接收数据到缓冲区
                rx_buf[0] = DATA3;   //ID3
                rx_buf[1] = DATA2;   //ID2
                rx_buf[2] = DATA1;   //ID1
                rx_buf[3] = DATA0;   //ID0               
                //FF006A数据
                APP_EN = 1;
                while(APP_EN);
                rx_buf[4] = DATA3;
                rx_buf[5] = DATA2;
                rx_buf[6] = DATA1;
                rx_buf[7] = DATA0;               
                //FF006B数据
                APP_EN = 1;
                while(APP_EN);
                rx_buf[8] = DATA3;
                rx_buf[9] = DATA2;
                rx_buf[10] = DATA1;
                rx_buf[11] = DATA0;
               
                RAMMODE = 0;             //结束对DGUS变量存储器的访问
                rx_done = 2;                 //接收完成 (数据帧)
        }
       
        if((CAN_IR&0x20) == 0x20)   //如果发送标记位置1
        {
                CAN_IR &= 0xDF;               //清空发送帧标记位
        }
        if((CAN_IR&0x10) == 0x10)  //如果接收溢出记位置 1
        {
                CAN_IR &= 0xEF;               //清空接收溢出标记位
        }
        if((CAN_IR&0x08) == 0x08)   //如果错误标记位置 1
        {
                CAN_IR &= 0xF7;               //清空错误标记位
                CAN_ET &= 0xE0;               //清空错误标记位
        }
        if((CAN_IR&0x04) == 0x04)  //如果仲裁失败标记位置 1
        {
                CAN_IR &= 0xFB;               //清空仲裁失败标记位
                CAN_CR |= 0x04;               //重新启动发送       
        }


    if((rx_buf[12]&0x40) == 0x40)
    {      
           Rx_Message.RTR = 1;     //远程帧
    }
        else //if((rx_buf[12]&0x40) == 0x00)       
        {               
           Rx_Message.RTR = 0;     //数据帧
        }         
    if((rx_buf[12]&0x80) == 0x80)
    {      
           Rx_Message.IDE = 1;     //扩展帧
    }
        else //if((rx_buf[12]&0x80) == 0x00)       
        {               
           Rx_Message.IDE = 0;     //标准帧
        }   
        Rx_Message.len = (rx_buf[12]&0x0f);
       
        if(Rx_Message.IDE == 0)    //标准帧
        {
//                  TempWord=(rx_buf[0]+rx_buf[1]+rx_buf[2]+rx_buf[3]);
//                  Rx_Message.Id =(TempWord>>18);
           TempWord = ((unsigned int)rx_buf[0])<<3;
           Rx_Message.Id = TempWord|((rx_buf[1]&0xe0)>>5);
        }
        else //if(Rx_Message.IDE == 1)   //扩展帧
        {
           TempDWord = ((unsigned long)rx_buf[0])<<21;
           TempDWord |= (((unsigned long)rx_buf[1])<<13);          
           TempDWord |= (((unsigned long)rx_buf[2])<<5);
           Rx_Message.Id = TempDWord|((rx_buf[3]&0xf8)>>3);
        }
        for(i=0;i<8;i++)
        {
            Rx_Message.Data[i] = rx_buf[i+4];
        }
       
        Can_RX_Data_Parse();       
       
        ECAN = 1; //处理完成以后最后开中断处理
       
}

总线复位函数时间改长一点
void CanErrorReset(void)  
{
        u16 Temp_N8=0;
        if(CAN_ET&0x20)
        {
                CAN_ET &= 0xDF;
                CAN_CR |= 0x40;
                Delay_us(2000);  //延时必须在2-3ms左右
                CAN_CR &= 0xBF;  
        }
       
}

//专门搞两个读写DGUS函数,读写不关中断
u16 Read_Dgus(u16 Dgus_Addr)
{                              u16 R_Dgus=0;
                        //EA = 0;
                        ADR_H = 0x00;
                        ADR_M = (u8)((Dgus_Addr/2)>>8);
                        ADR_L = (u8)(Dgus_Addr/2);
                        RAMMODE = 0xAF;                //读操作
                        while(!APP_ACK);
                        APP_EN = 1;
                        while(APP_EN);
                        if(Dgus_Addr%2)        R_Dgus = (DATA1<<8)+DATA0;
                        else   R_Dgus=(DATA3<<8)+DATA2;
                        RAMMODE = 0;
                        //EA = 1;
                        return   R_Dgus;               
}
/****************************************************************************/
void Write_Dgus(u16 Dgus_Addr,u16 Val)
{           //EA = 0;
                        ADR_H = 0x00;
                        ADR_M = (u8)((Dgus_Addr/2)>>8);
                        ADR_L = (u8)(Dgus_Addr/2);
                        RAMMODE = 0xAF;                //读操作
                        while(!APP_ACK);
                        APP_EN = 1;
                        while(APP_EN);
                        RAMMODE = 0;
                           ADR_M = (u8)((Dgus_Addr/2)>>8);
                        ADR_L = (u8)(Dgus_Addr/2);
                        RAMMODE = 0x8F;                //写操作
                    while(!APP_ACK);
                        if(Dgus_Addr%2){DATA1=(u8)(Val>>8); DATA0=(u8)(Val); }
                        else { DATA3 =(u8)(Val>>8);        DATA2 =(u8)(Val);}
                    APP_EN = 1;
                        while(APP_EN);
                        RAMMODE = 0;
                        //EA = 1;
}
//接收函数,把中断接收处理标志加进去
void Can_RX_Data_Parse()
{
     unsigned char i=0;
           if((rx_done==1)&&(rx_done_delay==0)){rx_done=0;}//远程
                 else if((rx_done==2)&&(rx_done_delay==0))//标准
                 {
                         rx_done=0;
                                switch(Rx_Message.Id)
                                {
                                        case 0x1801FFF4:
                                        {        
                   unsigned char temp_word[8]={0};
                                                                         Rx_Message.Id=0;
                                                                         for(i=0;i<8;i++)
                                                                         temp_word[i] =Rx_Message.Data[i];
                                                                         Write_Dgus(0x1000,temp_word[0]);//
                                                                         Write_Dgus(0x1001,temp_word[1]);//
                                                                         Write_Dgus(0x1002,temp_word[2]);//
                                                                         Write_Dgus(0x1003,temp_word[3]);//
                                                                         Write_Dgus(0x1004,temp_word[4]);//
                                                                         Write_Dgus(0x1005,temp_word[5]);//
                                                                         Write_Dgus(0x1006,temp_word[6]);//
                                                                         Write_Dgus(0x1007,temp_word[7]);//
                                                                         break;
                                               
                                        }
                                       
                                        case 0x0C09A7F1:
                                        {        
                   unsigned char temp_word[8]={0};
                                                                         Rx_Message.Id=0;
                                                                         for(i=0;i<8;i++)
                                                                         temp_word[i] =Rx_Message.Data[i];
                                                                        Write_Dgus(0x6000,temp_word[0]);//
                                                                         Write_Dgus(0x6001,temp_word[1]);//
                                                                         Write_Dgus(0x6002,temp_word[2]);//
                                                                         Write_Dgus(0x6003,temp_word[3]);//
                                                                         Write_Dgus(0x6004,temp_word[4]);//
                                                                         Write_Dgus(0x6005,temp_word[5]);//
                                                                         Write_Dgus(0x6006,temp_word[6]);//
                                                                         Write_Dgus(0x6007,temp_word[7]);//
                                                                         break;
                                               
                                        }
                                        default:
                                                break;
                                }       
                               
               
                        }
         
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|迪文科技论坛 ( 京ICP备05033781号-1 )

GMT+8, 2025-4-4 05:06 , Processed in 0.034094 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表