⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 232tocan.c

📁 RS232/CAN转换器 硬件电路需自己设计(电路很简单)
💻 C
📖 第 1 页 / 共 4 页
字号:
            
                BASIC_TX_ID1 = Can_txbuf[0];
                BASIC_TX_ID2 = Can_txbuf[1];
            
                //发送请求
                BASIC_COMMAND_REG = TR_CMD;
                //PELI_COMMAND_REG = SRR_CMD;
            
                t_b = 0;
                //发送是否完毕
                while ((BASIC_STATUS_REG & 0x0c) != 0x0c)
                {
                    Somenop();
                    //超时处理
                    if (++t_b == 255)
                    {
                        Can_err = 1;
                        return;        
                    }
                }
                SEND_LED = 0;
            }
            else
            {
                //数据总长度
                length = Can_txcount - 2;
                length1 = length / 8;
                length2 = length % 8;
                //数据区起始位置
                length = 2;
                
                //8的整倍数
                if (length1 > 0)
                {
                    for (t_a = 0; t_a < length1; t_a++)
                    {
                        t_b = 0;
                        //无发送
                        while ((BASIC_STATUS_REG & 0x20) > 0)
                        {
                            Somenop();
                            //超时处理
                            if (++t_b == 255)
                            {
                                Can_err = 1;
                                return;        
                            }
                        }
                        
                        BASIC_TX_ID1 = Can_txbuf[0];
                        BASIC_TX_ID2 = (Can_txbuf[1] & 0xf0) | 0x08;
                        
                        for (t_b = 0; t_b < 8; t_b++)
                        {
                            PBYTE[12 + t_b] = Can_txbuf[length++];
                        }
                        
                        //发送请求
                        BASIC_COMMAND_REG = TR_CMD;
                        //PELI_COMMAND_REG = SRR_CMD;
                        
                        t_b = 0;
                        //发送是否完毕
                        while ((BASIC_STATUS_REG & 0x0c) != 0x0c)
                        {
                            Somenop();
                            //超时处理
                            if (++t_b == 255)
                            {
                                Can_err = 1;
                                return;        
                            }
                        }
                        SEND_LED = 0;
                    }
                }
                
                //小于8
                if (length2 > 0)
                {                                  
                    t_b = 0;
                    //无发送
                    while ((BASIC_STATUS_REG & 0x20) > 0)
                    {
                        Somenop();
                        //超时处理
                        if (++t_b == 255)
                        {
                            Can_err = 1;
                            return;        
                        }
                    }
                        
                    BASIC_TX_ID1 = Can_txbuf[0];
                    BASIC_TX_ID2 = (Can_txbuf[1] & 0xf0) | length2;
                        
                    for (t_b = 0; t_b < length2; t_b++)
                    {
                        PBYTE[12 + t_b] = Can_txbuf[length++];
                    }
                        
                    //发送请求
                    BASIC_COMMAND_REG = TR_CMD;
                    //PELI_COMMAND_REG = SRR_CMD;
                        
                    t_b = 0;
                    //发送是否完毕
                    while ((BASIC_STATUS_REG & 0x0c) != 0x0c)
                    {
                        Somenop();
                        //超时处理
                        if (++t_b == 255)
                        {
                            Can_err = 1;
                            return;        
                        }
                    }
                    SEND_LED = 0;                    
                }
            }
        }
        */
    }
    //PeliCAN
    else
    {
        //标准帧
        if ((Can_txbuf[1] & 0x80) == 0)
        {
            //是否为远程帧
            if ((Can_txbuf[1] & 0x40) > 0)
            {
                t_b = 0;
                //无接收、发送
                while ((PELI_STATUS_REG & 0x30) > 0)
                {
                    Somenop();
                    //超时处理
                    if (++t_b == 255)
                    {
                        Can_err = 1;
                        return;        
                    }
                }  
                    
                TX_FRAME_INFO = Can_txbuf[1]; 
                
                var.t[0] = Can_txbuf[2];
                var.t[1] = Can_txbuf[3];
                var.cc <<= 5;
                
                PELI_TX_ID1 = var.t[0];
                PELI_TX_ID2 = var.t[1];
                    
                //发送请求
                PELI_COMMAND_REG = TR_CMD;
                //PELI_COMMAND_REG = SRR_CMD;
                    
                t_b = 0;
                //发送是否完毕
                while ((PELI_STATUS_REG & 0x0c) != 0x0c)
                {
                    Somenop();
                    //超时处理
                    if (++t_b == 255)
                    {
                        Can_err = 1;
                        return;        
                    }
                }
                SEND_LED = 0;    
            }
            else
            {                          
                t_b = 0;
                //无发送
                while ((PELI_STATUS_REG & 0x30) > 0)
                {
                    Somenop();
                    //超时处理
                    if (++t_b == 255)
                    {
                        Can_err = 1;
                        return;        
                    }
                }
                
                //数据总长度
                length = Can_txcount - 7;
                
                TX_FRAME_INFO = length;
                
                var.t[0] = Can_txbuf[2];
                var.t[1] = Can_txbuf[3];
                var.cc <<= 5;
                
                PELI_TX_ID1 = var.t[0];
                PELI_TX_ID2 = var.t[1];  
                
                t_a = 4;       
                for (t_b = 0; t_b < length; t_b++)
                {
                    PBYTE[19 + t_b] = Can_txbuf[t_a++];
                }
                        
                //发送请求
                PELI_COMMAND_REG = TR_CMD;
                        
                //PELI_COMMAND_REG = SRR_CMD;
                        
                t_b = 0;
                //发送是否完毕
                while ((PELI_STATUS_REG & 0x0c) != 0x0c)
                {
                    Somenop();
                    //超时处理
                    if (++t_b == 255)
                    {
                        Can_err = 1;
                        return;        
                    }
                }
                SEND_LED = 0;                                      
            }
        }
        /*
        //扩展帧
        else
        {
            //至少五个字节
            if (Can_txcount > 4)
            {
                //是否为远程帧
                if ((Can_txbuf[0] & 0x40) > 0)
                {
                    t_b = 0;
                    //无接收、发送
                    while ((PELI_STATUS_REG & 0x30) > 0)
                    {
                        Somenop();
                        //超时处理
                        if (++t_b == 255)
                        {
                            Can_err = 1;
                            return;        
                        }
                    }  
                    
                    TX_FRAME_INFO = Can_txbuf[0];  
                    PELI_TX_ID1 = Can_txbuf[1];
                    PELI_TX_ID2 = Can_txbuf[2];
                    PELI_TX_ID3 = Can_txbuf[3];
                    PELI_TX_ID4 = Can_txbuf[4];
                    
                    //发送请求
                    PELI_COMMAND_REG = TR_CMD;
                    //PELI_COMMAND_REG = SRR_CMD;
                    t_b = 0;
                    //发送是否完毕
                    while ((PELI_STATUS_REG & 0x0c) != 0x0c)
                    {
                        Somenop();
                        //超时处理
                        if (++t_b == 255)
                        {
                            Can_err = 1;
                            return;        
                        }
                    }
                    SEND_LED = 0;    
                }
                else
                {
                    //数据总长度
                    length = Can_txcount - 5;
                    length1 = length / 8;
                    length2 = length % 8;
                    //数据区起始位置
                    length = 5;
                
                    //8的整倍数
                    if (length1 > 0)
                    {
                        for (t_a = 0; t_a < length1; t_a++)
                        {
                            t_b = 0;
                            //无发送
                            while ((PELI_STATUS_REG & 0x30) > 0)
                            {
                                Somenop();
                                //超时处理
                                if (++t_b == 255)
                                {
                                    Can_err = 1;
                                    return;        
                                }
                            }
                        
                            TX_FRAME_INFO = 0x88;  
                            PELI_TX_ID1 = Can_txbuf[1];
                            PELI_TX_ID2 = Can_txbuf[2];
                            PELI_TX_ID3 = Can_txbuf[3];
                            PELI_TX_ID4 = Can_txbuf[4];
                        
                            for (t_b = 0; t_b < 8; t_b++)
                            {
                                PBYTE[21 + t_b] = Can_txbuf[length++];
                            }
                        
                            //发送请求
                            PELI_COMMAND_REG = TR_CMD;
                            //PELI_COMMAND_REG = SRR_CMD;
                            t_b = 0;
                            //发送是否完毕
                            while ((PELI_STATUS_REG & 0x0c) != 0x0c)
                            {
                                Somenop();
                                //超时处理
                                if (++t_b == 255)
                                {
                                    Can_err = 1;
                                    return;        
                                }
                            }
                            SEND_LED = 0;
                        }
                    }
                
                    //小于8
                    if (length2 > 0)
                    {                                  
                        t_b = 0;
                        //无发送
                        while ((PELI_STATUS_REG & 0x30) > 0)
                        {
                            Somenop();
                            //超时处理
                            if (++t_b == 255)
                            {
                                Can_err = 1;
                                return;        
                            }
                        }
                        
                        TX_FRAME_INFO = (Can_txbuf[0] & 0x80) | length2;  
                        PELI_TX_ID1 = Can_txbuf[1];
                        PELI_TX_ID2 = Can_txbuf[2];
                        PELI_TX_ID1 = Can_txbuf[3];
                        PELI_TX_ID2 = Can_txbuf[4];
                        
                        for (t_b = 0; t_b < length2; t_b++)
                        {
                            PBYTE[21 + t_b] = Can_txbuf[length++];
                        }
                        
                        //发送请求
                        PELI_COMMAND_REG = TR_CMD;
                        //PELI_COMMAND_REG = SRR_CMD;
                        t_b = 0;
                        //发送是否完毕
                        while ((PELI_STATUS_REG & 0x0c) != 0x0c)
                        {
                            Somenop();
                            //超时处理
                            if (++t_b == 255)
                            {
                                Can_err = 1;
                                return;        
                            }
                        }
                        SEND_LED = 0;                    
                    }                    
                }
            }
        }
        */
    }
}
void Com_send_data(void)
{
    uchar t_a;
    
    //串口正在发送数据,不启动
    if (!Com_send_now && Com_send_ready)
    {
        Com_txbuf[0] = COM_HEAD;
        Com_txbuf[1] = Can_rxbuf[0];
        Com_txbuf[2] = Can_rxbuf[1];
        Com_txbuf[3] = Can_rxbuf[2];
        
        Sum_data(&Can_rxbuf[0], Can_rxcount);
        
        Com_txcount = 4;
        
        //数据帧
        if (Can_rxcount != 3)
        {
            for (t_a = 3; t_a < Can_rxcount; t_a++)
            {
                Com_txbuf[Com_txcount++] = Can_rxbuf[t_a];
            }
        }
        
        //累加和
        Com_txbuf[Com_txcount++] = Add.t[0];
        Com_txbuf[Com_txcount++] = Add.t[1];
        Com_txbuf[Com_txcount++] = COM_END;
        
        //释放CAN接收缓冲区
        Can_rxcount = 0;
        Com_send_ready = 0;
        
        //启动发送
        Com_send_now = 1;
        Telcom = Com_txbuf;
        SBUF = *Telcom;
    }
}
//主程序
void main(void)
{		
	WP = 0;                //一上电,默认使用内部扩展RAM
	
	X5045_init();          //初始化SPI总线
	
	Mcu_init();            //MCU初始化
	
	Dog();                 //喂狗        
	
	Write_reg(BO);         //禁止保护 
	
	Clear_blank();         //是否对X5045各单元初始化参数
	
	Read_cs();             //从EEPROM中读出各参数
    
	Debug_config();        //调试程序处理
    
	Write_reg(BL);         //开启保护  
	
	Baudrate(ComBaud);     //串口波特率设置     
	
	AUXR = EXRAM_ENABLE;   //关闭内部扩展RAM,访问外部扩展RAM
	
	Can_config();          //CAN初始化配置
	
	for (;;)
	{		
		Dog();
		
	    Com_send_data();	
    
		Can_send_data();   //CAN发送数据
		
		//CAN通讯出错
		if (_testbit_(Can_err))
		{
		    Can_config();          //CAN初始化配置
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -