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

📄 can.cpp

📁 windows ce 下 can总线驱动源码
💻 CPP
字号:
//******************************************************************************
//*
//* System On Chip(SOC)
//*
//* Copyright (c) 2002  sjsunny, Inc.
//* All rights reserved.
//*
//* This software is the confidential and proprietary information of Sjsunny Sci&Tech
//* , Inc("Confidential Information"). You Shall not disclose such
//* Confidential Information and shall use it only in accordance with the terms
//* of the license agreement you agreed with sjsunny.
//*
//*-----------------------------------------------------------------------------
//*
//*  PG9315 BSP (Windows CE.NET)
//*
//*  SJA1000 can bus control driver
//*
//* @author      WZL@sjsunny.com
//*
//* @date        2005/04/01
//*
//* Log:
//*  2005/04/01  Start
//*
//******************************************************************************/

#include <windows.h>
#include <windef.h>
#include <types.h>
#include <excpt.h>
#include <tchar.h>
#include <devload.h>
#include <winbase.h>
#include <pegdser.h>
#include <CEDDK.h>
#include  "nkintr.h"
#include  "oalintr.h" //interrupt

#include "fifo.h"
#include "CAN.h"
#include "SJA1000.h"
#include "SJA1000p.h"

#define		CANDEBUG	1


HANDLE hMem=NULL;
DWORD dwCount;
static BOOL  g_bCANWork = 0;
//CFifo	            	g_fifo;
RXFIFO 			rxfifo;
bool			m_bfifoValid = true;


BOOL APIENTRY DllEntry( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
                )
{
switch ( ul_reason_for_call )
{
   case DLL_PROCESS_ATTACH:
   	RETAILMSG(1,(TEXT("1:DLL_PROCESS_ATTACH,PG_CAN - DLL_PROCESS_ATTACH\n")));   
   break;
   case DLL_PROCESS_DETACH:
      RETAILMSG(1,(TEXT("2:DLL_PROCESS_DETACH,PG_CAN - DLL_PROCESS_DETACH\n")));
   break;
   case DLL_THREAD_ATTACH:
      RETAILMSG(1,(TEXT("3:DLL_THREAD_ATTACH,PG_CAN - DLL_THREAD_ATTACH\n")));
   break;
   case DLL_THREAD_DETACH:
      RETAILMSG(1,(TEXT("4:DLL_THREAD_DETACH,PG_CAN - DLL_THREAD_DETACH\n")));
   break;
}
return TRUE;
}

	static BYTE bySend[5]= {0xaa,0x03,0x02,0x11,0x22 };
        BYTE byRec[5] ;
        

DWORD CAN_Init( LPCTSTR pContext, LPCVOID lpvBusContext)
{
	UINT bResult = 1;
	
	UINT iValue = 0xaabbccdd;
	
	unsigned int uCDR = 0xc8; //高位为1设定SJA1000为peliCAN模式关闭外部CLKOUT,CDR.6为CBP=1,设置有点问题如果要用TX1的话应该设置成88H
	unsigned int  uOCR = 0x1a;//设置为正常输出模式
	unsigned int uBTR0 = 0x18,  uBTR1 = 0xef; //我们板子上用的是24M的晶振,所以得到的是20K的波特率,by黎科峰,SJW=0+1,SAM=1,采样3次。
	//定义了CAN系统时钟Tscl=50Tclk (Tclk=XTAL振荡周期) Tsjw=Tscl

	unsigned int uACR = 0x00000000,      uAMR = 0xffffffff;//允许所有的ID传输数据
		
    RETAILMSG(CANDEBUG,(TEXT("PG_CAN - CAN_Init - Context:\r\n ")));

	if( !CanP_VirtualAlloc() )
	   return 0;
	   	   
	//initcan( );
	
	sja1000p_chip_config(  uCDR,  uOCR, uBTR0, uBTR1, uACR, uAMR );	
	RETAILMSG( 1, (TEXT(" can ::   %x.\r\n"), InterruptInitialize ));
    RETAILMSG( CANDEBUG, (TEXT(" can ::   %x.\r\n"), InterruptInitialize ));
    RETAILMSG( CANDEBUG, (TEXT("can ::   CANBUS_INT = %x.\r\n"), SYSINTR_CANBUS ));
    
	m_hCanIntEvent = CreateEvent(NULL,FALSE,FALSE,NULL);
    if (m_hCanIntEvent == NULL) {
        RETAILMSG( 1, (TEXT(" can event create error\r\n")));
		return 0x1234;
	}
 
	if (!InterruptInitialize(SYSINTR_CANBUS,m_hCanIntEvent,NULL,0)) {
		RETAILMSG(1, (TEXT(" can InterruptInitialize error \r\n")));
		return 0x1234;
	}
	
	InterruptDone(SYSINTR_CANBUS);

	RETAILMSG(CANDEBUG, (TEXT(" can InterruptInitialize ok \r\n")));
	
	RETAILMSG(CANDEBUG,(TEXT("PG_CAN - ~ CAN_Init\r\n")));
		RETAILMSG(1,(TEXT("PG_CAN - ~ CAN_Init\r\n")));
	return 0x1234;
}

BOOL CAN_Deinit( DWORD hDeviceContext )
{
	RETAILMSG(CANDEBUG,(TEXT("PG_CAN - CAN_Deinit\n")));
	
	g_bCANWork = FALSE;
	
	RETAILMSG(CANDEBUG,(TEXT("PG_CAN - ~ CAN_Deinit\n")));
	return TRUE;
}

DWORD CAN_Open( DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode )
{
	
	RETAILMSG(1,(TEXT("PG_CAN - CAN_Open\n")));			
	RETAILMSG(1,(TEXT("PG_CAN - ~ CAN_Open\n")));

	return 0x5678;
}

BOOL CAN_Close( DWORD hOpenContext )
{
	RETAILMSG(CANDEBUG,(TEXT("PG_CAN - CAN_Close\n")));
	RETAILMSG(CANDEBUG,(TEXT("PG_CAN - ~ CAN_Close\n")));	
	return TRUE;
}

bool CANEventHandler( unsigned& ureg ) //process int
{
	ureg = can_read_reg ( SJAIR ); 

	if ( ureg & IER_RIE )//RECEIVE INTERRUPT
	{
	  RETAILMSG(CANDEBUG, (TEXT("regCANBusIR.RI1 \r\n")));
	  peli_DATA_RECEIVE ( rxfifo );
	  ResetEvent(m_hCanIntEvent);
	  
	  can_write_reg( CMR_RRB, SJACMR);
	  can_write_reg( IR_RI, SJAIR );
	  m_bfifoValid = true;
	  
//	  g_fifo.Push( rxfifo );	  
	}
	return true;  
}


BOOL CAN_IOControl( DWORD hOpenContext, DWORD dwCode, PBYTE pBufIn, DWORD dwLenIn, PBYTE pBufOut, DWORD dwLenOut, PDWORD pdwActualOut )
{
	
HANDLE hTemp = NULL;
TCHAR *tcOut = NULL;
TCHAR *tcIn = NULL;
DWORD dwChars= 0;
BOOL   bRet = FALSE;
UINT	bReg = 0;

int x;
	unsigned int uCDR = 0xc8; 
	unsigned int  uOCR = 0x1a;
	unsigned int uBTR0 = 0x18,  uBTR1 = 0xef; 
	unsigned int uACR = 0x00000000,      uAMR = 0xffffffff;
		
RETAILMSG(CANDEBUG,(TEXT("PG_CAN - CAN_IOControl\n")));

TestReadAllRegs( );

switch (dwCode) {
      case IOCTL_DRIVER_RESET:
   {
      RETAILMSG(1,(TEXT("DRIVER CANO IOCTL_DRIVER_RESET\n")));	
	if( !sja1000p_enable_configuration())
		bRet = TRUE;
   }
   break;
   
      case IOCTL_DRIVER_WORK:
   {
      RETAILMSG(1,(TEXT("DRIVER CANO IOCTL_DRIVER_WORK\n")));
	if( !sja1000p_disable_configuration())
		bRet = TRUE;
   }
   break;
   
   
      case IOCTL_DRIVER_SET_BANDRATE:
   {
      RETAILMSG(1,(TEXT("DRIVER CANO IOCTL_DRIVER_SET_BANDRATE\n")));
      memcpy(&uBTR0, pBufIn, sizeof(int));
      memcpy(&uBTR1, pBufIn + sizeof(int), sizeof(int));
      if( !sja1000p_set_btregs( uBTR0, uBTR1 ) )
		bRet = TRUE;
      
   }
   break;
   
   
      case IOCTL_DRIVER_SET_CDR_OCR:
   {
      RETAILMSG(1,(TEXT("DRIVER CANO IOCTL_DRIVER_SET_OBJECT \n")));
      memcpy(&uCDR, pBufIn, sizeof(int));
      memcpy(&uOCR, pBufIn + sizeof(int), sizeof(int));
      
	if (sja1000p_set_cdr_ocrregs( uACR, uAMR))
		return -1;
   }
   break;
   
         case IOCTL_DRIVER_SET_OBJECT:
   {
      RETAILMSG(1,(TEXT("DRIVER CANO IOCTL_DRIVER_SET_OBJECT \n")));
      memcpy(&uACR, pBufIn, sizeof(int));
      memcpy(&uAMR, pBufIn + sizeof(int), sizeof(int));
      
	if (sja1000p_extended_mask( uACR, uAMR))
		return -1;
   }
   break;
   
      case IOCTL_DRIVER_SET_REG:
   {
      RETAILMSG(1,(TEXT("DRIVER CANO IOCTL_DRIVER_BCAN_HW_INIT\n")));

      memcpy(&uACR, pBufIn, sizeof(int));
      memcpy(&uAMR, pBufIn + sizeof(int), sizeof(int));
      
	if (sja1000p_extended_mask( uACR, uAMR))
		return -1;
   }
   break;
   
         case IOCTL_DRIVER_SEND_REQ:
   {
      RETAILMSG(1,(TEXT("DRIVER CANO IOCTL_DRIVER_SEND_REQ \n")));
      
   }
   break;
         
         case IOCTL_DRIVER_SEND_QUIT:
   {
      RETAILMSG(1,(TEXT("DRIVER CANO IOCTL_DRIVER_SEND_QUIT \n")));
   }
   break;
            case IOCTL_DRIVER_RELEASE_RBUFF:
   {
      RETAILMSG(1,(TEXT("DRIVER CANO IOCTL_DRIVER_RELEASE_RBUFF \n")));
   }
   break;
      
            case IOCTL_DRIVER_CLEAR_OVERLAP:
   {
      RETAILMSG(1,(TEXT("DRIVER CANO IOCTL_DRIVER_CLEAR_OVERLAP \n")));
      
   }
   break;
   
               case IOCTL_DRIVER_SLEEP:
   {
      RETAILMSG(1,(TEXT("DRIVER CANO IOCTL_DRIVER_SLEEP \n")));
      
   }
   break;
    
   case IOCTL_DRIVER_CAN_EVENT:
   {
     RETAILMSG(1,(TEXT("DRIVER CANO IOCTL_DRIVER_CAN_EVENT \n" )));
      
		WaitForSingleObject(m_hCanIntEvent, INFINITE);
		RETAILMSG(1, (TEXT(" can_event \r\n")));
		CANEventHandler( bReg );
		
	if (! ( bReg & IER_RIE ))//RECEIVE INTERRUPT
	{		
		ResetEvent(m_hCanIntEvent);
	}	
		InterruptDone(SYSINTR_CANBUS);
   }
   break;
   
   default:
      RETAILMSG(1,(TEXT("Unknown IOCTL\n")));
      break;
}

RETAILMSG(CANDEBUG,(TEXT("PG_CAN - ~ CAN_IOControl\n")));
return TRUE;
}

void CAN_PowerUp( DWORD hDeviceContext )
{
}

void CAN_PowerDown( DWORD hDeviceContext )
{
}

DWORD CAN_Read( DWORD hOpenContext, LPVOID pBuffer, DWORD Count )
{
DWORD dwRetCount=0x20;      // default to error
RETAILMSG(CANDEBUG,(TEXT("PG_CAN - CAN_Read\r\n")));
 
	if( m_bfifoValid )
	{
		memcpy( pBuffer, (LPVOID)(&rxfifo), 13*4 );
		m_bfifoValid = false;
	}
	else
	RETAILMSG(CANDEBUG,(TEXT(" fifo no valid\r\n")));
//	peli_DATA_RECEIVE( pBuffer );
	 
RETAILMSG(CANDEBUG,(TEXT("PG_CAN - ~ CAN_Read\r\n")));

return dwRetCount;
}

DWORD CAN_Write( DWORD hOpenContext, LPVOID pBuffer, DWORD Count )
{
   	RETAILMSG(1,(TEXT("hOpenContext - ")));
	
	peli_DATA_WRITE( (unsigned * )pBuffer );

	RETAILMSG(CANDEBUG,(TEXT("PG_CAN - ~ CAN_Write\r\n")));

	return Count;
}

DWORD CAN_Seek( DWORD hOpenContext, long Amount, WORD Type )
{
	return 0;
}

⌨️ 快捷键说明

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