canjishou.lst
来自「这是我前一段开发CAN总线通讯时编写的CAN测试程序」· LST 代码 · 共 372 行 · 第 1/2 页
LST
372 行
C51 COMPILER V7.06 CANJISHOU 01/25/2008 11:18:21 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE CANJISHOU
OBJECT MODULE PLACED IN canjishou.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE canjishou.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /*中断方式接收CAN数据*/
2
3
4
5 #include<reg52.h>
6 #include<intrins.h>
7 #include "SJA100REG.H"
8
9 sfr CKCON=0xb6; //定义时钟控制寄存器
10 sfr IPH=0xb7; //中断器优先级高位
11 sbit RST_SJA1000=P1^7;//SJA1000硬件复位
12 sbit CS_SJA1000= P2^7;//片选信号
13
14
15 sbit SHANGDIAN_ID1= P1^3;//
16 sbit STATE_ID2= P1^4;//
17 sbit STATE_ID3= P1^5;//
18 sbit STATE_ID4= P1^6;//
19 sbit LED0= P1^0;//
20 sbit LED1= P1^1;//
21 sbit LED2= P1^2;//
22
23 unsigned char TIME_counter=0;
24 unsigned char TIME_counter1=0;
25 unsigned char TIME_counter2=0;
26 unsigned char counter=0;
27
28 unsigned char BTR0,BTR1;
29 //unsigned char xdata CAN_SJA_BaseAdr _at_ 0x7f00; //定义SJA1000的片选基址
30 #define CAN_SJA_BaseAdr 0x7f00 //定义sja1000的片选基址
31
32 unsigned char xdata *SJA_CS_Point ; //指针指向空
33 unsigned char Send_CAN_Filter[8]={0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff};//验收及屏蔽数据
34 //unsigned char Send_CAN_Filter[8]={0x07,0x80,0x07,0xF7,0xE0,0x00,0xE0,0x00};//验收及屏蔽数据 /此数据是根
-据已知四个
35 //四个PGN定义的,如果再加,还得变化
36 unsigned char Rev_CAN_data[13]; //07 f7 88 00CAN总线通讯接受存储单元
37 unsigned char Rev_COM_data[13]={0x88,0x07,0xF7,0x88,0x00,0x11,0x01,0x66,0x55,0x44,0x33,0x22,0x11}; //串
-口通讯接受存储单元
38 unsigned char Signal_Stor_data[6];//要传给串口需要上传的信息 ,0 1字节 速度、
39 // 2字节状态信号 ,BIT4上电 BIT3状态4 BIT2状态3 BIT1状态2 BIT0刹车
40 // 3 4字节 发动机转速。
41 // 5 6字节 水温
42 //unsigned char Extand_Stor_ID[10];//0存放可选信号的状态(需要采哪些信号1需要,0不需要)
43 //1字节存可选信号的类型(CAN没有固定的,看是用CAN采1,还是脉冲采0)
44 //2 3字节存状态1信号的ID 上电信号
45 //4 5字节存状态2信号的ID
46 //6 7字节存状态3信号的ID
47 //8 9字节存状态4信号的ID
48
49 bit CAN_INT_bz=0; //看有无报文
50 bit Com_Begin_bz=0; //串口数据开始接受
51 //bit error_bz=0;
52 bit txcs_bz=0; //串口通讯超时标志
53 bit ID_Config_bz=0; //ID初始化标志,进入正常通讯之后还要判断是否进行过了上电初始化。
C51 COMPILER V7.06 CANJISHOU 01/25/2008 11:18:21 PAGE 2
54
55
56 /*
57 void Delay_ms(unsigned char j)
58 {
59 unsigned char k,l;
60 for(l=0;l<=j;l++)
61 {
62 for(k=0;k<=250;k++)
63 {
64 ;
65 }
66 }
67 }
68 ------------------------------------------------------------------------------------------------------*/
69 /*硬件复位SJA1000*/
70 void SJA1000_HardwareRst(void)
71 { RST_SJA1000=0;
72 1 // Delay_ms(50);
73 1 // Delay_ms(50);
74 1 // Delay_ms(50);
75 1 // RST_SJA1000=1;
76 1 // Delay_ms(50);
77 1 // Delay_ms(50);
78 1 // Delay_ms(10);
79 1 RST_SJA1000=0;
80 1 }
81
82
83 /*--------------------------------------------------------------------------------------------------------
84 ** 函数原型: unsigned char SJAEntryResetMode(void)
85 ** 功能描述: 该函数用于使sja1000进入复位模式
86 ** 参数说明: 无
87 ** 返回值: 1 表示SJA1000进入复位模式成功
88 ** 0 表示SJA1000进入复位模式失败
89
90 /*------------------------------------------------------------------------------------------------------*/
91 bit SJAEntryResetMode(void)
92 {
93 1 unsigned char TempData;
94 1 SJA_CS_Point = CAN_SJA_BaseAdr+REG_CAN_MOD; //访问地址指向控制寄存器
95 1 TempData= *SJA_CS_Point; //保存原始值
96 1 *SJA_CS_Point=(TempData|0x01); //置位复位请求
97 1 _nop_();
98 1 _nop_();
99 1 if((*SJA_CS_Point&0x01) == 1)
100 1 {
101 2 return 0;
102 2 }
103 1 else
104 1 {
105 2 return 1;
106 2 }
107 1
108 1 }
109
110 /*-------------------------------------------------------------------------------------------------------
--
111 ** 函数原型: unsigned char SJAQuitResetMode(void)
112 ** 功能描述: 该函数用于使sja1000退出复位模式,进入工作模式
113 ** 参数说明: 无
114 ** 返回值: 1 表示SJA1000退出复位模式成功
C51 COMPILER V7.06 CANJISHOU 01/25/2008 11:18:21 PAGE 3
115 ** 0 表示SJA1000退出复位模式失败
116
117 /*------------------------------------------------------------------------------------------------------*/
118 bit SJAQuitResetMode(void)
119 {
120 1 unsigned char TempData;
121 1 SJA_CS_Point = CAN_SJA_BaseAdr+REG_CAN_MOD; //
122 1 TempData= *SJA_CS_Point; //保存原始值
123 1 *SJA_CS_Point=(TempData&0xfe); //释放复位请求
124 1 _nop_();
125 1 _nop_();
126 1 if((*SJA_CS_Point&0x01) == 0)
127 1 {
128 2 return 0;
129 2 }
130 1 else
131 1 {
132 2 return 1;
133 2 }
134 1
135 1 }
136
137
138 /*-------------------------------------------------------------------------------------------------------
--
139 ** 函数原型: unsigned char WriteSJARegBlock(unsigned char RegAdr,unsigned char *ValueBuf,unsigned char
-len)
140 ** 功能描述: 该函数用于将指定的数值写入sja1000的指定的寄存器
141 ** 参数说明: RegAdr 要写入的sja1000的内部寄存器地址
142 ** ValueBuf 要写入寄存器的值的存储器地址
143 ** len 要写入sja1000内部寄存器的长度
144 ** 返回值: 1 写入正确
145 ** 0 写入不正确
146
147 /*------------------------------------------------------------------------------------------------------*/
148 WriteSJARegBlock(unsigned char RegAdr,unsigned char *ValueBuf,unsigned char len)
149 { unsigned char TempData;
150 1 for(TempData=0;TempData<len;TempData++)
151 1 { SJA_CS_Point = CAN_SJA_BaseAdr+RegAdr+TempData; //
152 2 *SJA_CS_Point = ValueBuf[TempData];
153 2 }
154 1 }
155
156
157 /*--------------------------------------------------------------------------------------------------------
158 ** 函数原型: WriteSJAReg(unsigned char RegAdr,unsigned char Value)
159 ** 功能描述: 该函数用于将指定的数值写入sja1000的指定的寄存器
160 ** 参数说明: RegAdr 要读的sja1000的内部寄存器地址
161 ** Value 写入寄存器的值
162 ** 返回值: 1 写入正确
163 ** 0 写入不正确
164 /*------------------------------------------------------------------------------------------------------*/
165 bit WriteSJAReg(unsigned char RegAdr,unsigned char Value)
166 {
167 1
168 1 SJA_CS_Point = CAN_SJA_BaseAdr+RegAdr; //
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?