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

📄 usb_can.c

📁 USB转CAN适配器主程序 很实用
💻 C
字号:
//CAN初始化---------------------------------------
#include <C8051F120.h>
#include <intrins.h>
//CAN启动------------------------
void start_CAN(void)
  {  SFPRAGE=CAN0_PAGE               //指向CAN0页面
   CAN0CN|=0x41                      //将CCE和Init置“1”开始初始化 
   CAN0ADR=BITREG                    //指向位定时寄存器进行配置 
   CAN0DAT=0x2301                    //位率为500k/s 
   CAN0CN|=0x06                       //允许全局中断,IE和SIE置位 
   CAN0CN&=0x41 }                 //清楚CCE和INIT位,启动CAN状态机制 
  
void transmit_message(char MsgNum)
  {  SFRPAGE=CAN0_PAGE                //指向CAN0页面 
    CAN0ADR=IF1CMDMSK                 //向IF1命令屏蔽寄存器写入命令 
    CAN0DAT=0X0083;CAN0ADR=IF1ARB2   //指向IF1仲裁寄存器 
    CAN0DATH|=0x80;CAN0ADR=IF1DATA1   //指向数据场的第一个字节 
    for(i=0;i<4;i++)
         {CAN0DAT=can_temp[i]  }      //将4字节数据写入发送缓冲器 

         CAN0ADR=IF1CMDRQST;
         CAN0DATL=MsgNum              //将报文对象编号写入,则数据发送到对应的报文对象中 
  }
void receive_data(void)
   {   SFPRAGE=CAN0_PAGE              //指向CAN0页面*/
       CAN0ADR=IF2CMDMSK              //向IF2命令屏蔽寄存器写命令 
       CAN0DAT=0x003F;
       CAN0ADR=IF2CMDRQST             //将报文对象编号写入命令请求寄存器,对应地接收 
       CAN0DATL=MsgNum                //得到数据就从报文RAM中移到数据缓冲器中 
        CAN0ADR=IF2DATA1              //指向数据场的第一个字节 
        for(i=0;i<4;i++)              //读取4个字节数据*/
      {CAN_RX[i]=CAN0DAT}
   }
  
void main(void) 
{
   // disable watchdog timer
   WDTCN = 0xde;
   WDTCN = 0xad;                          //禁止看殴梅
   
   SFRPAGE = CONFIG_PAGE;                 // 转到配置页面 配置振荡器 
   external_osc ();                       //初始化晶振
   
   
   SFRPAGE = CONFIG_PAGE;                 // 转到配置页面
   PORT_Init ();
   

   Timer3_Init (SYSCLK / 12 /(2*pwmfrq));    
   SFRPAGE = TMR3_PAGE;                   // 转到定时器3
   pwmfrq = 40;
   count = SYSCLK / 12 /(2*pwmfrq)/4;
   
   EA = 1;                                // 启动中断使能

   SFRPAGE = LEGACY_PAGE;                 // Page to sit in for now
void start_CAN();

   while (1) {                            // 循环

   }
}

void external_osc (void)
{
   int n;                        // 循环延时局部变量
  
   OSCXCN  = 0x67;               // 启动外部振荡器; 22.1184 MHz 晶振
                                 
   for (n=0;n<255;n++);          // 延时 1ms
   while ((OSCXCN & 0x80) == 0); // 等待振荡器稳定
   CLKSEL |= 0x01;               // 选择外部振荡器
}

void PORT_Init (void)
{  

   XBR2    = 0x40;                     // 交叉开关使能为弱上拉
   P0MDOUT |= 0x02;                    // 使P0口为推挽式
}


⌨️ 快捷键说明

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