⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 canmonitor.lst

📁 AT90CAN128的CAN通信源码测试成功
💻 LST
📖 第 1 页 / 共 5 页
字号:
     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 + -