
//
// 头 文 件：C:\Program Files\Microchip\MPLAB C32 Suite\pic32-libs\include\proc
//
// 配 置 位：菜单栏 -> Help -> Topics.. -> PIC32MX Config Setting 
//
// 实验描述:  CAN总线收发数据, 标准帧 和 扩展帧 轮发并显示 Byte7 值
//
//            LED7 指示 发送 标准 数据帧  ;  LED1 指示 接收 标准 数据帧
//            LED6 指示 发送 扩展 数据帧  ;  LED0 指示 接收 扩展 数据帧
//
//            数码管 高2位 显示 发送数据 Byte7 (无小数点)     
//            数码管 低2位 显示 接收数据 Byte7 (有小数点)
//
//            SysLED运行指示.
//
// CAN 模式:  正常模式、环回模式   默认：正常模式.  比特率 = 250Kb/S
// 
//            请在 CAN_Init(); 修改工作模式.
//            
//            单个节点测试时, 请用环回模式.
//            多个节点测试时, 请用正常模式. 
//           
//            硬件接线： CANH <---------------> CANH 相连 
//                                    |        
//                                   120R      
//                                    |        
//                       CANL <----------------> CANL 相连
//
//注  意：  
//-------------------------------------------------------------------------------

#include <plib.h>                    //调用通用头文件
#include "ecan.h"

//-------------------------------------------------------------------------------
// POSCMOD = XT, FNOSC = PRIPLL, FWDTEN = OFF
// PLLIDIV = DIV_2, PLLMUL = MUL_20
// PBDIV = 4 (default)
// Main clock = 4MHz /2 * 20    =  40MHz
// Peripheral clock = 40MHz /4  =  10MHz
// SYSCLK = 40 MHz (4MHz Crystal/FPLLIDIV * FPLLMUL / FPLLODIV)
// PBCLK  = 10 MHz


#pragma config POSCMOD  = XT         //主振荡器  
#pragma config FNOSC    = PRIPLL     //倍频模式 
#pragma config FPLLIDIV = DIV_2      //输入分频 1:2
#pragma config FPLLMUL  = MUL_20     //PPL 倍频 1:20
#pragma config FPLLODIV = DIV_1      //输出分频 1:1
#pragma config FPBDIV   = DIV_4      //外设时钟
#pragma config FWDTEN   = OFF        //关闭看门狗
#pragma config ICESEL   = ICS_PGx1   //调试端口1

#define SysLED	_LATB5               //CPU LED
#define SPEKAK  _LATD8               //蜂呜器
#define RELAY   _LATD8               //继电器
 

#define Smg_a    0xFE                //定义段码
#define Smg_b    0xFD
#define Smg_c    0xFB
#define Smg_d    0xF7
#define Smg_e    0xEF
#define Smg_f    0xDF
#define Smg_g    0xBF
#define Smg_dp   0x7F

#define Bmp0Map          Smg_a & Smg_b & Smg_c & Smg_d & Smg_e & Smg_f 
#define Bmp1Map          Smg_b & Smg_c
#define Bmp2Map          Smg_a & Smg_b & Smg_d & Smg_e & Smg_g
#define Bmp3Map          Smg_a & Smg_b & Smg_c & Smg_d & Smg_g
#define Bmp4Map          Smg_b & Smg_c & Smg_f & Smg_g
#define Bmp5Map          Smg_a & Smg_c & Smg_d & Smg_f & Smg_g
#define Bmp6Map          Smg_a & Smg_c & Smg_d & Smg_e & Smg_f & Smg_g
#define Bmp7Map          Smg_a & Smg_b & Smg_c 
#define Bmp8Map          Smg_a & Smg_b & Smg_c & Smg_d & Smg_e & Smg_f & Smg_g
#define Bmp9Map          Smg_a & Smg_b & Smg_c & Smg_d & Smg_f & Smg_g
#define BmpAMap          Smg_a & Smg_b & Smg_c & Smg_e & Smg_f & Smg_g
#define BmpBMap          Smg_c & Smg_d & Smg_e & Smg_f & Smg_g
#define BmpCMap          Smg_a & Smg_d & Smg_e & Smg_f 
#define BmpDMap          Smg_b & Smg_c & Smg_d & Smg_e & Smg_g
#define BmpEMap          Smg_a & Smg_d & Smg_e & Smg_f & Smg_g
#define BmpFMap          Smg_a & Smg_e & Smg_f & Smg_g

#define BmpSMap          Smg_a & Smg_c & Smg_d & Smg_f & Smg_g
#define BmpTMap          Smg_d & Smg_e & Smg_f & Smg_g



const unsigned char SegCode[] =                //显示段码表
{
	Bmp0Map,Bmp1Map,Bmp2Map,Bmp3Map,Bmp4Map,Bmp5Map,Bmp6Map,Bmp7Map,
	Bmp8Map,Bmp9Map,BmpAMap,BmpBMap,BmpCMap,BmpDMap,BmpEMap,BmpFMap
};

unsigned char DpyNum[6] = {Smg_g,Smg_g,Smg_g,Smg_g,Smg_g,Smg_g}; //显示缓冲区   

//-------------------------------------------------------------------------------
//  延时函数
//-------------------------------------------------------------------------------
void Delay_xmS(unsigned int i)                
{
	unsigned int j;
	for(;i>0;i--)
	{
		Nop();
		for(j=0;j<255;j++)
		{
			Nop();
			ClearWDT();
		}
	}	
}


//---------------------------------------------------------------------------------
//  TMR1初始化
//---------------------------------------------------------------------------------
void Timer1_Init(void)
{
	T1CON = 0;              // Timer1 清零
	
	IFS0bits.T1IF = 0;      // Timer1 清除标志位
	IEC0bits.T1IE = 1;      // Timer1 中断允许
	IPC1bits.T1IP = 4;      // Timer1 中断优选级
	IPC1bits.T1IS = 1;      // Timer1 次优选级
	TMR1=  0x0000;          // Timer1 给定初值
	PR1 = 0x9C3F;           // Timer1 周期寄存器
	
	T1CONbits.TON = 1;      // Timer1 启动计数
}

//---------------------------------------------------------------------------------
//  数码管驱动
//---------------------------------------------------------------------------------
void SegDisplay(void)
{
	static unsigned char step = 0;
	LATD = (LATD&0xFF00)|DpyNum[step];  //显示缓冲
	switch(step)                        //片选
	{
		case 0: _LATB8 = 0;_LATB9 = 1;_LATB10 = 1;_LATB11 = 1;_LATB12 = 1;_LATB13 = 1;break;
		case 1: _LATB8 = 1;_LATB9 = 0;_LATB10 = 1;_LATB11 = 1;_LATB12 = 1;_LATB13 = 1;break;
		case 2: _LATB8 = 1;_LATB9 = 1;_LATB10 = 0;_LATB11 = 1;_LATB12 = 1;_LATB13 = 1;break;
		case 3: _LATB8 = 1;_LATB9 = 1;_LATB10 = 1;_LATB11 = 0;_LATB12 = 1;_LATB13 = 1;break;
		case 4: _LATB8 = 1;_LATB9 = 1;_LATB10 = 1;_LATB11 = 1;_LATB12 = 0;_LATB13 = 1;break;
		case 5: _LATB8 = 1;_LATB9 = 1;_LATB10 = 1;_LATB11 = 1;_LATB12 = 1;_LATB13 = 0;break;
		default:break;
	}
	if(step < 5) step ++;         //扫描
	else      	 step = 0;
}
	
//---------------------------------------------------------------------------------
//  TMR1 中断函数
//---------------------------------------------------------------------------------
unsigned short SysTick = 0;       //计数
void __attribute__ ((vector(4)))__attribute__((interrupt(IPL4)))_T1Interrupt(void)
{	
	IFS0bits.T1IF = 0;
	SegDisplay();                 //数码管扫描
	SysTick ++;
}

//-------------------------------------------------------------------------------
//  主函数
//-------------------------------------------------------------------------------
int main(void)
{
	unsigned char temp = 0;       //变量
	unsigned char SIDFlag = 0;    //报文类型切换
	
	AD1PCFG = 0xFFFF;             //引脚为数字I/O
	TRISB  = 0xC0DF;              //RB5 RB8-RB13输出
	TRISG  = 0xFFFF;              //G端口输出
	TRISE  = 0x0000;              //E端口输出
	TRISD  = 0xFF00;              //RD0-RD7 输出
	
	Timer1_Init();                //TMR1初始化
	CAN_Init();                   //CAN初始化
	INTEnableSystemMultiVectoredInt(); //使能中断多向量表  
	
	LATE = 0x00FF;                //点亮 D0 - D7
	Delay_xmS(600);
	LATE = 0x0000;                //关闭 D0 - D7
	Delay_xmS(600);
	LATE = 0x00FF;                //点亮 D0 - D7
	Delay_xmS(600);
	LATE = 0x0000;                //关闭 D0 - D7
	Delay_xmS(100);
	//-------------------------------------------------------------------------
	
	while(1)
	{   
		CAN1RxMsgProcess();                  //接收处理
		
		DpyNum[0] = SegCode[TXbuffer[7]>>4];   //发送数据 高4位
		DpyNum[1] = SegCode[TXbuffer[7]&0x0F]; //发送数据 低4位
		DpyNum[2] = Smg_g;
		DpyNum[3] = Smg_g;
		DpyNum[4] = SegCode[RXbuffer[7]>>4]&Smg_dp;   //接收数据 高4位
		DpyNum[5] = SegCode[RXbuffer[7]&0x0F]&Smg_dp; //接收数据 低4位
		
		if(SysTick > 99)           //发送 数据帧
		{
			SysTick = 0;
			SysLED = !SysLED;      //CPU LED
			
			LATECLR = 0x000000C3;  //关闭LED
			
			SIDFlag ^= 1;          //翻转
			if(SIDFlag == 1)       //切换类型
			{
				CAN_TX_SID_Message(0x101);           //发送 标准ID 数据	
			}	
			else
			{
				CAN_TX_EID_Message(0x1FFFFF01);      //发送 扩展ID 数据	
			}	
		}	
	}
}


//-------------------------------------------------------------------------------

