📄 canmonitor.lst
字号:
238 0192 MOVW R18,R4
239 940E 0789 CALL fpdiv2
23B 8308 STD Y+0,R16
23C 8319 STD Y+1,R17
23D 832A STD Y+2,R18
23E 833B STD Y+3,R19
23F 94A3 INC R10
240 840F LDD R0,Y+15
241 14A0 CP R10,R0
242 F408 BCC 0x0244
243 CF87 RJMP 0x01CB
244 9629 ADIW R28,0x9
245 940E 0664 CALL pop_xgset00FC
247 9624 ADIW R28,4
248 9508 RET
FILE: E:\li\liliang\can-232\CAN-232\can.c
(0001) /********************************************************************
(0002) * 函数库说明:CAN总线驱动函数库 *
(0003) * 版本说明: 1.0 Bate *
(0004) * 作者: andylee *
(0005) * 日期: 2006年7月 *
(0006) * 平台: mega16 16M *
(0007) * 说明: 为上层提供CAN控制器的基本读写函数,数据发送、接受函数*
(0008) ********************************************************************/
(0009) #include "can.h"
(0010) #include "delay.h"
(0011)
(0012) //#define DEBUG
(0013) #define TransBuffer TransmitMessage
(0014) /*********************
(0015) * 全局变量定义 *
(0016) *********************/
(0017) //unsigned char CanMode[14];
(0018) unsigned char TransmitMessage[13];
(0019) unsigned char RxBuffer[13];
(0020) #ifdef DEBUG
(0021) unsigned char temp1;
(0022) #endif
(0023)
(0024) /********************************************************** **********
(0025) * 函数说明:CAN控制器引脚初始化 *
(0026) * 输入: *
(0027) * 输出:无 *
(0028) ********************************************************************/
(0029) void sja_port_init(void)
(0030) {
(0031) //CAN数据线设置
(0032) PORTC=0x00;
_sja_port_init:
249 2422 CLR R2
24A BA25 OUT 0x15,R2
(0033) DDRC=0xff;
24B EF8F LDI R24,0xFF
24C BB84 OUT 0x14,R24
(0034) PORTD=0b11000000; //INT引脚输入不上拉
24D EC80 LDI R24,0xC0
24E BB82 OUT 0x12,R24
(0035) DDRD =0b11111000;
24F EF88 LDI R24,0xF8
250 BB81 OUT 0x11,R24
(0036) //CAN 控制引脚设置
(0037) CAN_DDR|=(1<<WR)|(1<<RD)|(1<<ALE)|(1<<CS);
251 B38A IN R24,0x1A
252 6F80 ORI R24,0xF0
253 BB8A OUT 0x1A,R24
(0038) WR_H;
254 9ADD SBI 0x1B,5
(0039) RD_H;
255 9ADE SBI 0x1B,6
(0040) ALE_L;
256 98DC CBI 0x1B,4
(0041) CS_H;
257 9ADF SBI 0x1B,7
258 9508 RET
(0042) }
(0043)
(0044) /********************************************************************
(0045) * 函数说明:模拟CAN收发时序,写一个字节到CAN控制器 *
(0046) * 输入:data,address *
(0047) * 输出:无 *
(0048) ********************************************************************/
(0049) void sja_write_data(unsigned char addr,unsigned char data)
(0050) {
(0051) RD_H;
_sja_write_data:
data --> R18
addr --> R16
259 9ADE SBI 0x1B,6
(0052) DDRC=0xFF; //总线设置为输出
25A EF8F LDI R24,0xFF
25B BB84 OUT 0x14,R24
(0053) // ALE_L;
(0054) PORTC=addr;
25C BB05 OUT 0x15,R16
(0055) ALE_H;
25D 9ADC SBI 0x1B,4
(0056) NOP();
25E 0000 NOP
(0057) ALE_L; //下降沿地址锁存
25F 98DC CBI 0x1B,4
(0058) NOP();
260 0000 NOP
(0059)
(0060) PORTC=data;
261 BB25 OUT 0x15,R18
(0061) CS_L;
262 98DF CBI 0x1B,7
(0062) WR_L;
263 98DD CBI 0x1B,5
(0063) NOP();
264 0000 NOP
(0064) WR_H; //上升沿数据写入
265 9ADD SBI 0x1B,5
(0065) NOP();
266 0000 NOP
(0066) // ALE_H;
(0067) CS_H;
267 9ADF SBI 0x1B,7
268 9508 RET
_sja_read_data:
data --> R10
addr --> R16
269 92AA ST R10,-Y
(0068) }
(0069)
(0070) /********************************************************************
(0071) * 函数说明:模拟CAN收发时序,从CAN控制器读一个字节 *
(0072) * 输入:address *
(0073) * 输出:data *
(0074) ********************************************************************/
(0075) unsigned char sja_read_data(unsigned char addr)
(0076) {
(0077) unsigned char data;
(0078) WR_H;
26A 9ADD SBI 0x1B,5
(0079) DDRC=0xFF; //总线设置为输出
26B EF8F LDI R24,0xFF
26C BB84 OUT 0x14,R24
(0080)
(0081) ALE_L;
26D 98DC CBI 0x1B,4
(0082) PORTC=addr;
26E BB05 OUT 0x15,R16
(0083) ALE_H;
26F 9ADC SBI 0x1B,4
(0084) NOP();
270 0000 NOP
(0085) ALE_L; //地址锁存
271 98DC CBI 0x1B,4
(0086) NOP();
272 0000 NOP
(0087)
(0088) PORTC=0xFF;
273 BB85 OUT 0x15,R24
(0089) DDRC=0x00; //总线设置为输入,内部上拉
274 2422 CLR R2
275 BA24 OUT 0x14,R2
(0090) CS_L;
276 98DF CBI 0x1B,7
(0091) RD_L;
277 98DE CBI 0x1B,6
(0092) NOP();
278 0000 NOP
(0093) RD_H;
279 9ADE SBI 0x1B,6
(0094) NOP();
27A 0000 NOP
(0095) data=PINC;
27B B2A3 IN R10,0x13
(0096) CS_H;
27C 9ADF SBI 0x1B,7
(0097) return data;
27D 2D0A MOV R16,R10
27E 90A9 LD R10,Y+
27F 9508 RET
(0098) }
(0099)
(0100) /********************************************************************
(0101) * 函数说明:初始化SJA1000的相关寄存器:设置工作模式,波特率,验收码*
(0102) * 输入:无 *
(0103) * 输出:无 *
(0104) ********************************************************************/
(0105) void sja_init(void)
(0106) {
(0107) unsigned char temp;
(0108) unsigned int k ;
(0109)
(0110) CLI();
_sja_init:
k --> Y,+1
temp --> Y,+1
280 94F8 BCLR 7
(0111) sja_write_data(MODE,0x09); //单个验收滤波,复位模式
281 E029 LDI R18,0x9
282 2700 CLR R16
283 DFD5 RCALL _sja_write_data
(0112)
(0113) sja_read_data(IR); //读取CAN的中断标识,除接受中断外的所有中断复位
284 E003 LDI R16,3
285 DFE3 RCALL _sja_read_data
286 C003 RJMP 0x028A
(0114)
(0115) while(!( sja_read_data(MODE)&0x01)) //检测SJA1000是否达到复位工作模式
(0116) {
(0117) sja_write_data(MODE,0x09); //进入复位工作模式
287 E029 LDI R18,0x9
288 2700 CLR R16
289 DFCF RCALL _sja_write_data
28A 2700 CLR R16
28B DFDD RCALL _sja_read_data
28C FF00 SBRS R16,0
28D CFF9 RJMP 0x0287
(0118) }
(0119) delay_nus(5); //延时约5us
28E E005 LDI R16,5
28F E010 LDI R17,0
290 DDF4 RCALL _delay_nus
(0120) sja_write_data(CDR,REG_CDR_DATA); //PeliCAN 模式,旁路输入比较器,禁能CLOCKOUT引脚
291 E828 LDI R18,0x88
292 E10F LDI R16,0x1F
293 DFC5 RCALL _sja_write_data
(0121) delay_nus(5); //延时约5us
294 E005 LDI R16,5
295 E010 LDI R17,0
296 DDEE RCALL _delay_nus
(0122)
(0123) sja_write_data(BTR0,BTR0_Rate_250k); //同步跳转宽度4;时钟4分频,波特率250Kb/s
297 E021 LDI R18,1
298 E006 LDI R16,6
299 DFBF RCALL _sja_write_data
(0124) sja_write_data(BTR1,BTR1_Rate_250k); //采样3次;时间段1,2=10,5
29A E12C LDI R18,0x1C
29B E007 LDI R16,7
29C DFBC RCALL _sja_write_data
(0125)
(0126) sja_write_data(OCR,REG_OCR_DATA); //输出控制,推拉结构,正逻辑
29D E12A LDI R18,0x1A
29E E008 LDI R16,0x8
29F DFB9 RCALL _sja_write_data
(0127)
(0128) sja_write_data(RXERR,0x00); //收发错误寄存器清零
2A0 2722 CLR R18
2A1 E00E LDI R16,0xE
2A2 DFB6 RCALL _sja_write_data
(0129) sja_write_data(TXERR,0x00);
2A3 2722 CLR R18
2A4 E00F LDI R16,0xF
2A5 DFB3 RCALL _sja_write_data
(0130) sja_write_data(ECC,0x00); //错误代码捕捉寄存器清零
2A6 2722 CLR R18
2A7 E00C LDI R16,0xC
2A8 DFB0 RCALL _sja_write_data
(0131)
(0132) sja_write_data(RBSA,0x00); //缓存器起始地址寄存器设置为0
2A9 2722 CLR R18
2AA E10E LDI R16,0x1E
2AB DFAD RCALL _sja_write_data
(0133)
(0134) sja_write_data(ACR0,ACR0_ID); //验收屏蔽
2AC EF2F LDI R18,0xFF
2AD E100 LDI R16,0x10
2AE DFAA RCALL _sja_write_data
(0135) sja_write_data(ACR1,ACR1_ID);
2AF EF28 LDI R18,0xF8
2B0 E101 LDI R16,0x11
2B1 DFA7 RCALL _sja_write_data
(0136) sja_write_data(ACR2,ACR2_ID);
2B2 2722 CLR R18
2B3 E102 LDI R16,0x12
2B4 DFA4 RCALL _sja_write_data
(0137) sja_write_data(ACR3,ACR3_ID);
2B5 2722 CLR R18
2B6 E103 LDI R16,0x13
2B7 DFA1 RCALL _sja_write_data
(0138)
(0139) sja_write_data(AMR0,AMR0_ID);
2B8 EF2F LDI R18,0xFF
2B9 E104 LDI R16,0x14
2BA DF9E RCALL _sja_write_data
(0140) sja_write_data(AMR1,AMR1_ID);
2BB EF2F LDI R18,0xFF
2BC E105 LDI R16,0x15
2BD DF9B RCALL _sja_write_data
(0141) sja_write_data(AMR2,AMR2_ID);
2BE EF2F LDI R18,0xFF
2BF E106 LDI R16,0x16
2C0 DF98 RCALL _sja_write_data
(0142) sja_write_data(AMR3,AMR3_ID);
2C1 EF2F LDI R18,0xFF
2C2 E107 LDI R16,0x17
2C3 DF95 RCALL _sja_write_data
(0143)
(0144) sja_write_data(IER,REG_IER_DATA); //开放接收中断
2C4 E821 LDI R18,0x81
2C5 E004 LDI R16,4
2C6 DF92 RCALL _sja_write_data
(0145)
(0146) sja_write_data(CMR,COS_CMD); //清除数据溢出
2C7 E028 LDI R18,0x8
2C8 E001 LDI R16,1
2C9 DF8F RCALL _sja_write_data
(0147) delay_nus(10);
2CA E00A LDI R16,0xA
2CB E010 LDI R17,0
2CC DDB8 RCALL _delay_nus
(0148) sja_write_data(CMR,RRB_CMD); //释放接收缓冲器
2CD E024 LDI R18,4
2CE E001 LDI R16,1
2CF DF89 RCALL _sja_write_data
(0149)
(0150) do
(0151) {
(0152) //sja_write_data(MODE,0x04); //设置SJA1000 工作模式;zijiance
(0153) sja_write_data(MODE,0x08); //设置SJA1000 工作模式
2D0 E028 LDI R18,0x8
2D1 2700 CLR R16
2D2 DF86 RCALL _sja_write_data
(0154) }
(0155) while((sja_read_data(MODE)&0x01)); //确认复位标志是否被删除
2D3 2700 CLR R16
2D4 DF94 RCALL _sja_read_data
2D5 FD00 SBRC R16,0
2D6 CFF9 RJMP 0x02D0
(0156)
(0157) SEI();
2D7 9478 BSET 7
2D8 9508 RET
_sja_tx_service:
FF --> R14
Length --> R12
i --> R10
2D9 940E 066F CALL push_xgset00FC
(0158) }
(0159)
(0160) /********************************************************************
(0161) * 函数说明:SJA1000中断发送服务程序,若有待发送报文则及时发送 *
(0162) * 输入:无 *
(0163) * 输出:无 *
(0164) ********************************************************************/
(0165) void sja_tx_service(void)
(0166) {
(0167) unsigned char Length;
(0168) unsigned char FF,i;
(0169) if(flag.mess_wait==TRUE)
2DB 9180 0071 LDS R24,flag
2DD 7081 ANDI R24,1
2DE 3081 CPI R24,1
2DF F009 BEQ 0x02E1
2E0 C049 RJMP 0x032A
(0170) {
(0171) led_on;
2E1 9897 CBI 0x12,7
(0172) flag.mess_wait=FALSE; //清报文待发送标志
2E2 9180 0071 LDS R24,flag
2E4 7F8E ANDI R24,0xFE
2E5 9380 0071 STS flag,R24
(0173) FF=TransmitMessage[0]&0x80; //取贞格式
2E7 9180 00B9 LDS R24,TransmitMessage
2E9 7880 ANDI R24,0x80
2EA 2EE8 MOV R14,R24
(0174) Length=TransmitMessage[0]&0x0f; //取数据长度代码
2EB 9180 00B9 LDS R24,TransmitMessage
2ED 708F ANDI R24,0xF
(0175)
(0176) if(Length=0x08)
2EE E088 LDI R24,0x8
2EF 2EC8 MOV R12,R24
2F0 20CC TST R12
2F1 F011 BEQ 0x02F4
(0177) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -