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

📄 sj1000driver.c

📁 Xscale下CAN总线控制器SJ1000驱动
💻 C
字号:
/****************************************************************
 * Version : 9793/9794-1.0
 * Author :  
 * Create Date: 2002/06/04
 * FileName :can.c
 * Description:CAN模块
 *
 * Modify Log:
 ****************************************************************/
#include "vxWorks.h"
#include "sockLib.h"
#include "sys/socket.h"
#include "netinet/in.h"
#include "inetLib.h"
#include "stdio.h"
#include "stdlib.h"
#include "ioLib.h"
#include "taskLib.h"
#include "string.h"
#include "pinglib.h"
#include "tasklib.h"
#include "selectLib.h"
#include "fcntl.h"
#include "iv.h"
#include "sj1000.h"
#include "intLib.h"
#include "ixp425IntrCtl.h"
#include "ixp425Gpio.h"

static void  CAN_hardware_init();
static void  CAN_cpu_parameter_init();
void	 CAN_interrupt_ISR();
int cantrans(char *buf,char len);



void  CAN_init()
{

	int j;
	int *p;

	 p=(int *)0xc400000c;
	*p=0xbfff2053;

	CAN_cpu_parameter_init();
	CAN_hardware_init();
	
}

int cantrans(char *buf,char len)
{
	int int_back,i;

/*	printf("send data");
	for(i=0;i<10;i++)printf(" %x ",buf[i]);
	printf("\n");*/

	int_back=intLock();


	CAN_REG_BYTE(SEND_IDENTIFIER)=buf[0];
	CAN_REG_BYTE(SEND_CODE)=buf[1];	
	
	if((CAN_REG_BYTE(STATUS_REG)&0x24)==0x4)
	{

		CAN_REG_BYTE(SEND_DATA0)=buf[2];	
		CAN_REG_BYTE(SEND_DATA1)=buf[3];	
		CAN_REG_BYTE(SEND_DATA2)=buf[4];	
		CAN_REG_BYTE(SEND_DATA3)=buf[5];	
		CAN_REG_BYTE(SEND_DATA4)=buf[6];	
		CAN_REG_BYTE(SEND_DATA5)=buf[7];	
		CAN_REG_BYTE(SEND_DATA6)=buf[8];	
		CAN_REG_BYTE(SEND_DATA7)=buf[9];	
		CAN_REG_BYTE(COMMAND_REG)=0x01;	
		intUnlock(int_back);
		return 0;
	}
	else 
	{
		intUnlock(int_back);
		return -1;	
	}
}

static void  CAN_cpu_parameter_init()
{
	CAN_recv_id=msgQCreate(300,300,MSG_Q_FIFO);
/*
	CAN_trans_id=msgQCreate(300,300,MSG_Q_FIFO);
*/
	printf("%x ",CAN_recv_id);
}


static void  CAN_hardware_init()
{
	int      int_back,j;        

     	int_back=intLock();
	CAN_REG_BYTE(CONTROL_REG)=0x01;	
	CAN_REG_BYTE(ACCEPTANCE_CODE_REG)=0xff;	
	CAN_REG_BYTE(ACCEPTANCE_MASK_REG)=0xff;	
	CAN_REG_BYTE(BUS_TIMING0_REG)=0x00;	
	CAN_REG_BYTE(BUS_TIMING1_REG)=0x1c;/*0x1c for 625k 0x14 for 1m*/	
	printf("can time is %x\n",CAN_REG_BYTE(BUS_TIMING1_REG));
	CAN_REG_BYTE(OUTPUT_CONTRL_REG)=0xfa;
	CAN_REG_BYTE(CLOCK_DIVIDER)=0x04;	
	CAN_REG_BYTE(CONTROL_REG)=0x5a;
	intUnlock(int_back);

	ixp425GPIOLineConfig(IXP425_GPIO_PIN_12,IXP425_GPIO_IN|IXP425_GPIO_FALLING_EDGE);
	ixp425GPIOIntStatusClear(IXP425_GPIO_PIN_12);	
	ixp425IntLvlEnable(IXP425_INT_LVL_GPIO12);

	intConnect((VOIDFUNCPTR *)INT_VEC_GPIO12,(VOIDFUNCPTR)CAN_interrupt_ISR,0);
	intEnable(IXP425_INT_LVL_GPIO12);
	printf("can_hardware_init done \n");
	
		
}



void CAN_interrupt_ISR()
{
	u_char	status,CAN_recv_buffer[100];
	int i,j,lockKey;
	char temp;
	


	ixp425GPIOIntStatusClear(IXP425_GPIO_PIN_12);
	status=CAN_REG_BYTE(INTERRUPT_REG);

	lockKey=intLock();

	CAN_recv_buffer[0]=0x55;
  	if((status&0x01)==0x01)
  	{
  		
	 CAN_recv_buffer[1]=CAN_REG_BYTE(RECE_IDENTIFIER);	
	 CAN_recv_buffer[2]=CAN_REG_BYTE(RECE_CODE);	
	 CAN_recv_buffer[3]=CAN_REG_BYTE(RECE_DATA0);	
	 CAN_recv_buffer[4]=CAN_REG_BYTE(RECE_DATA1);	
	 CAN_recv_buffer[5]=CAN_REG_BYTE(RECE_DATA2);	
	 CAN_recv_buffer[6]=CAN_REG_BYTE(RECE_DATA3);	
	 CAN_recv_buffer[7]=CAN_REG_BYTE(RECE_DATA4);	
	 CAN_recv_buffer[8]=CAN_REG_BYTE(RECE_DATA5);	
	 CAN_recv_buffer[9]=CAN_REG_BYTE(RECE_DATA6);	
	 CAN_recv_buffer[10]=CAN_REG_BYTE(RECE_DATA7);	
	 CAN_REG_BYTE(COMMAND_REG)=0x04;	
	 if((CAN_recv_buffer[02]&0x0f)==0x08) {if(msgQSend(CAN_recv_id,CAN_recv_buffer,11,NO_WAIT,MSG_PRI_NORMAL )==-1)logMsg("MsgSendError\n");} 
		
       			
	}
	
	if((status&0x08)!=0) {  
	   CAN_REG_BYTE(COMMAND_REG)=0x08;	
		CAN_hardware_init();
	    logMsg("overrun error\n");
	}
	if((status&0x04)!=0) {  
		CAN_hardware_init();
		logMsg(" error %x\n",status);

	 }
	intUnlock(lockKey);

}

⌨️ 快捷键说明

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