SJA1000 CAN驱动程序演示实验

2016-04-12 20:41:22来源: eefocus 关键字:SJA1000  CAN  驱动程序  演示实验
 
分享到
微博
QQ
微信
LinkedIn
一.实验目的

驱动程序展示了如何在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 库说明及其使用》文档。

SJA1000 CAN驱动程序演示实验的更多相关文章

  1. NASA航天技术演示实验集

    为了支持太空探索NASA开起了一系列先进太空技术演示实验. 具体的实验实验地址在:https://www.nasa.gov/mission_pages/tdm/main/overview.html 通 ...

  2. Android中Activity的四大启动模式实验简述

    作为Android四大组件之一,Activity可以说是最基本也是最常见的组件,它提供了一个显示界面,从而实现与用户的交互,作为初学者,必须熟练掌握.今天我们就来通过实验演示,来帮助大家理解Activ ...

  3. 实验:体会Oracle权限/角色赋予的差异

    环境:Oracle 11.2.0.4 目的:验证业务用户的权限/角色赋予的差异 现在创建两个用户jingyu2和jingyu3: SYS@jyzhao1> create user jingyu2 ...

  4. android驱动学习---led实验

    ======================== 驱动: 内核:android-kernel 2.6.36  (必须对应你的板子上内核,不然会出现insmod错误) 目的:通过android应用层用户 ...

  5. 嵌入式Linux设备驱动程序:发现硬件配置

    嵌入式Linux设备驱动程序:发现硬件配置 Embedded Linux device drivers: Discovering the hardware configuration Interfac ...

  6. kafka主题offset各种需求修改方法

    简要:开发中,常常因为需要我们要认为修改消费者实例对kafka某个主题消费的偏移量.具体如何修改?为什么可行?其实很容易,有时候只要我们换一种方式思考,如果我自己实现kafka消费者,我该如何让我们的 ...

  7. tornado学习笔记11 Web应用中模板(Template)使用应用实践

    上一篇中(Web应用中模板的工作流程分析),已经分析了模板的渲染流程,以及相关参数获取及设置原理.这篇主要讲述模板在实际应用案例. 11.1 需求 根据用户输入的两次密码,判断两次密码是否一致,并将判 ...

  8. 开创学习的四核时代-迅为iTOP4412学习开发板

    产品特点: 处理器: Exynos 4412 处理器,Cortex-A9四核,功耗性能俱佳! 性能: 1GB(可选2GB) 双通道 64bit数据总线 DDR3: 4GB(可选16GB)固态硬盘EMM ...

  9. 集群之LVS(负载均衡)详解

    提高服务器响应能力的方法 scale on  在原有服务器的基础上进行升级或者直接换一台新的性能更高的服务器. scale out  横向扩展,将多台服务器并发向外响应客户端的请求.优点:成本低,扩展 ...

随机推荐

  1. Bootstrap4响应式布局之栅格系统

    前面说了Bootstrap4的下载和简单使用,现在我们接着往下学习,Bootstrap4的响应式布局主要依靠栅格系统来实现的.面老K先来讲解一下Bootstrap4的栅格系统,让你能够更快的了解Boo ...

  2. JS 实现四舍五入保留两位小数并且添加千位分隔符

    var a = "-123456789.078";a = (Math.round(a * 100) / 100).toFixed(2).toString().replace(/(\ ...

  3. css改变input显示的样式

    设置input宽高,边框大小颜色,背景颜色,字体颜色,字体大小,背景图片,去除蓝色边框. input{width:80px ;height:30px;border:1px solid red;colo ...

  4. 安卓开发_浅谈ListView(ArrayAdapter数组适配器)

    列表视图(ListView)以垂直的形式列出需要显示的列表项. 实现过程:新建适配器->添加数据源到适配器->视图加载适配器 在安卓中,有两种方法可以在屏幕中添加列表视图 1.直接用Lis ...

  5. java EE 监听器

    生命周期监听器与属性改变监听器都必须使用@WebListener或在web.xml中声明,容器才会知道要加载.读取相关的监听器.

  6. (个人记录)Python2 与Python3的版本区别

    现在还有些开源模块还没有更新到python3 ,不了解版本区别,无法对不合适的地方进行更改. 由于只追求向Python3靠近,所以对于python2的特别用法不探究. 此文不补全所有版本区别,仅作档案 ...

  7. AWS CSAA -- 04 AWS Object Storage and CDN - S3 Glacier and CloudFront(四)

    026 S3 Summary

  8. .NET、ADO.NET、ASP.NET名称解析及.NET平台架构组成

    转https://blog.csdn.net/xiaouncle/article/details/53265256 名词解释 1.Winform:Windows应用程序.桌面应用程序.C/S应用程序  ...

  9. Android应用耗电量统计,无需USB连接

    Android应用耗电量统计一直是一个很头疼的问题,手工统计耗时太长,自动化统计又不是非常精准(执行自动化代码需要通过USB连接,而USB又会充电,这就造成统计数据不准).后来从前辈那里得知可以通过a ...

  10. java web dev知识积累

    tomcat体系结构 可以从tomcat的server.xml文件中元素的层次结构来理解tomcat的体系结构: Server(可以视为tomcat本身)->经由connector可以有多个(c ...