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

📄 can.c

📁 基于S3C2410和Wince4.2操作系统的CAN总线驱动
💻 C
字号:
#include<stdlib.h>
#include<string.h>

#include "CAN.h"
#include "def.h"
#include "2410addr.h"
#include "option.h"
#include "GUI.h"
#include "2410lib.h"
#include "lcd.h"
#include "spi.h"
#include "mcp2515.h"

char CAN_Message[8]={};

static int red=1;
static int green=1;
extern int temperature;
int DrawX=210;

#ifdef TFT
int DrawY=119;
#else
int DrawY=268;
extern ROW ROWList[MAXLine];
extern int activerow;
#endif

void can_initMessageStruct(CanMessage* msg)
{
	memset(msg,0,sizeof(CanMessage));
}

unsigned char mcp2515_getNextFreeTXBuf(unsigned char *txbuf_n)
{
	unsigned char res, i, ctrlval;
	unsigned char ctrlregs[MCP_N_TXBUFFERS] = { MCP_TXB0CTRL, MCP_TXB1CTRL, MCP_TXB2CTRL };
	
	res = MCP_ALLTXBUSY;
	*txbuf_n = 0x00;
	
	// check all 3 TX-Buffers
	for (i=0; i<MCP_N_TXBUFFERS; i++) {
		ctrlval = mcp2515_readRegister( ctrlregs[i] );
		if ( (ctrlval & MCP_TXB_TXREQ_M) == 0 ) {
			*txbuf_n = ctrlregs[i]+1; // return SIDH-address of Buffer
			res = MCP2515_OK;
			return res; /* ! function exit */
		}
	}
	
	return res;
}



unsigned char can_sendMessage(CanMessage* msg)
{
	unsigned char res, txbuf_n;
	unsigned char timeout = 0;
	

	
	do {
		res = mcp2515_getNextFreeTXBuf(&txbuf_n); // info = addr.
	} while (res == MCP_ALLTXBUSY);
//	txbuf_n=MCP_TXB0CTRL+1;
	
	if (res!=MCP_ALLTXBUSY) {
		mcp2515_write_canMsg( txbuf_n, msg);
		mcp2515_start_transmit( txbuf_n );
		return CAN_OK;
	}
	else {
		return CAN_FAILTX;
	}
}


void CAN_Write(char * value,int n)
{
   CanMessage msg;
   can_initMessageStruct(&msg);
   msg.identifier = CANDEFAULTIDENT;
   msg.extended_identifier = CANDEFAULTIDENTEXT;
   msg.dlc = n;
   msg.rtr = 0;
   strncpy(msg.dta,value,n);
   	
   can_sendMessage(&msg);

}


void CAN_Init(void)
{
    spi_init();
    mcp2515_Init(CAN_20KBPS);
    rGPGCON&=0xffffff3f;
    rGPGCON|=(1<<7);
    rGPGUP&=0xfff7;
    rGPGDAT|=(1<<3);
	rINTMSK &= ~(BIT_EINT8_23);
	rEINTMASK&=~(1<<11);
}


void __irq CAN_LISR(void)
{
    int temp;
    
    unsigned char stat, res;
	CanMessage msg;
	
	stat = mcp2515_readStatus();
	
	
	if ( stat & MCP_STAT_RX0IF ) {
		// Msg in Buffer 0
		mcp2515_read_canMsg( MCP_RXBUF_0,&msg);
		mcp2515_modifyRegister(MCP_CANINTF, MCP_RX0IF, 0);
		res = CAN_OK;
	}
	else if ( stat & MCP_STAT_RX1IF ) {
		// Msg in Buffer 1
		mcp2515_read_canMsg( MCP_RXBUF_1,&msg);
		mcp2515_modifyRegister(MCP_CANINTF, MCP_RX1IF, 0);
		res = CAN_OK;
	}
	else {
		res = CAN_NOMSG;
		mcp2515_modifyRegister(MCP_CANINTF, 0xff, 0x00);
	}	     
    strcpy(CAN_Message,msg.dta);
    
    for(temp=0;temp<strlen(CAN_Message);temp++)
      if(CAN_Message[temp]=='#')
        {
           CAN_Message[temp]='\0';
           break;
        }
    CAN_Data_Process(CAN_Message);
    
    
    temp=rEINTPEND;
    rEINTPEND=temp;
	temp = rSRCPND;
	rSRCPND = temp;
	temp = rINTPND;
	rINTPND = temp;
	
    rGPGDAT|=(1<<3);
    

}


/*
   c:The written data
   pencolor: The color of data
   L:实际写入文字区域的右边界
   W:实际写入文字区域的上边界
   x_start:可以被写入文字的最后一行的x坐标
   y_start:可以被写入文字的最后一行的y坐标
   DrawX:全局变量,实际写入文字区域的左边界
   DrawY:全局变量,实际写入文字区域的上边界
*/
//void DrawData(char *c,int pencolor,int area_left,int area_right,int area_up,int down_x,int down_y)

void DrawData(char *c,int pencolor,int L,int W,int x_start,int y_start)
{
	int i,j;
	

	while(*c!='\0')
	{
		while((DrawX<L) && (*c!='\0')&&(DrawY>=y_start))  /*while the X coordinate don't exceed the scope of X limit*/ 
		{
			drawascii168(DrawX,DrawY,c,pencolor);  /*display the character*/
			DrawX+=8;
			c++;
		}

        DrawX=x_start;    /*exchange the next row*/  
      	if (DrawY <y_start)
        {

			for(j=W;j>=y_start-16;j--)
				for(i=x_start;i<L;i++)
				{
                   
                				
				     *(short *)(VideoAddrStart+(i*x_size+j)*2) = *(short *)(VideoAddrStart+(i*x_size+j-16)*2);
				  
				   
				}
						
			
			
			while((DrawX<L) && (*c!='\0'))  /*while the X coordinate don't exceed the scope of X limit*/ 
			{
				drawascii168(DrawX,y_start,c,pencolor);  /*display the character*/
				DrawX+=8;
				c++;

			}
			

        } 
        else     	                                           
        	DrawY-=16;
     }
}

void CAN_Data_Process(char * message)
{
   int i=0,x,y;
   int temperature_temp;
   char buf[4];
   char head[13]={"EINT"};
   char tail[7]={" is on"};
   switch(message[0])
   {
     case '1':
         temperature_temp=atoi(&message[1]);
         
         #ifdef TFT
         x=130;
         y=175;
         #else
         x=250;
         y=330;
         #endif
         
         sprintf(buf,"%d\0",temperature);   			
	//	 drawascii168(x,y,buf,rgb(0,0,255));
		 drawascii168space(x,y,4,rgb(0,0,255));
		 
		 temperature=temperature_temp;
         sprintf(buf,"%d",temperature_temp);			    
		 drawascii168(x,y,&message[1],rgb(255,255,0));
         
         break;
     case '2'://red led     
         #ifdef TFT
         x=70;
         y=125;
         #else
         x=150;
         y=240;
         #endif     
         if(message[1]=='1')
         {
           Led4_On_or_Off(TRUE);
           
           
           #ifdef TFT
           eraseHZ(x,y,rgb(0,0,255));
           drawtext(x,y,"开",1,0,rgb(255,255,0));
           #else
           eraseHZ24(x,y,rgb(0,0,255));
           drawtext24(x,y,"开",1,3,rgb(255,255,0));
           #endif
         }  
         else
         {
           Led4_On_or_Off(FALSE);
           #ifdef TFT
           eraseHZ(x,y,rgb(0,0,255));
           drawtext(x,y,"关",1,0,rgb(255,255,0));
           #else
           eraseHZ24(x,y,rgb(0,0,255));
           drawtext24(x,y,"关",1,3,rgb(255,255,0));
           #endif
         }
         break;
     case '3'://green led
         #ifdef TFT
         x=70;
         y=65;
         #else
         x=150;
         y=140;
         #endif     
         if(message[1]=='1')
         {
           Led1_On_or_Off(TRUE);
           #ifdef TFT
           eraseHZ(x,y,rgb(0,0,255));
           drawtext(x,y,"开",1,0,rgb(255,255,0));
           #else
           eraseHZ24(x,y,rgb(0,0,255));
           drawtext24(x,y,"开",1,3,rgb(255,255,0));
           #endif
         }
         else
         {
           Led1_On_or_Off(FALSE);
           #ifdef TFT
           eraseHZ(x,y,rgb(0,0,255));
           drawtext(x,y,"关",1,0,rgb(255,255,0));
           #else
           eraseHZ24(x,y,rgb(0,0,255));
           drawtext24(x,y,"关",1,3,rgb(255,255,0));
           #endif
         }
         break;
     case '4':
         strcat(head,&message[1]);
         strcat(head,tail);
         
         #ifdef TFT
         DrawData(head,rgb(255,255,0),315,119,160,39);
         #else
         DrawActiveline(320,268,600,head,rgb(255,255,0),rgb(0,0,255));
         #endif
         
         break;
   
   }

}

⌨️ 快捷键说明

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