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

📄 sja1000t.c

📁 一个DSP2812的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
   // if(TempData != BTR1_Rate_125k)    return 6; 

    // 中断控制: 总线错误中断、发送中断、接收中断 
    SJA1000_WRITE(Device, REG_INTENABLE,REG_INTENABLE_DATA); // 访问中断使能控制 
   // TempData = SJA1000_READ(Device, REG_INTENABLE); 
   // if(TempData != REG_INTENABLE_DATA)    return 7; 

    // 设置滤波器,地址为本地的IP前29位,全匹配 
    SJA1000_WRITE(Device, REG_ACR1,REG_ACR1_FID);       // 验收代码寄存器(ACR1)--IP地址最低位 
   // TempData = SJA1000_READ(Device, REG_ACR1); 
   // if(TempData != REG_ACR1_FID)        return 8; 

    SJA1000_WRITE(Device, REG_ACR2,REG_ACR2_FID);       // 验收代码寄存器(ACR2) 
   // TempData = SJA1000_READ(Device, REG_ACR2); 
   // if(TempData != REG_ACR2_FID)        return 9; 

    SJA1000_WRITE(Device, REG_ACR3,REG_ACR3_FID);       // 验收代码寄存器(ACR3) 
   // TempData = SJA1000_READ(Device, REG_ACR3); 
   // if(TempData != REG_ACR3_FID)        return 10; 

    SJA1000_WRITE(Device, REG_ACR4,REG_ACR4_FID);  // 验收代码寄存器(ACR4)--IP地址最高位 
  //  TempData = SJA1000_READ(Device, REG_ACR4); 
   // if(TempData != REG_ACR4_FID)        return 11; 

    SJA1000_WRITE(Device, REG_AMR1,REG_AMR1_FID);          // 验收屏蔽寄存器(1屏,0有效) 
  //  TempData = SJA1000_READ(Device, REG_AMR1); 
   // if(TempData != REG_AMR1_FID)        return 12;
     
    SJA1000_WRITE(Device, REG_AMR2,REG_AMR2_FID);          // 验收屏蔽寄存器(1屏,0有效) 
   // TempData = SJA1000_READ(Device, REG_AMR2); 
   // if(TempData != REG_AMR2_FID)        return 13; 

    SJA1000_WRITE(Device, REG_AMR3,REG_AMR3_FID);          // 验收屏蔽寄存器(1屏,0有效) 
  //  TempData = SJA1000_READ(Device, REG_AMR3); 
  //  if(TempData != REG_AMR3_FID)        return 14;
     
    SJA1000_WRITE(Device, REG_AMR4,REG_AMR4_FID);     // 验收屏蔽寄存器(1屏,0有效)--最低二位不匹配 
   // TempData = SJA1000_READ(Device, REG_AMR4); 
   // if(TempData != REG_AMR4_FID)        return 15; 


    // SJA1000控制 
    SJA1000_WRITE(Device, REG_MODE,REG_MODE_DATA); 
  //  TempData = SJA1000_READ(Device, REG_MODE); 
  //  if(TempData != REG_MODE_DATA)        return 16; 

    for(RSTCOUNT=0;RSTCOUNT<50;RSTCOUNT++);   // 复位延时 

    return 0; 

} 




/****************************************************************************** 
函数名称:      unsigned char  SJA1000_CMD_PRG(unsigned char cmd) 
功能说明:      执行sja1000命令 
输入参数:      cmd:sja1000运行的命令字 
              01:发送请求 
              02:中止发送 
              04:释放接收缓冲区 
              08:清除超载状态 
              0x10:进入睡眠状态 
输出参数:      0 : 表示命令执行成功 
              >=1 : 表示命令执行失败 
******************************************************************************/ 
unsigned char  SJA1000_CMD_PRG(unsigned char Device, unsigned char cmd) 
{ 

    switch(cmd) 
    { 
        case  TXD_ONE_CMD:                        // 产生一次报文发送,当错误时不再生发(单次发送) 
                SJA1000_WRITE(Device, REG_COMMAND,cmd);   //访问地址指向命令寄存器 
                return    0; 

        case  TXD_CMD:                            // 发送请求命令,当错误时可重发 
                SJA1000_WRITE(Device, REG_COMMAND,cmd);   //访问地址指向命令寄存器 
                return    0; 

        case  T_R_CMD:                            // 产生一次自接收性质的报文发送,发送错误时不会重发 
                SJA1000_WRITE(Device, REG_COMMAND,cmd);   //访问地址指向命令寄存器 
                return    0; 

        case  AT_CMD:                             // 中止发送命令 
                SJA1000_WRITE(Device, REG_COMMAND,cmd);   //访问地址指向命令寄存器 
                return    0; 

        case  RRB_CMD:                            // 释放接收缓冲区 
                SJA1000_WRITE(Device, REG_COMMAND,cmd);   //访问地址指向命令寄存器 
                return    0; 

        case  COS_CMD:                            // 数据溢出清除命令 
                SJA1000_WRITE(Device, REG_COMMAND,cmd);   //访问地址指向命令寄存器 
                return    0; 

        default: 
                return    1; 
    } 

} 





/****************************************************************************** 
函数名称:      unsigned char  SJA1000_DATA_SEND(unsigned char *SendDataBuf) 
功能说明:      本函数的返回值仅指示,将数据正确写入SJA1000发送缓存区中与否 
输入参数:      unsigned char * SendDataBuf:  报文 
              unsigned int Message_Longth:  报文长度 

输出参数:      0  表示将数据成功的送至发送缓冲区 
              >=1  表示上一次的数据正在发送, 
函数扇出清单: 
函数扇入清单: 
其它说明:      unsigned char *SendDataBuf:  为一帧完整的报文 

******************************************************************************/ 
unsigned char  SJA1000_DATA_SEND(unsigned char Device, Uint32 *SendDataBuf, Uint32 Message_Longth) 
{ 
    unsigned char TempData; 
	Uint16   i = 0,j,buffer;
	Uint32   msgid = SEND_MSG_ID;
	Uint32   sendcounter = 0;

	if((Message_Longth % 2) != 0)
      Message_Longth = Message_Longth-1;

    if(sendcounter < Message_Longth) 
    {     

status1:  i++;
          FEED_WATCHDOG;
          if(i>0xFF)
           {
		     error();
		   }
       
       
        TempData = SJA1000_READ(Device, REG_STATUS);   //访问地址指向状态寄存器
     
	    if((TempData & 0x10) == 0x10)               //判断是否正在接收   
	          goto status1; 
	    else 
	      if((TempData & 0x08) != 0x08)          //判断上次发送是否完成 
             // SJA1000_CMD_PRG(Device, AT_CMD);
	          goto status1;
	      else 
	        if((TempData & 0x04) != 0x04)            //判断发送缓冲区是否锁定 
	           goto status1; 

	        msgid = msgid+1;
			msgid = msgid<<3;
		    // CAN发送的帧报文信息: 扩展数据帧,8个数据 
		    SJA1000_WRITE(Device, REG_TXD_FID,0x88); 
		    // CAN发送的标识 
		    SJA1000_WRITE(Device, REG_TXD_ID1,(unsigned char)((msgid & 0xFF000000)>>24)); 
		    SJA1000_WRITE(Device, REG_TXD_ID2,(unsigned char)((msgid & 0x00FF0000)>>16)); 
		    SJA1000_WRITE(Device, REG_TXD_ID3,(unsigned char)((msgid & 0x0000FF00)>>8)); 
		    SJA1000_WRITE(Device, REG_TXD_ID4,(unsigned char)(msgid & 0x000000FF)); 
	        msgid = msgid>>3;

		    // CAN发送的数据 
			buffer = REG_TXBuffer;
			for(i=0;i<2;i++)
			{
			    sendcounter++;
				TempData = (unsigned char)(*SendDataBuf & 0x000000FF);
				for(j=0;j<4;j++)
				{ 
				    SJA1000_WRITE(Device, buffer++,TempData); 
					TempData = (unsigned char)((*SendDataBuf>>8) & 0x000000FF);
			    }
		        SendDataBuf++;
	        }
		    TempData = SJA1000_CMD_PRG(Device, TXD_CMD);       // 产生一次自接收性质的报文发送,发送错误时不会重发 
		    if(TempData != 0x00) 
			  return 1; 
    }

    return 0; 

} 
/****************************************************************************** 
函数名称:      unsigned char  SJA1000_DATA_RECEIVE(unsigned char Device, unsigned char *ReceiveDataBuf, unsigned char Message_Longth)
功能说明:      读接收缓冲区数据
输入参数:      unsigned char * SendDataBuf:  报文 
              unsigned int Message_Longth:  报文长度 

其它说明:      unsigned char *SendDataBuf:  为一帧完整的报文 

******************************************************************************/ 

unsigned char  SJA1000_DATA_RECEIVE(unsigned char Device, unsigned char *ReceiveDataBuf, unsigned char Message_Longth)
{
    unsigned char  TempData; 
	unsigned char   i = 0, buffer = 0;

status2:  i++;
          FEED_WATCHDOG;
          if(i>0xFF)
           {
		     error();
		   }
       
        TempData = SJA1000_READ(Device, REG_STATUS);   //访问地址指向状态寄存器
     
	    if((TempData & 0x20) == 0x20)               //判断是否正在发送   
	        goto status2; 
	    else 
		  if((TempData & 0x02) == 0x02)
		  {
             SJA1000_CMD_PRG(Device, COS_CMD);
		     SJA1000_CMD_PRG(Device, RRB_CMD);
	         goto status2; 
          }
		  else
		      if((TempData & 0x01) != 0x01)          //判断缓冲区是否满 
			    {
			      SJA1000_CMD_PRG(Device, RRB_CMD);
		          return  1;
		        }
          buffer = REG_RXD_FID;
          for(i=0;i< Message_Longth;i++)
		  {
	         *ReceiveDataBuf++ = SJA1000_READ(Device, buffer++);
          }
	     
	     SJA1000_CMD_PRG(Device, RRB_CMD);

		 return 0;

}




⌨️ 快捷键说明

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