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

📄 can总线ii.c

📁 关于SJA1000的CAN总线转串口编程原代码
💻 C
字号:
#include <reg52.h>
#include <intrins.h>
#include <absacc.h>
#define uchar unsigned char
#define uint unsigned int
//SJA1000 的寄存器和位定义
/*定义直接对8051 的存储区访问 */
/*模式和控制寄存器的地址和位定义 */

#define ModeControlReg XBYTE[0X7F00]

#define RM_RR_Bit 0x01 /*复位模式请求位 */
#define LOM_Bit 0x02 /*仅听模式位 */
#define STM_Bit 0x04 /*自我测试模式位 */
#define AFM_Bit 0x08 /*验收滤波器模式位 */
#define SM_Bit 0x10 /*进入休眠模式位 */
/*中断使能和控制寄存器的地址和位定义 */
#define InterruptEnReg XBYTE[0X7F04] /* PeliCAN 模式 */
#define RIE_Bit 0x01 /*接收中断使能位 */
#define TIE_Bit 0x02 /*发送中断使能位 */
#define EIE_Bit 0x04 /*错误警告中断使能位 */
#define DOIE_Bit 0x08 /*数据超载中断使能位 */
#define WUIE_Bit 0x10 /*唤醒中断使能位 */
#define EPIE_Bit 0x20 /*错误隐性中断使能位 */
#define ALIE_Bit 0x40 /*仲裁丢失中断使能位 */
#define BEIE_Bit 0x80 /*总线错误中断使能位 */
/*命令寄存器的地址和位定义 */
#define CommandReg XBYTE[0X7F01]
#define TR_Bit 0x01 /*发送请求位 */
#define AT_Bit 0x02 /*中止发送位 */
#define RRB_Bit 0x04 /*释放接收缓冲器位 */
#define CDO_Bit 0x08 /*清除数据超载位 */
#define SRR_Bit 0x10 /*自身接收请求位 */
/*状态寄存器的地址和位定义 */
#define StatusReg XBYTE[0X7F02]
#define RBS_Bit 0x01 /*接收缓冲器状态位 */
#define DOS_Bit 0x02 /*数据超载状态位 */
#define TBS_Bit 0x04 /*发送缓冲器状态位 */
#define TCS_Bit 0x08 /*发送完成状态位 */
#define RS_Bit 0x10 /*接收状态位 */
#define TS_Bit 0x20 /*发送状态位 */
#define ES_Bit 0x40 /*错误状态位 */
#define BS_Bit 0x80 /*总线状态位 */
/*中断寄存器的地址和位定义 */
#define InterruptReg XBYTE[0X7F03]
#define RI_Bit 0x01 /*接收中断位 */
#define TI_Bit 0x02 /*发送中断位 */
#define EI_Bit 0x04 /*错误警告中断位 */
#define DOI_Bit 0x08 /*数据超载中断位 */
#define WUI_Bit 0x10 /*唤醒中断位 */
#define EPI_Bit 0x20 /*错误被动中断位 */
#define ALI_Bit 0x40 /*仲裁丢失中断位 */
#define BEI_Bit 0x80 /*总线错误中断位 */
/*总线定时寄存器的地址和位定义 */
#define BusTiming0Reg XBYTE[0X7F06]
#define BusTiming1Reg XBYTE[0X7F07]
#define SAM_Bit 0x80 /*采样模式位
1 总线被采样三次
0 总线被采样一次 */
/*输出控制寄存器的地址和位定义 */
#define OutControlReg XBYTE[0X7F08]
/*OCMODE1 OCMODE0 */
#define BiPhaseMode 0x00 /*双相输出模式 */
#define NormalMode 0x02 /*正常输出模式 */
#define ClkOutMode 0x03 /*时钟输出模式 */
/*TX1 的输出管脚配置 */
#define OCPOL1_Bit 0x20 /*输出极性控制位 */
#define Tx1Float 0x00 /*配置为悬空 */
#define Tx1PullDn 0x40 /*配置为下拉 */
#define Tx1PullUp 0x80 /*配置为上拉 */
#define Tx1PshPull 0Xc0 /*配置为推挽 */
/*TX0 的输出管脚配置 */
#define OCPOL0_Bit 0x04 /*输出极性控制位 */
#define Tx0Float 0x00 /*配置为悬空 */
#define Tx0PullDn 0x08 /*配置为下拉 */
#define Tx0PullUp 0x10 /*配置为上拉 */
#define Tx0PshPull 0X18 /*配置为推挽 */
/*检测寄存器*/
#define Can_test XBYTE[0X7F09]
/*验收代码和屏蔽寄存器的地址定义 */
#define AcceptCode0Reg XBYTE[0X7F10]
#define AcceptCode1Reg XBYTE[0X7F11]
#define AcceptCode2Reg XBYTE[0X7F12]
#define AcceptCode3Reg XBYTE[0X7F13]
#define AccepMask0Reg XBYTE[0X7F14]
#define AccepMask1Reg XBYTE[0X7F15]
#define AccepMask2Reg XBYTE[0X7F16]
#define AccepMask3Reg XBYTE[0X7F17]
/*Rx-缓冲器缓冲器的地址定义*/
#define RxFramInFo XBYTE[0X7F10]
#define RxBuffer1 XBYTE[0X7F11]
#define RxBuffer2 XBYTE[0X7F12]
#define RxBuffer3 XBYTE[0X7F13]
#define RxBuffer4 XBYTE[0X7F14]
#define RxBuffer5 XBYTE[0X7F15]
#define RxBuffer6 XBYTE[0X7F16]
#define RxBuffer7 XBYTE[0X7F17]
#define RxBuffer8 XBYTE[0X7F18]
#define RxBuffer9 XBYTE[0X7F19]
#define RxBuffer10 XBYTE[0X7F1A]
#define RxBuffer11 XBYTE[0X7F1B]
#define RxBuffer12 XBYTE[0X7F1C]
/*Tx 缓冲器缓冲器的地址定义*/
/*仅写地址*/
#define TxFramInFo XBYTE[0X7F10]
#define TxBuffer1 XBYTE[0X7F11]
#define TxBuffer2 XBYTE[0X7F12]
#define TxBuffer3 XBYTE[0X7F13]
#define TxBuffer4 XBYTE[0X7F14]
#define TxBuffer5 XBYTE[0X7F15]
#define TxBuffer6 XBYTE[0X7F16]
#define TxBuffer7 XBYTE[0X7F17]
#define TxBuffer8 XBYTE[0X7F18]
#define TxBuffer9 XBYTE[0X7F19]
#define TxBuffer10 XBYTE[0X7F1A]
#define TxBuffer11 XBYTE[0X7F1B]
#define TxBuffer12 XBYTE[0X7F1C]
/*仅读地址 */
#define TxFramInFoRd XBYTE[96]
#define TxBufferRd1 XBYTE[97]
#define TxBufferRd2 XBYTE[98]
#define TxBufferRd3 XBYTE[99]
#define TxBufferRd4 XBYTE[100]
#define TxBufferRd5 XBYTE[101]
#define TxBufferRd6 XBYTE[102]
#define TxBufferRd7 XBYTE[103]
#define TxBufferRd8 XBYTE[104]
#define TxBufferRd9 XBYTE[105]
#define TxBufferRd10 XBYTE[106]
#define TxBufferRd11 XBYTE[107]
#define TxBufferRd12 XBYTE[108]
/*其他寄存器的地址定义 */


#define ArbLostCapReg XBYTE[0X7F0B]
#define ErrCodeCapReg XBYTE[0X7F0C]
#define ErrWarnLimitReg XBYTE[0X7F0D]
#define RxErrCountReg XBYTE[0X7F0E]
#define TxErrCountReg XBYTE[0X7F0F]
#define RxMsgCountReg XBYTE[0X7F1D]
#define RxBufstartAdr XBYTE[0X7F1E]
/*时钟分频寄存器的地址和位定义 */
#define ClockDivideReg XBYTE[0X7F1F]
#define DivBy1 0x07 /*CLKOUT=振荡器频率 */
#define DivBy2 0x00 /*CLKOUT=1/2 振荡器频率 */
#define CLKOff_Bit 0x08 /*时钟关闭位时钟输出管脚控制位 */
#define RXINTEN_Bit 0x20 /*用于接收中断的管脚TX1 */
#define CBP_Bit 0x40 /*CAN 比较器旁路控制位 */
#define CANMode_Bit 0x80 /*CAN 模式控制位 */
/**********delya****************/
void Longdelya(void);
void shortdelya(void);
void delya10ms(uchar timex);
/*******************************/
sbit LQ=P1^0;
sbit DQ=P1^2;
sfr P4=0xe8;
sbit Can_rst=P4^2;
uchar dat[9],buf[32],k,l,I;
/*******************************/


void main(void)
{LQ=0;DQ=0;
 IE=0x90;
 TMOD=0x20;
 TL1=0xfd;
 TH1=0xfd;
 SCON=0x50;
 PCON=0X80;
 TR1=1;
 k=P1;
 k=~k>>4;
 Can_test=0xaa;
  if(Can_test==0xaa){
  Can_rst=0;
  delya10ms(1);
  Can_rst=1;
  delya10ms(1);
  ModeControlReg=ModeControlReg|0x01;
  while((ModeControlReg&0x01)==0){LQ=0;DQ=0;}//复位模式请求
  ClockDivideReg=0xe1;     //设为PeliCAN模式  时钟关闭   比较器旁路
  BusTiming0Reg=0x07;      //设波特率为50K 采样一次
  BusTiming1Reg=0xaf;
  AcceptCode0Reg=k;        //验收为k
  AcceptCode1Reg=0;
  AcceptCode2Reg=k;
  AcceptCode3Reg=0;
  AccepMask0Reg=0;
  AccepMask1Reg=0;
  AccepMask2Reg=0;
  AccepMask3Reg=0;
  OutControlReg=0x1a;
  ModeControlReg=ModeControlReg&0x00;
  while((ModeControlReg&1)==1){;}
  LQ=1;DQ=1;
  CommandReg=CommandReg|0x04;}
  else{LQ=0;DQ=0;}
  while(1){while((StatusReg&1)==1){dat[0]=RxBuffer3;
  			  	   dat[1]=RxBuffer4;
                                   dat[2]=RxBuffer5;
                                   dat[3]=RxBuffer6;
                                   dat[4]=RxBuffer7;
                                   dat[5]=RxBuffer8;
                                   dat[6]=RxBuffer9;
                                   dat[7]=RxBuffer10;
                                   CommandReg=CommandReg|0x04;
                                   DQ=!DQ;
          for(l=0;l<=7;l++){
          		    SBUF=dat[l];delya10ms(2);
                            TI=0;}
               			   }
          }
 }
/************通信中断子程序*****************/
void SCONSUB() interrupt 4 using 2
 {if(RI){RI=0;
 	 buf[I]=SBUF;
 	 I++;
 	 if(I>=9){I=0;
                  if((StatusReg&0x0c)==0x0c){
                  if((StatusReg&0x20)!=0x20){
                  if((StatusReg&0x08)!=0){
                  if((StatusReg&0x04)!=0){
         		      	     	  TxFramInFo=8;
           			      	  TxBuffer1=buf[0];
          			      	  TxBuffer2=0;
           			      	  TxBuffer3=buf[1];
			   	          TxBuffer4=buf[2];
           			      	  TxBuffer5=buf[3];
           			      	  TxBuffer6=buf[4];
           			      	  TxBuffer7=buf[5];
           			      	  TxBuffer8=buf[6];
           			      	  TxBuffer9=buf[7];
           			      	  TxBuffer10=buf[8];
                                      	  CommandReg=1;
                                      	  LQ=!LQ;
                                          }
                                          }
                                          }
                                          }
        	     }
        }
 else TI=0;
 }
/**********************************************/
 void Longdelya(void)
 {uchar n;
  for (n=0;n<10;n++);}
/**********************************************/
 void shortdelya(void)
 {uchar n;
  for (n=0;n<1;n++);}
/**********************************************/
void delya10ms(uchar timex)
{
  uchar n;
  uchar m;
  for(n=0;n<timex;n++)
  {
    for(m=0;m<200;m++)
    {;}
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -