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

📄 chksja.c

📁 测试EPP_CAN板的Linux操作系统驱动的小程序,
💻 C
字号:
/* chksja.c * *	a tool for SJA1000 checking. *			written by : Chen Zhenyong *				w3wind@ustc.edu *				2004/2/12 */#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include "../driver/cangate.h"#include "colors.h"#include "chksja.h"/* * SJA1000寄存器访问 */int write_sja(int fd,unsigned char addr, unsigned char value){	int ret;	struct sja_op sja_op_data;		if(fd < 0) return -1;		sja_op_data.sja_reg_addr = addr;	sja_op_data.sja_reg_value = value;		ret = ioctl(fd,QSPIIOCS_WRITESJA,&sja_op_data);		return ret;}unsigned char read_sja(int fd,unsigned char addr){	int ret;	struct sja_op sja_op_data;		if(fd < 0) return -1;		sja_op_data.sja_reg_addr = addr;		ret = ioctl(fd,QSPIIOCS_READSJA,&sja_op_data);		return sja_op_data.sja_reg_value;}/* * 初始化及反初始化SJA1000 */#define MAXWAIT 2000int InitializeSJA(int fd){	int i;	unsigned char v;   	//wait until the RR bit is set to '1'	for(i=0;i<MAXWAIT;i++){		write_sja(fd,MODE_REG,0x01);		if(read_sja(fd,MODE_REG)&0x01)			break;	}	if(i==MAXWAIT){		return -1; 	}	write_sja(fd,BUSTIME0_REG,EPPmode.bustime0);   //bustime0,缺省为0xa3	write_sja(fd,BUSTIME1_REG,EPPmode.bustime1);   //bustime1,缺省为0xc3	write_sja(fd,OUTCTL_REG,EPPmode.outpctr);   //output control	write_sja(fd,CLKDIV_REG,EPPmode.clkdiv);   //PeliCAN mode,bypass the input comparator		write_sja(fd,ACCCODE0_REG,EPPmode.acptcode0); //设置接受地址判断,缺省为ffffffff	write_sja(fd,ACCCODE1_REG,EPPmode.acptcode1);	write_sja(fd,ACCCODE2_REG,EPPmode.acptcode2);	write_sja(fd,ACCCODE3_REG,EPPmode.acptcode3);	write_sja(fd,ACCMASK0_REG,EPPmode.acptmask0);//设置接受时不考虑的地址位,缺省为ffffffff	write_sja(fd,ACCMASK1_REG,EPPmode.acptmask1);	write_sja(fd,ACCMASK2_REG,EPPmode.acptmask2);	write_sja(fd,ACCMASK3_REG,EPPmode.acptmask3);	write_sja(fd,INTR_EN_REG,EPPmode.intrenreg);	//disable interrupt	read_sja(fd,INTR_REG);       			//clear the interrupt register(except receive interrupt bit)	write_sja(fd,CMD_REG,0x04);			//clear receive buffer. if no other message then clear receive interrupt bit	for(i=0;i<MAXWAIT;i++){		write_sja(fd,MODE_REG,0x00);		if( ! (read_sja(fd,MODE_REG)&0x01) )			break;	}	if(i==MAXWAIT) return -1;		return 0;}//you cannot init SJA when interrupt is not cleared.//DeInitializeSJA is for this use.//so if you want re-init SJA, must call DeInitializeSJA first.void DeInitializeSJA(int fd){	write_sja(fd,CMD_REG,0x02);	//cancel transmit task		write_sja(fd,INTR_EN_REG,0x00);	//diable all interrupts}/* * 读写SJA1000中的数据帧 */void read_frames(int fd){	unsigned char buf[11 * 20];		do{		int i,k=0;		int count;		count = read(fd,buf,11*20);		if(count == 0){			break;		}		printf(FRCOLOR("read in %d frames.",YELLOW)"\n",count/11);		while(count>0){			for(i=0;i<11;i++,count--,k++){				printf("%2x ",buf[k]);			}			printf("\n");		}	}while(1);}void send_frame(int fd){	unsigned char buf[11];	printf("please input command. format is:\n8 addr 0 ch cmd d0 d1 d2 d3 d4 d5\n");	scanf("%2x %2x %2x %2x %2x %2x %2x %2x %2x %2x %2x",buf+0,buf+1,buf+2,buf+3,buf+4,buf+5,buf+6,buf+7,buf+8,buf+9,buf+10);		write(fd, buf, 11);}void error(char* str){	printf(FRCOLOR("error: %s",RED)"\n",str);}void myshell(int fd){	char ibuf[256];	char *p;	char *sep = " ,\t\n";		printf("\n"COLORB("myshell running...""\n""you can type \"help\" to find which commands you can use.",GREEN,WHITE) "\n");	while(1){		printf(COLOR("myshell>",GREEN,YELLOW));		fflush(stdout);					//get a line		fgets(ibuf,256,stdin);		if(ibuf[0] == '\n'){			continue;		}		//get command		p = strtok(ibuf,sep);		if(p == NULL){			continue;		}		//pase command		if(strcmp(p,"init") == 0){			if(InitializeSJA(fd) == -1){				error("init sja failure.");			}			else{				printf(FRCOLOR("init sja succeeded.",GREEN)"\n");			}		}		else if(strcmp(p,"deinit") == 0){			DeInitializeSJA(fd);		}		else if(strcmp(p,"read") == 0){			unsigned char addr,val;			p = strtok(NULL,sep);			if( p == NULL){				error("which register?");				continue;			}			//now, address stored in p			addr = (unsigned char) strtol(p,NULL,10);			//now, execute			val = read_sja(fd,addr);			printf(FRCOLORB("%2x,%2x",PINK)"\n",addr,val);		}		else if(strcmp(p,"write") == 0){			unsigned char addr,val;			p = strtok(NULL,sep);			if( p == NULL ){				error("which register?");				continue;			}			addr = (unsigned char) strtol(p,NULL,10);			p = strtok(NULL,sep);			if( p == NULL){				error("what's the value?");				continue;			}			val = (unsigned char) strtol(p,NULL,10);			write_sja(fd,addr,val);		}		else if(strcmp(p,"getfrm") == 0){			read_frames(fd);		}		else if(strcmp(p,"sendfrm") == 0){			send_frame(fd);		}		else if(strcmp(p,"exit") == 0){			break;		}		else if(strcmp(p,"quit") == 0){			break;		}		else if(strcmp(p,"help") == 0){			printf(COLOR("\ninit\tdeinit\tread\twrite\ngetfrm\tsendfrm\tserial\thelp\nexit\tquit",BLUE,WHITE)"\n");		}		else if(strcmp(p,"serial") == 0){			int kkk;			for(kkk=0;kkk<1000000;kkk++)				read_sja(fd,0x55);		}		else{			error("opperation not support!");		}	}}int main(int argc, char **argv){	int fd;	fd = open("/dev/canport",O_RDWR);	if(fd < 0){		error("cannot open /dev/canport!");		exit(-1);	}	myshell(fd);	//for safety, call DeInitializeSJA	DeInitializeSJA(fd);	close(fd);	return 0;	}

⌨️ 快捷键说明

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