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

📄 can.c

📁 ARM7 lpc2132+vs1003+sdcard 制作的 MP3 此程序在ADS1.2环境下编译
💻 C
字号:
#include <stdlib.h>
#include <stdarg.h>
#include <stdio.h>
#include "config.h"
#include "can.h"

INT16U  Can1Tbp,Can1Tep;  // CAN 发送环形缓冲区指针
INT16U  Can1Rbp,Can1Rep;  // CAN 接收环形缓冲区指针

INT32U  Can1Tb[CanBufSize][4];      // CAN  发送环形缓冲区
INT32U  Can1Rb[CanBufSize][4];      // CAN  接收环形缓冲区

union   ucanbuf Can1,Can2;

INT32U cur_floor,cur_dir,open_door,close_door,up_ring,down_ring,over_load;
INT8U music_name;
volatile  INT32U voice_command_old;
static INT32U old_dir,voice_command=1,voice_timer=0;
INT16U  Can1To, Can2To;//超时定时器

void InitCan1(void)
{
 	CANAFMR = 3;                            // 接收所有信息,接收滤波器直通
    PCONP = PCONP | 0x1e000;                // 电源控制
    PINSEL1 &=  ~((INT32U)0x03 << 18);
    PINSEL1 |=  ((INT32U)0x01 << 18);
    //PINSEL1 = (PINSEL1 & 0xFFF3FFFF) | 0x00040000;	// 选择 CAN1 bit18=1 bit19=0
    CAN1MOD = 1;
    while (!(CAN1MOD & 1)) CAN1MOD = 0x01;  //  软件复位 CAN 控制器
    CAN1EWL = 0x60;                         //  设置警告计数阀值
    CAN1GSR = 0;
    CAN1BTR = BPS_25K;                      // 设置通讯速率
    VICIntEnClr = 0x3cf80000;               // 采用查询方式,禁止所有 CAN 中断
    CAN1MOD = 0;

    Can1Tbp = 0;                           // 缓冲区指针清零
    Can1Tep = 0;
    Can1Rbp = 0;
    Can1Rep = 0;
}

//   CAN1 发送
void Can1Send(void)
{
    INT16U  i;

    i = Can1Tbp + 1;
    if (i >= CanBufSize) i = 0;
    CAN1TFI1 = Can1Tb[i][0];   // 16 - 19: DLC
    CAN1TID1 = Can1Tb[i][1];   //  0 - 10: TXID
    CAN1TDA1 = Can1Tb[i][2];   // TDA
    CAN1TDB1 = Can1Tb[i][3];   // TDB
    CAN1CMR = 0x21;
    Can1Tbp = i;
}


//   CAN1 接收信息到环形接收缓冲区
void Can1Recv(INT8U ch)
{
    INT16U  i;
    i = Can1Rep + 1;
    if (i >= CanBufSize) i = 0;
    if (i == Can1Rbp) return;  // CAN 缓冲区满,退出接收
    Can1Rb[i][0] = CAN1RFS;    // 16 - 19: DLC
    Can1Rb[i][1] = CAN1RID;    //  0 - 10: RXID
    Can1Rb[i][2] = CAN1RDA;    // RDA
    Can1Rb[i][3] = CAN1RDB;    // RDB
    Can1Rep = i;
    CAN1CMR = 0x0c;
}


// CAN 控制器错误检查
void CanErrorCheck(void)
{
    if (((CAN1GSR & 0x00ff0000) > 0x00400000) || ((CAN1GSR & 0xff000000) > 0x40000000))
	{
        InitCan1();
    }
}

void CanIO(void)
{
   if (CAN1GSR & 1) 
   	Can1Recv(0);

   // CANBUS 如果有信息等待发送,等待发送缓冲区空闲时发出
   if (Can1Tbp != Can1Tep)
   {
      if (CAN1GSR & 4) 
      	Can1Send();
   }

}
void Can1Tran(INT32U *buf)
{
    INT16U  i;

    i = Can1Tep + 1;
    if (i >= CanBufSize) i = 0;
    if (i == Can1Tbp) return;

    Can1Tb[i][0] = buf[0];             // DLC
    Can1Tb[i][1] = buf[1];             // TXID
    Can1Tb[i][2] = buf[2];             // TDA
    Can1Tb[i][3] = buf[3];             // TDB

    Can1Tep = i;   // 更新尾指针
}
void CanProcess(void)//周期调用
{
	INT8U  i;
	CanIO();
	/*Can1.wbuf[0] = 0;               // DLC
    Can1.wbuf[1] = 8;               // DLC
    Can1.lbuf[1] = 8;               // CANTXID
    
    Can1.cbuf[8] = 0xff;
    Can1.cbuf[9] = 0xff;
    Can1.cbuf[10] = 0;                                   // 距离目标层的时间
    Can1.cbuf[11] = 0;                                   // 距离目标层的距离
    Can1.cbuf[12] = 0xff;    // 当前高度
    Can1.cbuf[13] = 0xff;                                // 当前时间 时
    Can1.cbuf[14] = 0;                              // 当前时间 分
    Can1.cbuf[15] = 0;                              // 当前时间 秒
            
	Can1Tran(Can1.lbuf);*/
//  处理通过 CAN1 总线收到的信号
    if (Can1Rbp != Can1Rep)     // CAN1收到信息
    {
        i = Can1Rbp + 1;
        if (i >= CanBufSize) i = 0;
        // CAN信息处理代码
        Can1To = 0;
        Can1RecvProcess((union ucanbuf *)Can1Rb[i]);
        Can1Rbp = i;
    }
    
}

void Can1RecvProcess(union ucanbuf *CanBuf)
{
    INT8U cmd_type;
	cmd_type = CanBuf->cbuf[9];
 		
  	if (cmd_type == 1)
  	{
    	cur_floor = CanBuf->cbuf[10];
     	cur_dir = CanBuf->cbuf[11] & 7;
      	open_door = (( CanBuf->cbuf[11] & 0x08) == 0x08);
      	close_door = (( CanBuf->cbuf[11] & 0x10) == 0x10);
	}
	if ((cmd_type == 10) && (CanBuf->cbuf[8]== 4))
	{
	    up_ring = ((CanBuf->cbuf[10]&0x01)==0x01);
	    down_ring = ((CanBuf->cbuf[10]&0x02)==0x02);
	    over_load = ((CanBuf->cbuf[10]&0x40)==0x40);

	}
}

void update_voice(void)                              //gh040603
{
   
   
   if (up_ring || down_ring)
   	{
      	voice_command_old = cur_floor;
   	}
   if (cur_dir != old_dir)
   	{ 
   	  	if ((cur_dir == 2) && (old_dir == 1)) voice_command_old = 253;
      	if ((cur_dir == 3) && (old_dir == 4)) voice_command_old = 254;
      	old_dir = cur_dir;
   	}
   if (over_load)
   	{
   		voice_command_old = 252;
   	}
   if (open_door)
   	{
   		voice_command_old = 250;
   	}
   if (close_door)
   	{
   		voice_command_old = 251;
   	}
   if (voice_command != voice_command_old)
   	{
   	    StopPlay();
   		voice_timer = 2;
   		voice_command = voice_command_old;
   	}
   
   if (voice_timer == 0)
   	{
   		//music_name = 0;
   	;
   	}
    else
   	{
   	    music_name = voice_command;
   	    voice_timer--;
   	}
}

⌨️ 快捷键说明

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