📄 main.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 + -