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

📄 main.c

📁 mc33972_spi yu mc9s12d256
💻 C
字号:
#include <hidef.h>      /* common defines and macros */
#include <mc9s12d64.h>     /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12d64"

#include "main_asm.h" /* interface to the assembly module */

#define   SP_to_gnd    0x00
#define   SP_to_bat    0xff
uchar spidata[33];
uchar spidata1;
uchar j=0,PF=0,PS=0,PRI=0,SOUR=0;

//#define  Rest  
//#define  SP_switch_to_gnd   
//#define  Wake_up_En_SP      
/*---------------------------------中断入口---------------------------------------
#pragma CODE_SEG __NEAR_SEG NON_BANKED

void interrupt 19 RTI_ISR(void)
{
   uchar flag;
   flag = SPI0SR;
   if(flag&0x80){
      spidata[j]=SPI0DR; 
      j++; 
      if(j>=32)
         j=0;
   }
}

#pragma CODE_SEG DEFAULT
------------------------------中断结束--------------------------------------*/
static uchar CAN_TX[8] ={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};  // 发送CAN总线数据数组

/* 1>CAN总线发送函数 */
void MSCAN0Trans(uchar pf,uchar ps,uchar pri,uchar sour_d, uchar * msgout)
{
  unsigned char cansel,id0,id1,id2,id3,b;
 
  CAN0TBSEL = CAN0TFLG;  		/* 选择一个发送缓存*/
  cansel = CAN0TBSEL;			  /* 保存CAN0TBSEL寄存器*/

  pri &= 0xe0; // 
  id0=pf;
  id0=id0>>5;
  CAN0TXIDR0 = pri | id0;
  
  id1=pf;
  id1=(id1<<3)&0xe0;
  b=(pf<<1)&0x06;
  id0=ps;
  id0=(id0>>7)&0x01;
  CAN0TXIDR1 = id1|0x18|b|id0;
  
  id2=ps;
  id2=(id2<<1)&0xfe;
  id1=sour_d;
  id1=(id1>>7)&0x01;
  CAN0TXIDR2 = id2|id1;
  
  id3=sour_d;
  id3=(id3<<1)&0xfe;
  CAN0TXIDR3 = id3;
  
  CAN0TXDSR0 = *msgout;			/* 设置数据寄存器,数组msgout是用户设置*/
  CAN0TXDSR1 = *(msgout+1);
  CAN0TXDSR2 = *(msgout+2);
  CAN0TXDSR3 = *(msgout+3);
  CAN0TXDSR4 = *(msgout+4);
  CAN0TXDSR5 = *(msgout+5);
  CAN0TXDSR6 = *(msgout+6);
  CAN0TXDSR7 = *(msgout+7);
  CAN0TXDLR = 8;			    	/*设置数据长度*/
  
  CAN0TXTBPR = 0;				    /*设置发送缓存优先级*/
  CAN0TFLG = cansel;  			/*清除TxE位,发送CAN消息*/
}

/* 4>CAN总线初始化函数 */
void MSCAN0Init(void) 
{
  MODRR=0x10;			        // 选择CAN口
  CAN0CTL0_INITRQ=1; 			/* 请求进入初始化工作模式 */
  while(CAN0CTL1_INITAK==0){}	/* 等待进入初始化模式 */
  
  CAN0IDAC_IDAM0=0;
  CAN0IDAC_IDAM1=0;       /*设置为32位滤波*/
  
  MODRR=0x02;	
  
  CAN0CTL1 = 0x80;				/*CAN使能且CAN0CTL1_LISTEN=0*/
  
  CAN0BTR0 = 0x43; 				/* 设置SJW=2, 预分频为9*/
  CAN0BTR1 = 0x44; 				/* 设置波特率为100kbps  */

  CAN0IDMR0 = 0xFF; 		  /*设置滤波器,全部设为1表示没有滤波*/
  CAN0IDMR1 = 0xFF;
  CAN0IDMR2 = 0xFF;
  CAN0IDMR3 = 0xFF;
  
 // CAN0IDMR4 = 0xFF;
 // CAN0IDMR5 = 0xFF;
 // CAN0IDMR6 = 0xFF;
 // CAN0IDMR7 = 0xFF;
  
  CAN0IDAR0 = 0x00;
  CAN0IDAR1 = 0x18;
  CAN0IDAR2 = 0x50;
  CAN0IDAR3 = 0x00;

  CAN0CTL0_INITRQ=0; 		    	/* 请求进入正常工作模式 */
  while(CAN0CTL1_INITAK!=0){} /* 等待退出初始化模式 */
  
  //CAN0CTL0_TIME = 1; 			/* 内部时钟使能 */   
  //CAN0CTL0_WUPE = 1; 			/* WAKE UP 使能*/

  CAN0RIER = 0x01; 				    /* 接受中断使能 */ 
}  

void SPI1_TRAN1(unsigned char SPI_data1,unsigned char SPI_data2,unsigned char SPI_data3,unsigned char SPI_data4,unsigned char SPI_data5)
{
  //unsigned char c;						/* 定义无符号字符变量 c */
  unsigned char d;						/* 定义字节型变量 d */
  
  for(d=1;d<10;d++)					  /* 数据传输前片选信号为低并保持一段时间 */
    PTM_PTM2=0;

  while(SPI0SR_SPTEF==0){}		/* SPI数据寄存器不为空,执行循环。为空跳出循环。并读取SPI状态寄存器,然后把所需的数据写入数据寄存器*/						  	
  SPI0DR=SPI_data1;	
  spidata[0]=SPI0DR;
  j++; 
      if(j>=33)
         j=0;
  while(SPI0SR_SPTEF==0){}		/* SPI数据寄存器不为空,执行循环。为空跳出循环。并读取SPI状态寄存器,然后把所需的数据写入数据寄存器*/
  SPI0DR=SPI_data2;
  spidata[1]=SPI0DR;
  j++; 
      if(j>=33)
         j=0;
  while(SPI0SR_SPTEF==0){}		/* SPI数据寄存器不为空,执行循环。为空跳出循环。并读取SPI状态寄存器,然后把所需的数据写入数据寄存器*/
  SPI0DR=SPI_data3;
  spidata[2]=SPI0DR;
    j++; 
      if(j>=33)
         j=0;
  while(SPI0SR_SPTEF==0){}		/* SPI数据寄存器不为空,执行循环。为空跳出循环。并读取SPI状态寄存器,然后把所需的数据写入数据寄存器*/
  SPI0DR=SPI_data4;
  spidata[3]=SPI0DR;
   
   j++; 
      if(j>=33)
         j=0; SPI0DR=SPI_data5;
  while(SPI0SR_SPTEF==0){}		/* SPI数据寄存器不为空,执行循环。为空跳出循环。并读取SPI状态寄存器,然后把所需的数据写入数据寄存器*/
  SPI0DR=SPI_data5;    
  spidata[4]=SPI0DR;
    j++; 
      if(j>=33)
         j=0;  
  for(d=1;d<10;d++)					/* 数据传输后片选信号先为低后为高,并保持一段时间*/
    PTM_PTM2=0;						  
 
  for(d=1;d<6;d++)
    PTM_PTM2=1;
}
void SPI1_TRAN0(unsigned char SPI_data1,unsigned char SPI_data2,unsigned char SPI_data3,unsigned char SPI_data4)
{
  //unsigned char c;						/* 定义无符号字符变量 c */
  unsigned char d;						/* 定义字节型变量 d */
  
  for(d=1;d<10;d++)					  /* 数据传输前片选信号为低并保持一段时间 */
    PTM_PTM2=0;

  while(SPI0SR_SPTEF==0){}		/* SPI数据寄存器不为空,执行循环。为空跳出循环。并读取SPI状态寄存器,然后把所需的数据写入数据寄存器*/						  	
  SPI0DR=SPI_data1;	
  spidata[j]=SPI0DR;
  j++; 
      if(j>=33)
         j=0;
  while(SPI0SR_SPTEF==0){}		/* SPI数据寄存器不为空,执行循环。为空跳出循环。并读取SPI状态寄存器,然后把所需的数据写入数据寄存器*/
  SPI0DR=SPI_data2;
  spidata[j]=SPI0DR;
  j++; 
      if(j>=33)
         j=0;
  while(SPI0SR_SPTEF==0){}		/* SPI数据寄存器不为空,执行循环。为空跳出循环。并读取SPI状态寄存器,然后把所需的数据写入数据寄存器*/
  SPI0DR=SPI_data3;
  spidata[j]=SPI0DR;
  j++; 
      if(j>=33)
         j=0;
  while(SPI0SR_SPTEF==0){}		/* SPI数据寄存器不为空,执行循环。为空跳出循环。并读取SPI状态寄存器,然后把所需的数据写入数据寄存器*/
  SPI0DR=SPI_data4;
  spidata[j]=SPI0DR;
  j++; 
      if(j>=33)
         j=0;
  for(d=1;d<10;d++)					/* 数据传输后片选信号先为低后为高,并保持一段时间*/
    PTM_PTM2=0;						  
 
  for(d=1;d<6;d++)
    PTM_PTM2=1;
}
/* 6>SPI模块初始化函数 */
void SPI0Init(void)
{
  DDRM_DDRM2 = 1;         /* PP3脚作为输出脚 */
  SPI0CR1_SPE = 1;  		  /* SPI使能 */
  SPI0CR1_MSTR = 1;       /* 设置单片机为主机模式 */
  SPI0CR1_CPHA = 1;
  SPI0CR1_CPOL = 0;
  SPI0CR1_LSBFE = 0;		  /* 数据传输时高位在前 */
  SPI0BR = 0x03;          /*SPI的波特率为500k*/
  PTM_PTM2 = 1;           /* PPS脚高电平,从机未选中*/
  //SPI1CR1_SPIE = 1;
}

void main(void)
{
  unsigned long int count;
  DDRT_DDRT4=1;  
  SPI0Init();
  MSCAN0Init();
  
  for(count=0;count<65535;count++)
    {
      asm(NOP);
    }
    SPI1_TRAN0(0xef, 0x00, 0x00, 0x00);  //Reset
    SPI1_TRAN0(0xef, 0x00, 0x00, 0x00);  //Reset
    SPI1_TRAN0(0x01, 0x00, SP_to_bat, 0x00);  //SP switch-to-gnd
    //SPI1_TRAN0(0x01, 0x00, 0xfc, 0x00);  //SP switch-to-bat
    SPI1_TRAN0(0x02, 0x00, 0xff, 0x00);  //Wake-up Enable (SP)
    SPI1_TRAN0(0x03, 0x3f, 0xff, 0x00);  //Wake-up Enable (SG)
    SPI1_TRAN0(0x04, 0x00, 0x00, 0x00);  //Wetting Enable (SP)
    SPI1_TRAN0(0x05, 0x00, 0x00, 0x00);  //Wetting Enable (SG)
    SPI1_TRAN0(0x07, 0x00, 0xff, 0x00);  //Timer Enable (SP)
    SPI1_TRAN0(0x08, 0x3f, 0xff, 0x00);  //Timer Enable (SG)
    SPI1_TRAN0(0x09, 0x00, 0x00, 0x00);  //Tristate Disable (SP)
    SPI1_TRAN0(0x0A, 0x00, 0x00, 0x00);  //Tristate Disable (SG)
    //SPI1_TRAN0(0x06, 0x00, 0x4d, 0x00);  //Analog (blank)
  EnableInterrupts;
  //SPI0DR=0x00;
  PTT_PTT4=1;
  for(;;) /* wait forever */
  {

    SPI1_TRAN1(0x00, 0x00, 0x00, 0x00, 0x00);   //Switch Status
    //SPI1_TRAN1(0x00, 0x00, 0x00, 0x00, 0x00);   //Switch Status

       CAN_TX[0]=SP_to_gnd;
       CAN_TX[1]=spidata[2];
       CAN_TX[2]=spidata[3];
       CAN_TX[3]=spidata[4];
       MSCAN0Trans(PS,PF,PRI,SOUR, CAN_TX);


  }
}

⌨️ 快捷键说明

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