您的位置 首页 电子

SJA1000 CAN驱动程序演示试验

一.实验目的本驱动程序展示了如何在SmallRTOS中编写SJA1000的驱动程序。通过调用CAN程序库SJA1000_PEILIB的基本函数,实现实验板

一.试验意图

驱动程序展现了如安在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) interrupt 0
** 功用描绘: SJA1000 中止呼应函数
***************************************************************/
void SJA1000_INT0(void) interrupt 0
{
OS_INT_ENTER();
EX0 = 0;
OSIntSendSignal(0); //无条件的令CAN 接纳中止处理使命(CAN_Rcv ())处于安排妥当状

//因为CAN_Rcv ()的优先级最高,故中止退出后马上履行
CAN_Rcv ().
OSIntExit();
}
void main(void)
{
uint8 i ;
OSInit();
Init();
CAN_Init();
//初始化显现缓存
for(i=0;i<8;i++)
{
disp_buf[i]=31;
}
//创立使命
OSTaskCreate(CAN_Rcv, NULL, 0);

OSTaskCreate(display, NULL, 1);
OSTaskCreate(CAN_Send, NULL, 2);
OSTaskCreate(TimeSum, NULL, 3);
while(1)
{
PCON = PCON | 0x01; //令CPU 进入睡觉状况
}
}
/*****************************************************************
**键值发送使命
*****************************************************************/
void CAN_Send(void)
{
uint8 key_data;
while(1)
{
key_data = ZLG7290_GetKey();
if(key_data)
{
Send_CAN_Data[3] = key_data;
CAN_Data_Send();
disp_buf[4] = key_data % 10;
disp_buf[5] = (key_data / 10) % 10;
}
OSWait(K_TMO,5);
}
}
/****************************************************************
**显现使命
*****************************************************************/
void display(void)
{
while(1)
{
OSWait(K_TMO,5);
OS_ENTER_CRITICAL();
ZLG7290_SendBuf(&disp_buf[0], 8);
OS_EXIT_CRITICAL();
}
}
/***************************************************************
**CAN 接纳中止处理使命

***************************************************************/
void CAN_Rcv(void)
{
while(1)
{
OSWait(K_SIG, 0); //挂起当前使命,等候唤醒信号
if(ReadSJAReg(REG_CAN_IR)&0x01)
{
//数据接纳一定在开释缓冲区之前,开释后数据不确定
ReadSJARegBlock(16,Recv_CAN_Data,13);
WriteSJAReg(REG_CAN_CMR,4); //开释SJA1000 接纳缓冲区
disp_buf[0] = Recv_CAN_Data[3] % 10;
disp_buf[1] = (Recv_CAN_Data[3] / 10) % 10;
}
EX0 = 1;
}
}
/*****************************************************
* *计数使命
***************************************************************/
void TimeSum(void)
{
while(1)
{
OSWait(K_TMO, 5);
disp_buf[7]++;
if(disp_buf[7] > 9)
{
disp_buf[7] = 0;
}
}
}
五.试验例程简析
本驱动程序选用中止方法接纳CAN 总线数据。选用中止的方法,能够进步体系的实时性。特别的在接纳数据的时分,选用中止方法能够在功率和实时性上比选用非中止方法得到很大的进步。
按下D5 区的按键时,左面的LED 将显现按键键值,一起程序调用CAN_Data_Send ( )
将检测到的键值经过CAN 总线发送到另一台试验仪上。试验仪将从CAN 总线上接纳到的
键值数据显现在D5 区的右边LED 上。
D5 区中最右边的LED 管循环地显现0~9,意图是为了显现体系正在运转。
有关SJA1000_PEI 库的运用请阅览配套光盘中的《SJA1000_PEI 库阐明及其运用》文档。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/dianzi/234218.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部