?? sj1000driver.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 + -