📄 sja1000t.c
字号:
/*******************************************************************************
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 + -