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

📄 sja1000.lst

📁 基于C51的现场总线CAN转串口RS232的源码
💻 LST
📖 第 1 页 / 共 2 页
字号:
 208          unsigned int CAN_Read(unsigned char *Buf,unsigned int MaxNum)
 209          {
 210   1              unsigned int Count = 0;
 211   1              
 212   1              OFF_CAN_INT();
 213   1              while (MaxNum--)
 214   1              {
 215   2                      if (RX_Buff_Tail == RX_Buff_Head)
 216   2                      {//没有数据了
 217   3                              break;
 218   3                      }
 219   2                      *Buf++ = RX_BUFF[RX_Buff_Tail++];
 220   2                      if(RX_Buff_Tail == RX_BUFF_LEN ) 
 221   2                                      RX_Buff_Tail = 0;  // 指针循环
 222   2                      Count++;
 223   2              }
 224   1      
 225   1              ON_CAN_INT();
 226   1      
 227   1              return Count;
 228   1      }
 229          /*
 230          
 231          返回实际读取到的数据
 232           */
 233          
 234          unsigned int UART_Read(unsigned char *Buf,unsigned int MaxNum)
 235          {
 236   1              unsigned int Count = 0;
 237   1              
 238   1              ES = 0;
 239   1              while (MaxNum--)
 240   1              {
 241   2                      if (UART_RX_Buff_Tail == UART_RX_Buff_Head)
C51 COMPILER V8.01   SJA1000                                                               04/22/2008 17:46:16 PAGE 5   

 242   2                      {//没有数据了
 243   3                              break;
 244   3                      }
 245   2                      *Buf++ = UART_RX_Buff[UART_RX_Buff_Tail++];
 246   2                      if(UART_RX_Buff_Tail == UART_RX_Buff_LEN ) 
 247   2                                      UART_RX_Buff_Tail = 0;  // 指针循环
 248   2                      Count++;
 249   2              }
 250   1      
 251   1              ES = 1;
 252   1      
 253   1              return Count;
 254   1      }
 255          bit UART_Send(unsigned char *DataBuf,unsigned int Num)
 256          {
 257   1              unsigned int len;
 258   1              bit Flag = 0;
 259   1              unsigned char i;
 260   1              
 261   1              //计算发送缓冲区的剩余大小
 262   1      
 263   1              do {
 264   2                      ES = 0;
 265   2              
 266   2                      if( UART_TX_Buff_Head < UART_TX_Buff_Tail)
 267   2                      {
 268   3                              len = UART_TX_Buff_Tail - UART_TX_Buff_Head;
 269   3                      }
 270   2                      else
 271   2                      {
 272   3                              len =UART_TX_Buff_LEN -  UART_TX_Buff_Head + UART_TX_Buff_Tail;
 273   3                      }
 274   2                      
 275   2                      ES = 1;
 276   2      
 277   2                      if (len >= Num)
 278   2                      {//有空间发送多余的数据
 279   3                              break;
 280   3                      }
 281   2                      Delay(100);
 282   2                      i++;
 283   2              } while(i< 200);
 284   1              if (i>199)
 285   1              {
 286   2                      return FALSE;
 287   2              }
 288   1      
 289   1              //讲数据放到发送缓冲区
 290   1      
 291   1              ES = 0;
 292   1              if( UART_TX_Buff_Head == UART_TX_Buff_Tail)
 293   1                      Flag = 1;
 294   1      
 295   1      
 296   1              for(len=0; len<Num; len++)
 297   1              {
 298   2                      UART_TX_Buff[UART_TX_Buff_Head++]=DataBuf[len];
 299   2                      
 300   2                      if(UART_TX_Buff_Head == UART_TX_Buff_LEN ) 
 301   2                              UART_TX_Buff_Head = 0;  // 指针循环
 302   2              }
 303   1              ES = 1;
C51 COMPILER V8.01   SJA1000                                                               04/22/2008 17:46:16 PAGE 6   

 304   1              if (Flag == 1)
 305   1              {
 306   2                      TI = 1;
 307   2              }
 308   1      
 309   1      }
 310          
 311          /****************************************************************************
 312                           发送函数
 313          参数:*Buf是某个数组名。这个数组一般是xdata型的。例如a[20],CAN_Send(a,20)。Num是发送数据的个数(小于160)。
 314          返回:
 315          注:"如果缓冲区可以容纳这么多直接填充,如果缓冲区满的话等待之.发送前把发送中断直接打开"
 316                  
 317          
 318          */
 319          bit CAN_Send(unsigned char *DataBuf,unsigned int Num)
 320          {
 321   1              unsigned char i;
 322   1              unsigned int len;
 323   1              unsigned char *p;
 324   1              
 325   1      
 326   1              
 327   1              //计算发送缓冲区的剩余大小
 328   1              i = 0;
 329   1              do {
 330   2                      OFF_CAN_INT();  //关闭CAN中断
 331   2                      
 332   2                      if( TX_Buff_Head < TX_Buff_Tail)
 333   2                      {
 334   3                              len = TX_Buff_Tail - TX_Buff_Head;
 335   3                              
 336   3                      }
 337   2                      else
 338   2                      {
 339   3                              len =TX_BUFF_LEN -  TX_Buff_Head + TX_Buff_Tail;
 340   3                      }
 341   2                      ON_CAN_INT();
 342   2                      if (len >= Num)
 343   2                      {//有空间发送多余的数据
 344   3                              break;
 345   3                      }
 346   2                      Delay(10);
 347   2                      i++;
 348   2              } while(i< 200);
 349   1              if (i>199)
 350   1              {
 351   2                      return FALSE;
 352   2              }
 353   1              //讲数据放到发送缓冲区
 354   1      
 355   1              OFF_CAN_INT();
 356   1      
 357   1              for(len=0; len<Num; len++)
 358   1              {
 359   2                      TX_BUFF[TX_Buff_Head++]=DataBuf[len];
 360   2                      
 361   2                      if(TX_Buff_Head == TX_BUFF_LEN ) 
 362   2                              TX_Buff_Head = 0;  // 指针循环
 363   2              }
 364   1              
 365   1              i = REG_SR;
C51 COMPILER V8.01   SJA1000                                                               04/22/2008 17:46:16 PAGE 7   

 366   1              p = (unsigned char xdata *)(SJA_REG_BaseADD + 0x15);
 367   1      
 368   1              if ((i & 0x04) == 0x04)
 369   1              {//发送缓冲区处于释放状态时,可以将部分数据发送出去
 370   2                      i = 0;
 371   2                      do {
 372   3                              p[i] = TX_BUFF[TX_Buff_Tail++];
 373   3                              i++;
 374   3                              if(TX_Buff_Tail == TX_BUFF_LEN ) 
 375   3                                      TX_Buff_Tail = 0;  // 指针循环
 376   3                      } while((i<8) &&(TX_Buff_Head != TX_Buff_Tail));
 377   2                      
 378   2                      if ((CANConfig.Mode & 0x04) == 0)
 379   2                      {//标准帧
 380   3                              REG_RxBuffer0 = i;    
 381   3                      }
 382   2                      else
 383   2                      {//扩展帧
 384   3                              REG_RxBuffer0 = 0x80 + i;       
 385   3                      }
 386   2                      
 387   2                      REG_CMR = 0x01;         //发送命令 
 388   2              }
 389   1              
 390   1              ON_CAN_INT();
 391   1      
 392   1              return TRUE;
 393   1      
 394   1      }
 395          
 396          
 397          
 398          
 399          
 400          /*******************************************************************
 401                   CAN初始化函数
 402          参数:Mode:0:设置成basic模式  1:设置成PELICAN模式
 403          返回: 初始化成功返回TRUE,否则FALSE
 404          注:先调PeliCan,有时间再调BasicCan
 405          */
 406          bit CAN_Init(void)
 407          {
 408   1              unsigned char Temp,i;
 409   1              
 410   1              RESET_SJA1000();  //复位芯片
 411   1      
 412   1              //设置之前先进入复位模式
 413   1      
 414   1      
 415   1      
 416   1              /*00000001,进入复位模式, MOD |   |   |   |SM|AFM|STM|LOM|RM|
 417   1              SM: 睡眠模式   1 睡眠;没有CAN中断等待和总线活动时,CAN控制器进入睡眠模式 0 唤醒;从睡眠状态唤醒 
 418   1              AFM 验收滤波器模式   1 单;选择单个验收滤波器(32位长度)  0 双;选择两个验收滤波器(每个有16位激活)
 419   1              STM 自检测模式   1 自检测; 此模式可以检测所有节点,没有任何活动的节点使用自接收命令;即使没有应答,CAN控制器
             -也会成功发送
 420   1                              0 正常模式;成功发送时必需应答信号
 421   1              LOM 只听模式   1只听;这种模式中,即使成功接收信息,CAN控制器也不向总线发应答信号;错误计数器停止在当       0 正常

⌨️ 快捷键说明

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