微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > SJA1000 CAN驱动程序演示实验

SJA1000 CAN驱动程序演示实验

时间:12-14 来源:互联网 点击:
一.实验目的

驱动程序展示了如何在Small RTOS中编写SJA1000 的驱动程序。通过调用CAN
序库SJA1000_PEI.LIB 的基本函数,实现实验板上CAN 节点的初始化以及CAN 节点数据
收发测试。
二.实验设备及器件
PC 机 一台
DP-51PROC 单片机综合仿真实验仪 一台
CAN PARK 模块 一台
CAN 连接线 一根
三.实验步骤
1、 将CAN-bus PARK 插入到A6 区中,用导线连接A6 区的P1_IO2 到A2 区的P10,
连接A6 区的P1_CS1 到A2 区的A15。
2、 使用导线把A2 区的P16 和P17 分别于D5 区的SCL 和SDA 相连。使用导线把D5
区的/RST 与VCC 相连。
3、 由于本程序使用中断方式响应SJA1000 中断,故将A5 区的P1_INT 接到A2 区的
INT0。
4、 利用CAN 连接线将两台已经安装了CAN-Bus 模块的DP-51PROC 连接起来,以组
成简单的CAN 网络实现CAN 的接收和发送。
5、 本驱动程序已经将输出文件路径设置为“E:\Temp”,用户可自行更改输出文件路径。
将路径“E:\Temp”中的CAN. hex 文件下载到两台DP-51PROC 中运行。
四.实验参考程序主要部分
/******************************************************
*描述: 独立的CAN 控制器SJA1000PeliCAN 在small rtos 中的应用示例
*文件名: PELIRTOS.c
*应用语言: KEIL C51
*应用系统: small rtos
*版本 : V1.0
*广州周立功单片机发展有限公司 保留所有的版权
****************************************************/
#define _TIME_MODULE_H
#define _SERIAL_H
/********************************************************
** 导入头文件
******************************************************/
#include "INCLUDES.h"
#include "Sja1000_peli.h"
sfr IPH=0xb7;

sbit RESET_PIN=P1^0;
// 验收代码/屏蔽寄存器的内容(4+4)
uint8 xdata Send_CAN_Filter[8]={0xf0,0xf0,0xf0,0xff,0xff,0xff,0xff,0xff};
// 帧信息和标示码(1+4)分别对应 TX,TX1,TX2,TX3,TX4
uint8 xdata Send_CAN_Info_ID[3]={0xc7,0x0A,0x0B};
uint8 xdata Recv_CAN_Info_ID[3];
// 待发送数据(8)
uint8 xdata
Send_CAN_Data[13]={0xc7,0x0A,0x0B,0x04,0x05,0x06,0x07,0x08,0x07,0x08,0x07,0x08,
0x08};
uint8 xdata Recv_CAN_Data[14];
uint8 xdata time_Counter=0;
uint8 xdata BTR0,BTR1;
uint16 xdata *p;
uint8 xdata disp_buf[8];
void CAN_Send(void);
void display(void);
void CAN_Rcv(void);
void TimeSum(void);
void Delay_ms(uint8 j);
void SJA1000_Config_Normal(void);
void Init(void)
{
CKCON=1; //应用6clock
TMOD = (TMOD & 0XF0) | 0X01;
TCON=TCON|0x04; //MCU 的INT1 下降沿触发,INT0 电平触发
TH0 = (65536 - (11059200 / 12) / 100) / 256;
TL0 = (65536 - (11059200 / 12) / 100) % 256;
TR0 = 1;
ET0 = 1;
TF0 = 0;
}
/****************************************************************
**函数名称:void CAN_Init(void)
**功能描述:复位SJA1000,并设置其工作在正常模式
*****************************************************************/
void CAN_Init(void)
{

RESET_PIN=0; //将SJA1000 的复位线与P1.0 相连接
Delay_ms(1);
RESET_PIN=1; //控制P1.0 来实现SJA1000 的复位
SJA_CS_Point=&CAN_SJA_BaseAdr;
SJA1000_Config_Normal();
WriteSJAReg(REG_CAN_IER,RIE_BIT); //使能SJA1000 接收中断
EX0=1;
}
/**************************************************************
** 函数原型: void Delay_ms(uchar j)
** 功能描述: 该函数用于不精确的延时。在12M,6CLK 下,大约延时j*1ms
***************************************************************/
void Delay_ms(uint8 j)
{
uint8 k,l;
for(l=0;l<=j;l++)
{
for(k=0;k<=250;k++)
{
;
}
}
}
/************************************************************
** 函数原型: void SJA1000_Config_Normal(void)
** 功能描述: 对SJA1000 的正常模式的初始化配置
***************************************************************/
void SJA1000_Config_Normal(void)
{
BTR0=0x00;
BTR1=0x14; //设置为80k 波特率通信
SJAEntryResetMode(); //进入复位模式
WriteSJAReg(REG_CAN_CDR,0xc8); //配置时钟分频寄存器,选择PeliCAN 模式
WriteSJAReg(REG_CAN_MOD,0x01); //配置模式寄存器,选择双滤波、正常模式
WriteSJARegBlock(16,Send_CAN_Filter,8); //配置验收代码/屏蔽寄存器
WriteSJAReg(REG_CAN_BTR0,BTR0); //配置总线定时器0
WriteSJAReg(REG_CAN_BTR1,BTR1); //配置总线定时器1
WriteSJAReg(REG_CAN_OCR,0x1a); //配置输出管脚
SJAQuitResetMode(); //退出复位模式,进入工作模式
}
/*********************************************************** 函数原型: void CAN_Data_Send(void)
** 功能描述: SJA1000 的单次发送子函数(注意在这个函数的末尾要置位接收中断)
*************************************************************/
void CAN_Data_Send(void)
{
// 发送数据
WriteSJAReg(REG_CAN_IER,0x02); //使能SJA1000 发送中断位
WriteSJARegBlock(16,Send_CAN_Data,13);
WriteSJAReg(REG_CAN_CMR,1); //使能发送请求
Delay_ms(10);
WriteSJAReg(REG_CAN_IER,RIE_BIT); //使能SJA1000 接收中断
}
/**************************************************************
** 函数原型: void SJA1000_INT0 (void)

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top