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

📄 sja1000t.c

📁 一个DSP2812的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*******************************************************************************
  Copyright (c) 2005,2006 北京中盛华旭电子科技有限公司(VSUNTEK, Ltd.)
  FileName: SJA1000T.C
  Author: 王在东
  Date: 2008.05.25
  Version: 1.0
  Description:CAN控制器驱动程序 .
  History:
    <Author>wzd
  <Date>  
  <Ver>    
  <Desc>  
  Todo:
*******************************************************************************/

#include "SJA1000T.h"

void           BusLine_Direct_Set(int16 Direct); 
void           SJA1000_WRITE(unsigned char Device, unsigned char ADDRESS, unsigned char A_DATA); 
unsigned char  SJA1000_READ(unsigned char Device, unsigned char ADDRESS); 
void           Init_SJA1000_HardWare(void); 
unsigned char  Init_SJA1000_Soft(unsigned char Device); 
unsigned char  SJA1000_DATA_SEND(unsigned char Device, Uint32 *SendDataBuf, Uint32 Message_Longth); 
unsigned char  SJA1000_DATA_RECEIVE(unsigned char Device, unsigned char *ReceiveDataBuf, unsigned char Message_Longth); 
unsigned char  SJA1000_CMD_PRG(unsigned char Device, unsigned char cmd); 



/******************************************************************************* 
函数名称:     void BusLine_Direct_Set(int16 Direct) 
功能说明:     总线方向设置 
******************************************************************************/ 
void BusLine_Direct_Set(int16 Direct) 
{  

     if(Direct == INPUT)
	 {
	     EALLOW;
		 GpioMuxRegs.GPADIR.all = 0xFF00;
		 EDIS; 
     }
	 if(Direct == OUTPUT)
	 {
	     EALLOW;
		 GpioMuxRegs.GPADIR.all = 0xFFFF;
		 EDIS;
	 } 
} 





/******************************************************************************* 
函数名称:      void  SJA1000T1_WRITE(unsigned char ADDRESS,unsigned char A_DATA)
功能说明:      该函数用于CAN控制器写入一个数据 
输入参数:      unsigned char ADDRESS:  地址 
              unsigned char A_DATA:   数据 
输出参数: 
函数扇出清单: 
函数扇入清单: 
其它说明: 
*******************************************************************************/ 
void  SJA1000_WRITE(unsigned char Device, unsigned char ADDRESS, unsigned char A_DATA)
{   

    if(Device == CAN1)
	{

	    BusLine_Direct_Set(OUTPUT);
	    CAN1_2_ALE_H;                     // 开锁地址-SJA1000的ALE信号线(高电平有效) 
	   // Init_SJA1000_HardWare();
        BUS_LINE = (ADDRESS & 0x00FF) | (BUS_LINE & 0xFF00);
	    delay_loop(10);
		CAN1_2_ALE_L;					 // 关锁地址-SJA1000的ALE信号线(高电平有效)
	    delay_loop(10);
	    CAN1_CS_L;                       // 开片选-SJA1000的CS信号线(低电平有效) 
	    delay_loop(10);
        BUS_LINE = (A_DATA & 0x00FF) | (BUS_LINE & 0xFF00);
		CAN1_2_WR_L;
	    delay_loop(10);
		CAN1_2_WR_H;
	    CAN1_CS_H;                       // 开片选-SJA1000的CS信号线(低电平有效) 
	    delay_loop(10);
	//	CAN1_2_ALE_H;					 // 关锁地址-SJA1000的ALE信号线(高电平有效)

	}

	if(Device == CAN2)
	{
	    BusLine_Direct_Set(OUTPUT);
	    CAN1_2_ALE_H;                     // 开锁地址-SJA1000的ALE信号线(高电平有效) 
	   // Init_SJA1000_HardWare();
        BUS_LINE = (ADDRESS & 0x00FF) | (BUS_LINE & 0xFF00);
	    delay_loop(10);
		CAN1_2_ALE_L;					 // 关锁地址-SJA1000的ALE信号线(高电平有效)
	    delay_loop(10);
	    CAN2_CS_L;                       // 开片选-SJA1000的CS信号线(低电平有效) 
	    delay_loop(10);
        BUS_LINE = (A_DATA & 0x00FF) | (BUS_LINE & 0xFF00);
		CAN1_2_WR_L;
	    delay_loop(10);
		CAN1_2_WR_H;
	    CAN2_CS_H;                       // 开片选-SJA1000的CS信号线(低电平有效) 
	    delay_loop(10);
	//	CAN1_2_ALE_H;					 // 关锁地址-SJA1000的ALE信号线(高电平有效)

	}
} 





/***************************************************************************** 
函数名称:      unsigned char  SJA1000T1_READ(unsigned char ADDRESS) 
功能说明:      该函数用于CAN控制器读出一个数据 
输入参数:      unsigned char ADDRESS:  地址 
输出参数:      读出的数据 
函数扇出清单: 
函数扇入清单: 
其它说明: 
*****************************************************************************/ 
unsigned char  SJA1000_READ(unsigned char Device, unsigned char ADDRESS) 
{ 
    unsigned char  Bus_Data;

    if(Device == CAN1) 
	{
	    BusLine_Direct_Set(OUTPUT);
        BUS_LINE = (ADDRESS & 0x00FF) | (BUS_LINE & 0xFF00);
	    CAN1_2_ALE_H;                     // 开锁地址-SJA1000的ALE信号线(高电平有效) 
	    delay_loop(10);
		CAN1_2_ALE_L;					 // 关锁地址-SJA1000的ALE信号线(高电平有效)
	    delay_loop(10);
	    CAN1_CS_L;                       // 开片选-SJA1000的CS信号线(低电平有效) 
	    BusLine_Direct_Set(INPUT);
		CAN1_2_RD_L;
	    delay_loop(10);
	    Bus_Data = BUS_LINE;         // 地址到SJA1000口 
        Bus_Data = Bus_Data & 0x00FF;
	    delay_loop(5);
		CAN1_2_RD_H;
	    CAN1_CS_H;                       // 开片选-SJA1000的CS信号线(低电平有效) 
	    delay_loop(5);

		return Bus_Data;
	}
    
	if(Device == CAN2)
	{
	    BusLine_Direct_Set(OUTPUT);
        BUS_LINE = (ADDRESS & 0x00FF) | (BUS_LINE & 0xFF00);
	    CAN1_2_ALE_H;                     // 开锁地址-SJA1000的ALE信号线(高电平有效) 
	    delay_loop(10);
		CAN1_2_ALE_L;					 // 关锁地址-SJA1000的ALE信号线(高电平有效)
	    delay_loop(10);
	    CAN2_CS_L;                       // 开片选-SJA1000的CS信号线(低电平有效) 
	    BusLine_Direct_Set(INPUT);
		CAN1_2_RD_L;
	    delay_loop(10);
	    Bus_Data = BUS_LINE;         // 地址到SJA1000口 
        Bus_Data = Bus_Data & 0x00FF;
	    delay_loop(5);
		CAN1_2_RD_H;
	    CAN2_CS_H;                       // 开片选-SJA1000的CS信号线(低电平有效) 
	    delay_loop(5);

		return Bus_Data;
	}

	return 0;
} 




/****************************************************************************** 
函数名称:      void Init_SJA1000_HardWare(void) 
功能说明:      SJA1000硬件初始化系统 
输入参数: 
输出参数: 
函数扇出清单: 
函数扇入清单: 
其它说明: 

******************************************************************************/ 
void Init_SJA1000_HardWare(void) 
{ 
   CAN1_BUS_ON;
   CAN2_BUS_ON;
   CAN1_CS_H;
   CAN2_CS_H;
   CAN1_2_ALE_L;
   CAN1_2_RD_H;
   CAN1_2_WR_H;

} 


/**************************************************************************** 
函数名称:      void Init_SJA1000_Soft(void) 
功能说明:      SJA1000软件初始化系统 
输入参数: 
输出参数:      0: 初始化系统成功 
              >=1: 初始化系统错误 
函数扇出清单: 
函数扇入清单: 
其它说明: 
****************************************************************************/ 
unsigned char Init_SJA1000_Soft(unsigned char Device) 
{ 
    //unsigned char TempData; 
    unsigned char RSTCOUNT = 0; 

    SJA1000_WRITE(Device, REG_MODE,0x01);   //REG_MODE=00;控制寄存器 

    // 测试SJA1000的通信状态 
    SJA1000_WRITE(Device, REG_TEST,REG_TEST_DATA);      //访问测试寄存器写入测试值 
   // TempData = SJA1000_READ(Device, REG_TEST); 
   // if(TempData != REG_TEST_DATA)    return 2; 

    // 初始化时分控制器: PeilCAN模式、CLOCKOFF禁止 
    SJA1000_WRITE(Device, REG_CDR,REG_CDR_DATA);            // 时分控制寄存器 
   // TempData = SJA1000_READ(Device, REG_CDR); 
   // if(TempData != REG_CDR_DATA)    return 3; 

    // 设置输出控制器 
    SJA1000_WRITE(Device, REG_OCR,REG_OCR_DATA);  // 访问地址指向输出控制寄存器 
   // TempData = SJA1000_READ(Device, REG_OCR); 
   // if(TempData != REG_OCR_DATA)    return 4; 

    // 波特率: bps = 125K 
    SJA1000_WRITE(Device, REG_BTR0,BTR0_Rate_125k);    // 访问地址指向总线定时寄存器0 
   // TempData = SJA1000_READ(Device, REG_BTR0); 
   // if(TempData != BTR0_Rate_125k)    return 5; 

    SJA1000_WRITE(Device, REG_BTR1,BTR1_Rate_125k);    // 访问地址指向总线定时寄存器1 
   // TempData = SJA1000_READ(Device, REG_BTR1); 

⌨️ 快捷键说明

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