#include "stc12c5410ad.h"
#include "BIN2HEX.h"
#include <intrins.h>
#include "MC33984.h"
#include <stdio.h>
// 连接脚定义
sbit MC33984_WAKE = P1^6; // D 唤醒
sbit MC33984_CSNS = P1^7; // 电流采样信号(外下拉)
sbit MC33984_FS_ = P1^4; // # 故障状态报告(外上拉)
sbit MC33984_RST_ = P1^5; // D # 复位 低电平有效
sbit MC33984_CS_ = P1^3; // U # 片选 低电平有效
sbit MC33984_SCLK = P1^2; // D SPI 时钟
sbit MC33984_SO = P3^7; // SPI 输出
sbit MC33984_SI = P1^0; // D SPI 输入
#define P1_PUSH_PULL B0110_1101 /* 1:表示推挽式输出的脚(P1) */
#define P3_PUSH_PULL B0000_0000 /* 1:表示推挽式输出的脚(P3) */
#define P1_INPUT B1000_0000 /* 1:表示只用于输入的脚(P1) */
#define P3_INPUT B0000_0000 /* 1:表示只用于输入的脚(P3) */
//////////////////////// 输出脉冲时钟 ///////////////////////////////////
#pragma disable
void spi_puls(){
_nop_();
MC33984_SCLK = 1;
_nop_();
_nop_();
_nop_();
MC33984_SCLK = 0;
_nop_();
_nop_();
}
//////////////////////// 输出命令 ///////////////////////////////////////
#pragma disable
void spi_write( unsigned char v ){
unsigned char i;
printf( "W=%BX\n", v ); //debug
MC33984_CS_ = 0;
for(i=0; i <8;i++){
if( v & 0x80 ) MC33984_SI = 1;
else MC33984_SI = 0;
spi_puls();
v = v < <1;
}
MC33984_SI = 0;
MC33984_CS_ = 1;
}
//////////////////////// 取内容 ////////////////////////////////////////
#pragma disable
unsigned char spi_read( ){
unsigned char temp;
unsigned char i;
temp = 0;
MC33984_CS_ = 0;
for(i=0;i <8;i++){
temp = temp < <1;
spi_puls();
if( MC33984_SO ){
temp |= 0x01;
}
}
printf( "R=%BX\n", temp ); //debug
return( temp );
}
////////////////////////// 命令字格式化 /////////////////////////////////
void MC33984_setup( unsigned char set, unsigned char value ){
set |= (value & 0x0f);
spi_write( set );
}
////////////////////////// 命令字格式化 /////////////////////////////////
unsigned char MC33984_stat( unsigned char stat ){
unsigned char temp;
temp = 0x0;
temp |= (stat> > 4) & 0x07;
temp |= stat & 0x80;
spi_write( temp );
temp = spi_read( );
return( temp );
}
////////////////////////// 初始化 //////////////////////////////////////
void MC33984_init(){
//推挽输出脚
P1M0 &= ~P1_PUSH_PULL; // M1=0, M0=0 标准
P1M1 |= P1_PUSH_PULL; // M1=0, M0=1 输入
P3M0 &= ~P3_PUSH_PULL; // M1=1, M0=0 推挽
P3M1 |= P3_PUSH_PULL; // M1=1, M0=1 开漏
//用作输入脚
P1M0 |= P1_INPUT; // M1=0, M0=0 标准
P1M1 &= ~P1_INPUT; // M1=0, M0=1 输入
P3M0 |= P3_INPUT; // M1=1, M0=0 推挽
P3M1 &= ~P3_INPUT; // M1=1, M0=1 开漏
MC33984_SCLK = 0;
MC33984_RST_ = 0;
MC33984_WAKE = 0;
MC33984_FS_ = 1; // 故障状态报告 设置成输入
MC33984_CS_ = 1;
MC33984_SI = 0;
MC33984_SO = 1; // 对应的MCU脚设置成输入状态
MC33984_WAKE = 1; // 不唤醒工作
MC33984_RST_ = 1; // 退出复位
MC33984_setup( MC33984_OC, B0000_1011); //[#CSNS1_EN IN1_SPI #CSNS0_EN IN0_SPI]输出控制
MC33984_setup( MC33984_SOCHL0, B0000_1101); //[75/100A SOCL2 SOCL1 SOCL0]高低过流检测电平控制
// 0 0 0 25A
// 0 0 1 22.5A
// 0 1 0 20A
// 0 1 1 17.5A
// 1 0 0 15A
// 1 0 1 12.5A
// 1 1 0 10A
// 1 1 1 7.5A
MC33984_setup( MC33984_SOCHL1, B0000_1100); // 1是远灯--15A,0是近灯--12.5A
MC33984_setup( MC33984_CDTOL0, B0000_1010); // 禁止开路检测 过流要检测 1.2mS
MC33984_setup( MC33984_CDTOL1, B0000_1010);
MC33984_setup( MC33984_DIC0, B0000_1010); // 高速 低比率电流 禁直接 或操作
MC33984_setup( MC33984_DIC1, B0000_1010);
MC33984_setup( MC33984_OSD, B0000_0001); // 延时 0mS/75mS
MC33984_setup( MC33984_WD, B0000_0010); // 看门狗超时2500mS
MC33984_setup( MC33984_UOV, B0000_0011); // 欠压 过压 有故障时不报告
}
// STAT(s000)
// OD7 OD6 OD5 OD4 OD3 OD2 OD1 OD0
// s OTFs OCHFs OCLFs OLFs UVF OVF FAULTs
// 选通道 超温 过流高 过流低 负载开路 欠压 过压
bit get_fault(){ // 返回非 0 表示有故障指示
//*
if( MC33984_FS_ ){
putchar( ''''1'''' );
}else{
putchar( ''''0'''' );
}
//*/
return( !MC33984_FS_ );
}
/*
void test(){
unsigned char i;
for(i=1;i <16;i++){
MC33984_SCLK = 1;
MC33984_SCLK = 0;
MC33984_RST_ = 1;
MC33984_RST_ = 0;
MC33984_WAKE = 1;
MC33984_WAKE = 0;
MC33984_FS_ = 1; // 故障状态报告 设置成输入
MC33984_FS_ = 0;
MC33984_CS_ = 1;
MC33984_CS_ = 0;
MC33984_SI = 1;
MC33984_SI = 0;
}
}
*/