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

📄 uart_can.c

📁 自己编写的串口-CAN口的转换程序
💻 C
📖 第 1 页 / 共 2 页
字号:
        		cmd[cnt]=pwk->pRXD[Pr];
        		if(cnt==4){
        				if(strncmp((char*)cmd,"$BAUD",5)==0){
        					state='B';
        					CN=7;
        					STAT=2;
        				}
        				else if(strncmp((char*)cmd,"$IDER",5)==0){
        					state='I';
        					CN=12;
        					STAT=2;
        				}
        				else if(strncmp((char*)cmd,"$DATA",5)==0){
        					state='D';
        					CN=13;
        					STAT=2;
        				}
        				else   STAT=0;
        					
        		}break;
        	case 2:
        		switch(state){
        			case 'B':
        				cmd[cnt]=pwk->pRXD[Pr];
        				if(cnt==(CN-1)) {
        					baud[0]=cmd[5];
        					baud[1]=cmd[6];
        					start_CAN ();
        					STAT=0;
        					}break;
        			case 'I':
        				cmd[cnt]=pwk->pRXD[Pr];
        				if(cnt==(CN-1)){
        					 if((cmd[5]=='S')&&(cmd[6]=='T')&&(cmd[7]=='D'))XTD='S';
        					 else if((cmd[5]=='E')&&(cmd[6]=='X')&&(cmd[7]=='T'))XTD='E';
        					 else STAT=0;
        					 switch(XTD){
        					 	case 'S':
        					 		STDID=cmd[8];
        					 		init_msg_object_TX_STD (0x02);
        					 		STAT=0;
        					 		break;
        					 	case 'E':
        					 		tcflong.bytek.hi1=cmd[8];
	      					 		tcflong.bytek.hi0=cmd[9];
	       					 		tcflong.bytek.low1=cmd[10];
	       					 		tcflong.bytek.low0=cmd[11];
	       					 		temp=tcflong.ID>>3;
	      					 		temp|=0xE0000000;
	      					 		tcflong.ID=temp;
	      					 		init_msg_object_TX_EXT (0x01);
	      							STAT=0;
	      							break;
        					 	default :STAT=0;	
        					 	}
        					 
        					}break;
        			case 'D':
        				cmd[cnt]=pwk->pRXD[Pr];
        				if(cnt==(CN-1)){
        					for(i=0;i<8;i++)
        					datas[i]=cmd[i+5];
        					transmit_ON(0x01);
        					STAT=0;
        					}break;
        			default:  STAT=0;
          			}break;
        }
        		
        	cnt++;
        	Pr++;
        	Pr&=pwk->RXDS;
        }
        	pwk->RXDR=Pr;
        	
	}
////////////////////////////////////////////////////////////////////////////////
//uart0中断服务程序
////////////////////////////////////////////////////////////////////////////////
	
void ISR_UART0 (void) interrupt 4
{
	static struct TPWK   *pwk;
	char SFRPAGE_SAVE; 
	SFRPAGE_SAVE = SFRPAGE;  
	SFRPAGE = UART0_PAGE;
	if(RI0==0)   goto END;
	ES0=0;
        pwk=&PWK;
	Pr=pwk->RXDR;
	Pw=pwk->RXDW;
	pwk->pRXD[Pw]=SBUF0;
	RI0=0;
	Pw++;
	Pw&=pwk->RXDS;
	if(Pr!=Pw)pwk->RXDW=Pw;
/*									//DPJ TO PC
		for(i=0;i<12;i++)
	{
		SFRPAGE_SAVE = SFRPAGE;
                 SFRPAGE = UART0_PAGE;
		TI0=0;
		SBUF0=SBUFFER[i];
		while(TI0==0)
			{
			}
	    SFRPAGE = SFRPAGE_SAVE;
            TI0=0;
            i++;
        }
*/
END:    SFRPAGE = SFRPAGE_SAVE;
        ES0=1;
  // PS=1;
}
////////////////////////////////////////////////////////////////////////////////
//CAN Functions
//Clear Message Objects??????????????
////////////////////////////////////////////////////////////////////////////////

void clear_msg_objects (void)
{
	SFRPAGE  = CAN0_PAGE;
	CAN0ADR  = IF1CMDMSK;    // Point to Command Mask Register 1
	CAN0DATL = 0xFF;         // Set direction to WRITE all IF registers to Msg Obj
	for (i=1;i<33;i++)
	{
	    /*一旦CPU把一个message number写到IF1CMDRQST, 一次message transfer就开始了
		因为IF1CMDMSK设置成了WRITE, 所以这里的message transfer是将Message
		Buffer(IF1 DATA A1, A2)的数据传到Message Object*/
	      CAN0ADR = IF1CMDRQST; // Write blank (reset) IF registers to each msg obj
	      CAN0DATL = i;
	    }
	}


////////////////////////////////////////////////////////////////////////////////
//Initialize Message Object for extended frame TX
////////////////////////////////////////////////////////////////////////////////

void init_msg_object_TX_EXT (char MsgNum)
{
	  char old_SFRPAGE;
	  old_SFRPAGE = SFRPAGE;
	  SFRPAGE = CAN0_PAGE;
	  CAN0ADR = IF1CMDMSK;  // Point to Command Mask 1
	  CAN0DAT = 0x00B2;     // Set to WRITE, & alter all Msg Obj except ID MASK bits
	  //CAN0DAT = 0x00B7;     // Set to WRITE, & alter all Msg Obj except ID MASK bits
	  CAN0ADR = IF1ARB1;    // Point to arbitration1 register
	  
	  CAN0DATH = tcflong.bytek.low1;     
	  CAN0DATL = tcflong.bytek.low0;
	  CAN0ADR = IF1ARB2;
	  CAN0DATH = tcflong.bytek.hi1;     
	  CAN0DATL = tcflong.bytek.hi0;
	
	  /***********************************
	  CAN0DAT = 0x7FE0;     // Set arbitration1 ID to highest priority
	  CAN0DAT = 0xE040;     // Autoincrement to Arb2 high byte:
	                        // Set MsgVal bit, extended ID, Dir = WRITE
	                        //发送ID号为:0203FF
	   *********************************************/                     
	  CAN0DAT = 0x0088;     // Msg Cntrl: DLC = 8, remote frame function not enabled
	  CAN0ADR = IF1CMDRQST; // Point to Command Request reg.
	  CAN0DAT = MsgNum;     // Select Msg Obj passed into function parameter list
	                        // --initiates write to Msg Obj
	  // 3-6 CAN clock cycles to move IF reg contents to the Msg Obj in CAN RAM.
	  SFRPAGE = old_SFRPAGE;
}

////////////////////////////////////////////////////////////////////////////////
//Initialize Message Object for standard frame TX
////////////////////////////////////////////////////////////////////////////////

void init_msg_object_TX_STD (char MsgNum)
{
	char old_SFRPAGE;
	unsigned int temp = 0;
	
	old_SFRPAGE = SFRPAGE;

	SFRPAGE = CAN0_PAGE;

	CAN0ADR = IF1CMDMSK;
	CAN0DATL = 0xBB;

	CAN0ADR = IF1ARB1;
	CAN0DAT = 0x0010;   //ARBITRATION1
	CAN0ADR = IF1ARB2;
	temp=STDID<<2;//标准id为ID28-ID18,所以要左移2位
	temp &=0x1FFF;
	temp|=0xA000;
	CAN0DAT = temp; //地址自增,指向IF1 Arbitration Registers2
	CAN0DAT = 0x0088; //发送8个字节Message control register
	//LOST
	CAN0ADR = IF1CMDRQST;
	CAN0DAT = MsgNum;
	/*IF1 Command Request Registers=MsgNum,将以上配置写入MsgNum号消息*/

	SFRPAGE = old_SFRPAGE; 
	}
////////////////////////////////////////////////////////////////////////////////
//Start CAN
////////////////////////////////////////////////////////////////////////////////

void start_CAN (void)
{
char old_SFRPAGE;
	
	old_SFRPAGE = SFRPAGE;
	SFRPAGE = CAN0_PAGE;
	CAN0CN  |= 0x41;
	CAN0ADR = BITREG;		
//	CAN0DAT  = 0x5EC1;      	//bit rate,250K,5EC1
	                               
	CAN0DATH=baud[0];
	CAN0DATL=baud[1];				
	//其他的控制位,如MASK,ARB AND SO ON我已写入,这次只写TxRqst和Data
	CAN0ADR  = IF1CMDMSK;  // Point to Command Mask 1
        CAN0DAT  = 0x0087;     // Config for TX : WRITE to CAN RAM, write data bytes,
                               // set TXrqst/NewDat, clr IntPnd	
	                       // RX-IF2 operation may interrupt TX-IF1 operation
        CAN0ADR  = IF2CMDMSK;  // Point to Command Mask 2
	                        //CONTROL有啥用?
        CAN0DATL = 0x1F;       // Config for RX : READ CAN RAM, read data bytes,

	//为什么要2个都置中断,一个不行
	CAN0CN  &= ~0x41;
	CAN0CN  = 0x02;         // Global Int. Enable IE

    SFRPAGE = old_SFRPAGE; 
}

////////////////////////////////////////////////////////////////////////////////
//Transmit CAN frame to turn other node's LED ON
////////////////////////////////////////////////////////////////////////////////

void transmit_ON (char MsgNum)
{
	  int j;
	  SFRPAGE  = CAN0_PAGE;  // IF1 already set up for TX
	  CAN0ADR  = IF1CMDMSK;  // Point to Command Mask 1
	  CAN0DAT  = 0x0087;     // Config to WRITE to CAN RAM, write data bytes,
	                         // set TXrqst/NewDat, Clr IntPnd
	  CAN0ADR  = IF1DATA1;   // Point to 1st byte of Data Field
	  for(j=1;j<8;j++)
	  {
	  CAN0DATH = datas[j];        //IF1DATA1
	  CAN0DATL = datas[j-1];        //IF1DATA2,顺序为00 01 02 03
	  j++;
	   };
	  CAN0ADR  = IF1CMDRQST; // Point to Command Request Reg.
	  CAN0DATL = MsgNum;     // Move new data for TX to Msg Obj "MsgNum"

}

⌨️ 快捷键说明

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