📄 mc33389.h
字号:
#define mc389_cs PTD_PTD0
unsigned char mc389_spidat;
unsigned char mc389_fault1,mc389_fault2;
sys_data_type mc389_faultstatus;
///////////////////////////////////////////
//mc33389的SPI读写
unsigned char mc389_oper(unsigned char mc389add,unsigned char mc389dat){
//mc389add为地址加读写 mc389dat为校验加数据
unsigned char mc389_temp;
mc389_cs=0;
SPDR=mc389add;
while((SPSCR&0x80)==0);
mc389_temp=SPDR;
SPDR=mc389dat;
while((SPSCR&0x80)==0);
mc389_temp=SPDR;
mc389_cs=1;
__RESET_WATCHDOG();
asm(nop);asm(nop);
return(mc389_temp);
//发送两字节
}
//喂mc398DOG
void mc389_dog(void){
mc389_spidat=mc389_oper(0x27,0xc7);
}
///////////////////////////////////////////////////////
void init_mc33389(void){ //初始化MC33389
//11=写 00=读
//注意389对极性的要求
mc389_spidat=mc389_oper(0x27,0xc7); //喂狗--200ms最长
mc389_spidat=mc389_oper(0x28,0x00); //读基础电平
mc389_spidat=mc389_oper(0x44,0x00); //读L0 L1 L2状态
mc389_spidat=mc389_oper(0x50,0x00); //读CANH error
mc389_spidat=mc389_oper(0x5c,0x00); //读CANL error
mc389_spidat=mc389_oper(0x60,0x00); //读复位源
//mc389_spidat=mc389_oper(0x6c,0x00); //读电源情况状态及V3过温状态
mc389_spidat=mc389_oper(0x03,0x91); //正常模式
mc389_spidat=mc389_oper(0x0f,0x91); //确定
mc389_spidat=mc389_oper(0x17,0x00); //V3off no cyclic
//mc389_spidat=mc389_oper(0x1b,0xf5); //cyclic timer
mc389_spidat=mc389_oper(0x2b,0x00); //0.7
//mc389_spidat=mc389_oper(0x2b,0x91); //-1.2
//mc389_spidat=mc389_oper(0x2b,0x32); //-1.7
//mc389_spidat=mc389_oper(0x2b,0xa3); //-2.2
//mc389_spidat=mc389_oper(0x33,0x00); //wakeup disable=por
//休眠或其他时可设置
mc389_spidat=mc389_oper(0x30,0x00); //读wakeup状态SPI or BUS
mc389_spidat=mc389_oper(0x3c,0x00); //读wakeup状态L0 L1 L2
//mc389_spidat=mc389_oper(0x48,0x00); //读过温状态
//mc389_spidat=mc389_oper(0x77,0x00); //中断事件使能
//mc389_spidat=mc389_oper(0x7b,0x00); //por=全没使能
//中断状态寄存器
//CAN模式
//mc389_spidat=mc389_oper(0x90,0x00); //读CAN过温
mc389_spidat=mc389_oper(0x93,0xa3); //RXTX
//mc389_spidat=mc389_oper(0x93,0x32); //RX
//mc389_spidat=mc389_oper(0x93,0x00); //VBAT
}
///////////////////////////////////////////////////
//加休眠函数
void sleep_mc33389(void){
}
//小LCD临时显示
/*
unsigned char canfault_conver(unsigned char i){
unsigned char j;
switch(i){
case 0:j=0b11011011; break;
case 1:j=0b00000011; break;
case 2:j=0b01111010; break;
case 3:j=0b01101011; break;
case 4:j=0b10100011; break;
case 5:j=0b11101001; break;
case 6:j=0b11111001; break;
case 7:j=0b00001011; break;
case 8:j=0b11111011; break;
case 9:j=0b11101011; break;
case 10:j=0b10111011; break;
case 11:j=0b11110001; break;
case 12:j=0b11011000; break;
case 13:j=0b01110011; break;
case 14:j=0b11111000; break;
case 15:j=0b10111000; break;
default:j=0b00000000; break;
}
return(j);
}
*/
//MC389故障检测
void mc33389_fault(void){
//unsigned char mc389_fault1,mc389_fault2;
//mc389_fault1=mc389_oper(0x50,0x00); //读CANH error
//mc389_fault2=mc389_oper(0x5c,0x00); //读CANL error
if(!((mc389_fault1&0xf)&&(mc389_fault2&0xf)))
mc389_faultstatus.Byte=0x0; //无故障
if(mc389_fault1&0x1) mc389_faultstatus.Bit.BIT7=1; //CANH线断
else mc389_faultstatus.Bit.BIT7=0;
if(mc389_fault1&0x2) mc389_faultstatus.Bit.BIT6=1; //CANH线对Vbat短路
else mc389_faultstatus.Bit.BIT6=0;
if(mc389_fault1&0x4) mc389_faultstatus.Bit.BIT5=1; //CANH线对地短路
else mc389_faultstatus.Bit.BIT5=0;
if(mc389_fault1&0x8) mc389_faultstatus.Bit.BIT4=1; //CANH线对Vcc短路
else mc389_faultstatus.Bit.BIT4=0;
if(mc389_fault2&0x1) mc389_faultstatus.Bit.BIT3=1; //CANL线断
else mc389_faultstatus.Bit.BIT3=0;
if(mc389_fault2&0x2) mc389_faultstatus.Bit.BIT2=1; //CANL线对Vbat短路
else mc389_faultstatus.Bit.BIT2=0;
if(mc389_fault2&0x4) mc389_faultstatus.Bit.BIT1=1; //CANL线对地短路或与CANH互短
else mc389_faultstatus.Bit.BIT1=0;
if(mc389_fault2&0x8) mc389_faultstatus.Bit.BIT0=1; //CANH线对Vdd短路
else mc389_faultstatus.Bit.BIT0=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -