xutong 发表于 2023-10-18 15:43

DR7808驱动使用NXP RT052

<div class='showpostmsg'><pre>
<code class="language-cpp">/*
    Analogysemi xutong
    2023/10/10
*/
#ifndef __DR7808_H
#define __DR7808_H
#include "bsp_lpspi.h"

/*
   DR7808 SPI每个帧是24bit数据组成

*/


#define DR7808_GENCTRL1 0x00
#define DR7808_GENCTRL2 0x01
#define DR7808_VDS1 0x02
#define DR7808_VDS2 0x03
#define DR7808_CCP_BLK1 0x04

#define DR7808_CCP_BLK2_ACT 0x05      //需要配置reg bank =0
#define DR7808_CCP_BLK2_FW 0x05         //需要配置reg bank =1

#define DR7808_HBMODE 0x06
#define DR7808_PWMSET 0x07
#define DR7808_TPRECHG 0x08
#define DR7808_HBIDIAG 0x09

#define DR7808_ST_ICHG 0x0A                     //需要配置reg bank =0
#define DR7808_PWM_PCHG_INIT 0x0A               //需要配置reg bank =1
#define DR7808_PWM_ICHG_ACT 0x0B                //需要配置reg bank =0
#define DR7808_PWM_ICHG_FW 0x0B               //需要配置reg bank =1
#define DR7808_PWM_IDCHG_ACT 0x0C               //需要配置reg bank =0
#define DR7808_PWM_PDCHG_INIT 0x0C            //需要配置reg bank =1
#define DR7808_PWM_ICHGMAX_CCP_BLK3_ACT 0x0D    //需要配置reg bank =0
#define DR7808_PWM_ICHGMAX_CCP_BLK3_FW 0x0D   //需要配置reg bank =1


#define DR7808_TDON_OFF1 0x0E
#define DR7808_TDON_OFF2 0x0F
#define DR7808_TDON_OFF3 0x10
#define DR7808_GENSTAT 0x11
#define DR7808_DSOV 0x12
#define DR7808_HBVOUT_PWMERR 0x13
#define DR7808_EFF_TDON_OFF1 0x14
#define DR7808_EFF_TDON_OFF2 0x15
#define DR7808_EFF_TDON_OFF3 0x16
#define DR7808_TRISE_FALL1 0x17
#define DR7808_TRISE_FALL2 0x18
#define DR7808_TRISE_FALL3 0x19
#define DR7808_DEVID 0x1F
#define DR7808_DRV_LPWR_EN 0x1C
#define DR7808_CSA_OC_SH 0x1D
#define DR7808_MISC 0x1E

#define DR7808_GENSTAT 0x11
#define DR7808_DSOV 0x12
#define DR7808_HBVOUT_PWMERR 0x13
#define DR7808_EFF_TDON_OFF1 0x14
#define DR7808_EFF_TDON_OFF2 0x15
#define DR7808_EFF_TDON_OFF3 0x16
#define DR7808_TRISE_FALL 0x17
#define DR7808_TRISE_FALL2 0x18
#define DR7808_TRISE_FALL3 0x19
#define DR7808_GDF 0x1A
#define DR7808_DEVID 0x1F





//注意 DR7808 不同寄存器有不同Bank
//Note DR7808 has different banks for different registers


// DR7808 half bridge config
// DR7808 半桥配置
enum DR7808_HB_Mode{HighImpedance=0,LSn_ON=1,HSn_ON=2};
typedef struct{
uint8_t HB8_Mode;
uint8_t HB7_Mode;
uint8_t HB6_Mode;
uint8_t HB5_Mode;
uint8_t HB4_Mode;
uint8_t HB3_Mode;
uint8_t HB2_Mode;
uint8_t HB1_Mode;
}HBMODE_InitTypeDef;

// DR7808 PWM Setting
// DR7808 PWM 设置
enum DR7808_PWM_HB{HB1=0,HB2=1,HB3=2,HB4=3,HB5=4,HB6=5,HB7=6,HB8=7};
typedef struct{
uint8_t PWM1_HB;
uint8_t PWM2_HB;
uint8_t PWM3_HB;
uint8_t PWM1_EN;
uint8_t PWM2_EN;
uint8_t PWM3_EN;
//Drain-Source monitoring in bridge passive mode
//漏源监控在桥被动模式
uint8_t PASS_VDS;
//Settings for bridge driver passive mode
//00B: LS1-4 are always off.
//Note: Changing PASS_MOD from
//00B: to any other value requires to clear DSOV1) first before writing PASS_MOD,
//01B: LS1-4 are always on (static brake).
//10B: LS1-4 are activated if passive VM OV is detected (overvoltage brake) (default).
//11B: LS1-4 are activated if passive VM OV is detected and PWM1 = High (overvoltage brake conditioned by PWM1).
uint8_t PASS_Mode;
}PWMSET_InitTypeDef;

// half bridge Vds threshold Setting
// 半桥Vds阈值设定
/*
    000B: 0.15V
    001B: 0.20V (default)
    010B: 0.25V
    011B: 0.30V
    100B: 0.40V
    101B: 0.50V
    110B: 0.60V
    111B: 2.0V
*/

enum DR7808_HB_VDSTh{Vdsth_15=0,Vdsth_20=1,Vdsth_25=2,Vdsth_30=3,
Vdsth_40=4,Vdsth_50=5,Vdsth_60=6,Vdsth2_0=7};
typedef struct{
uint8_t HB8_VDSTh;
uint8_t HB7_VDSTh;
uint8_t HB6_VDSTh;
uint8_t HB5_VDSTh;
uint8_t HB4_VDSTh;
uint8_t HB3_VDSTh;
uint8_t HB2_VDSTh;
uint8_t HB1_VDSTh;
}VDS_Vth_InitTypeDef;
// 静态电流配置
// 详情看 静态充电和放电电流表格
enum DR7808_ST_ICHG_Current{GateDriverCurrent1=0,GateDriverCurrent2=1,ICHGST1=0,ICHGST2=1,ICHGST3=2,ICHGST4=3,
ICHGST5=4,ICHGST6=5,ICHGST7=6,ICHGST8=7,ICHGST9=8,ICHGST10=9,ICHGST11=10
,ICHGST12=11,ICHGST13=12,ICHGST14=13,ICHGST15=14,ICHGST16=15,ICHGST_Default=4};
typedef struct{
//配置是GateDriverCurrent1 还是GateDriverCurrent2
uint8_t HB8_ICHG;
uint8_t HB7_ICHG;
uint8_t HB6_ICHG;
uint8_t HB5_ICHG;
uint8_t HB4_ICHG;
uint8_t HB3_ICHG;
uint8_t HB2_ICHG;
uint8_t HB1_ICHG;
//配置Gate Driver Current 2电流大小 一共16个挡位,参考Static charge and discharge currents table
uint8_t ICHGST_2;
//配置Gate Driver Current 1电流大小 一共16个挡位,参考Static charge and discharge currents table
uint8_t ICHGST_1;
}ST_ICHG_InitTypeDef;


// CSA 相关配置
enum DR7808_CSA_Config{
//CSA1_Gain and CSA2_Gain
Gain10=0,Gain20=1,Gain40=2,Gain80=3,
//CSA1_Direction and CSA2_Direction
CSA_Unidirectional=0,CSA_Bidirectional=1,
// OCTH1 and OCTH2
OCThLevel1=0,OCThLevel2=1,
OCThLevel3=2,OCThLevel4=3,
// CSA1_SEL and CSA2_SEL
Con2HB1=0,Con2HB2=1,Con2HB3=2,Con2HB4=3,
Con2HB5=4,Con2HB6=5,Con2HB7=6,Con2HB8=7};
typedef struct{
//配置CSA方向 CSA_Bidirectional 或者 CSA_Unidirectional
//配置双向或者单向
uint8_t CSA1_Direction;
uint8_t CSA2_Direction;
// 配置 CSA Gain的大小 10,20,40,80
uint8_t CSA1_Gain;
uint8_t CSA2_Gain;
// 配置OCP是否开启
uint8_t OverCurrentProtect;
//配置CSA 在高边或者底边
//Configure CSA on the high-side or the low-side
uint8_t CSA1_Level;
uint8_t CSA2_Level;
//配置过流滤波时间
//Overcurrent filter time
uint8_t OC1FILT;
uint8_t OC2FILT;
//关闭CSA
//DisEnable CSA 设置为1
//Enable CSA 设置为0
uint8_t CSA1_OFF;
uint8_t CSA2_OFF;
// Overcurrent detection threshold
// 过流检测阈值设置
uint8_t OCTH1;
uint8_t OCTH2;
//Overcurrent detection threshold of SO1 with CSD1 = 0
//00B: VSO1 &gt; VDD / 2 (default)
//01B: VSO1 &gt; VDD / 2 + VDD / 10
//10B: VSO1 &gt; VDD / 2 + 2 x VDD / 10
//11B: VSO1 &gt; VDD / 2 + 3x VDD / 10
//Overcurrent detection threshold of SO1 with CSD1 = 1
//00B: VSO1 &gt; VDD / 2+2 x VDD / 20 or VCSOx &lt; VDD / 2 – 2 × VDD / 20 (default)
//01B: VSO1 &gt; VDD / 2+ 4x VDD / 20 or VCSOx &lt; VDD / 2 – 4 × VDD / 20
//10B: VSO1 &gt; VDD / 2+ 5 x VDD / 20 or VCSOx &lt; VDD / 2 ? 5 × VDD / 20
//11B: VSO1 &gt; VDD / 2+ 6x VDD / 20 or VCSOx &lt; VDD / 2 – 6 × VDD / 20
uint8_t CSA_BLK_SEL;
//1: CSA1 and CSA2 hold blank time is tccp + tblank/2
//0:CSA1 and CSA2 hold blank time is tccp + tblank(default)
// blank time 用于PWM 抑制功能时间设置
uint8_t CSA2_SH_EN;
uint8_t CSA1_SH_EN;
//选择是否使用PWM 抑制功能
//Select whether to use PWM suppression
uint8_t OC_SEP_EN;
// 选择 OCEN情况下只有CSA连接的半桥turn off 还是所有半桥Turn off
uint8_t CSA2_SEL;
uint8_t CSA1_SEL;
// CSA SEL根据CSA连接的半桥选择

}CSA_InitTypeDef;


// 获取寄存器信息
void DR7808_Read_Reg(uint8_t Reg,uint8_t *RData);
// 读取并且清除寄存器
void DR7808_Read_Clear_Reg(uint8_t Reg,uint8_t *RData);
// 写入寄存器信息
void DR7808_Write_Reg(uint8_t Reg,uint16_t WData,uint8_t *RData);
// 退出FS Mode
void DR7808_Quit_FS(void);
// 禁用看门狗
void DR7808_Dis_WD(void);
// DR7808 延时
void DR7808_delay(uint32_t count);
// 桥壁设置
void DR7808_Half_Bridge_Mode(HBMODE_InitTypeDef* config,uint8_t *RData);
// PWM设置通道和DS监控被动模式配置
void DR7808_PWMSET_Channel(PWMSET_InitTypeDef* config,uint8_t *RData);
// HB VDS 监控阈值设定
// HB VDS monitoring threshold Setting
// 设置 VDS1 和 VDS2 寄存器
void DR7808_VDS_Monitoring_1_4(VDS_Vth_InitTypeDef* config,uint8_t *RData);
void DR7808_VDS_Monitoring_5_8(VDS_Vth_InitTypeDef* config,uint8_t *RData);
// 内部CSA配置
void DR7808_CSA_Conifg(CSA_InitTypeDef* config,uint8_t *RData);
// 静态充放电电流设置
void DR7808_ST_ICHG_Conifg(ST_ICHG_InitTypeDef* config,uint8_t *RData);
// DR7808 喂狗
void DR7808_Feed_Dog(uint8_t *RData);
// 获取DR7808 ID
uint8_t DR7808_GetChipID(void);
// 获取所有寄存器的值
void Get_All_Reg(uint8_t* RData);

#endif</code></pre>

<p>以上是.h文件</p>

<pre>
<code class="language-cpp">#include "DR7808.h"


void DR7808_delay(uint32_t count)
{
    volatile uint32_t i = 0;
    for (i = 0; i &lt; count; ++i)
    {
      __asm("NOP"); /* 调用nop空指令 */
         __asm("NOP"); /* 调用nop空指令 */
          __asm("NOP"); /* 调用nop空指令 */
         __asm("NOP"); /* 调用nop空指令 */
            __asm("NOP"); /* 调用nop空指令 */
    }
}
//获取寄存器信息
void DR7808_Read_Reg(uint8_t Reg,uint8_t *RData)
{
uint8_t TxData={0X00,0X00,0X00};
//读取寄存器
TxData=(Reg&lt;&lt;1)|0xC0;
Lpspi_Read(3,TxData,RData);
}
//读取与清除寄存器信息
void DR7808_Read_Clear_Reg(uint8_t Reg,uint8_t *RData)
{
uint8_t TxData={0X00,0X00,0X00};
//读取寄存器
TxData=(Reg&lt;&lt;1)|0xC1;
Lpspi_Read(3,TxData,RData);
}
//写寄存器信息
void DR7808_Write_Reg(uint8_t Reg,uint16_t WData,uint8_t *RData)
{
uint8_t TxData={0X00,0X00,0X00};
//读取寄存器&amp;写入寄存器
TxData=(Reg&lt;&lt;1)|0xC1;
TxData=WData&gt;&gt;8;
TxData=WData&amp;0x00FF;
Lpspi_Read(3,TxData,RData);
}
// dr7808 退出FS Mode
void DR7808_Quit_FS(void)
{
uint8_t Data={0X00,0X00,0X00};
//读取并且清除Gensata
DR7808_Read_Clear_Reg(DR7808_GENSTAT,Data);
DR7808_delay(2000);
//看门狗位置1
DR7808_Write_Reg(DR7808_GENCTRL1,0x0027,Data);
DR7808_delay(2000);
//看门狗位置0
DR7808_Write_Reg(DR7808_GENCTRL1,0x0000,Data);
DR7808_delay(2000);
}
// dr7808 禁用看门狗
void DR7808_Dis_WD(void)
{
uint8_t Data;
DR7808_delay(2000);
//看门狗Unlock 置1
DR7808_Write_Reg(DR7808_GENCTRL1,0x00A7,Data);
DR7808_delay(2000);
//禁用看门狗
DR7808_Write_Reg(DR7808_GENCTRL2,0x4380,Data);
}
// dr7808桥壁配置
void DR7808_Half_Bridge_Mode(HBMODE_InitTypeDef* config,uint8_t *RData)
{
uint16_t WData=0;
WData|=(config-&gt;HB8_Mode)&lt;&lt;14;
WData|=(config-&gt;HB7_Mode)&lt;&lt;12;
WData|=(config-&gt;HB6_Mode)&lt;&lt;10;
WData|=(config-&gt;HB5_Mode)&lt;&lt;8;
WData|=(config-&gt;HB4_Mode)&lt;&lt;6;
WData|=(config-&gt;HB3_Mode)&lt;&lt;4;
WData|=(config-&gt;HB2_Mode)&lt;&lt;2;
WData|=(config-&gt;HB1_Mode);
DR7808_Write_Reg(DR7808_HBMODE,WData,RData);
}
// 未测试
// dr7808 PWM 通道配置
void DR7808_PWMSET_Channel(PWMSET_InitTypeDef* config,uint8_t *RData)
{
uint16_t WData=0;
WData|=(config-&gt;PWM1_HB)&lt;&lt;1;
WData|=(config-&gt;PWM2_HB)&lt;&lt;5;
WData|=(config-&gt;PWM3_HB)&lt;&lt;9;
WData|=(config-&gt;PWM1_EN);
WData|=(config-&gt;PWM2_EN)&lt;&lt;4;
WData|=(config-&gt;PWM3_EN)&lt;&lt;8;
WData|=(config-&gt;PASS_VDS)&lt;&lt;14;
WData|=(config-&gt;PASS_Mode)&lt;&lt;12;
DR7808_Write_Reg(DR7808_PWMSET,WData,RData);

}
//未测试
//VDS Monitor threshold setting HB1~HB4
void DR7808_VDS_Monitoring_1_4(VDS_Vth_InitTypeDef* config,uint8_t *RData)
{
uint16_t WData=0;
WData|=(config-&gt;HB1_VDSTh);
WData|=(config-&gt;HB2_VDSTh)&lt;&lt;3;
WData|=(config-&gt;HB3_VDSTh)&lt;&lt;6;
WData|=(config-&gt;HB4_VDSTh)&lt;&lt;9;
DR7808_Write_Reg(DR7808_VDS1,WData,RData);
}
//未测试
//VDS Monitor threshold setting HB5~HB8
void DR7808_VDS_Monitoring_5_8(VDS_Vth_InitTypeDef* config,uint8_t *RData)
{
uint16_t WData=0;
WData|=(config-&gt;HB5_VDSTh);
WData|=(config-&gt;HB6_VDSTh)&lt;&lt;3;
WData|=(config-&gt;HB7_VDSTh)&lt;&lt;6;
WData|=(config-&gt;HB8_VDSTh)&lt;&lt;9;
DR7808_Write_Reg(DR7808_VDS2,WData,RData);
}
// dr7808喂狗操作
void DR7808_Feed_Dog(uint8_t *RData)
{
uint16_t WData=0;
uint8_t Data;
//读取看门狗位
DR7808_Read_Reg(DR7808_GENCTRL1,Data);
DR7808_delay(20);
//如果看门狗位为1
if((Data&amp;0x01)==1)
{
    //看门狗位置0并写入
    Data&amp;=0XFE;
    WData|=Data&lt;&lt;8;
    WData|=Data;
    DR7808_Write_Reg(DR7808_GENCTRL1,WData,RData);
}
else
{
    //看门狗位置1并写入
    Data|=0X01;
    WData|=Data&lt;&lt;8;
    WData|=Data;
    DR7808_Write_Reg(DR7808_GENCTRL1,WData,RData);
}
}
// dr7808 csa相关配置
void DR7808_CSA_Conifg(CSA_InitTypeDef* config,uint8_t *RData)
{
uint16_t WData=0;
uint8_t Data;
//读取GENCTRL1配置
DR7808_Read_Reg(DR7808_GENCTRL1,Data);
WData|=(config-&gt;CSA2_Direction)&lt;&lt;15;
WData|=(config-&gt;CSA2_Gain)&lt;&lt;13;
WData|=(config-&gt;CSA1_Direction)&lt;&lt;12;
WData|=(config-&gt;CSA1_Gain)&lt;&lt;10;
//接收值后十位不变
WData|=(Data&amp;0x03)&lt;&lt;8;
WData|=Data;
DR7808_Write_Reg(DR7808_GENCTRL1,WData,RData);
//清空WData
WData=0;
DR7808_delay(20);
DR7808_Read_Reg(DR7808_HBIDIAG,Data);
WData|=Data;
WData|=(config-&gt;CSA2_Level)&lt;&lt;15;
WData|=(config-&gt;CSA1_Level)&lt;&lt;14;
WData|=(config-&gt;OC2FILT)&lt;&lt;12;
WData|=(config-&gt;OC1FILT)&lt;&lt;10;
WData|=(config-&gt;CSA2_OFF)&lt;&lt;9;
WData|=(config-&gt;CSA1_OFF)&lt;&lt;8;
DR7808_Write_Reg(DR7808_HBIDIAG,WData,RData);
    //清空WData
WData=0;
DR7808_delay(20);
   //读取GENCTRL2配置
DR7808_Read_Reg(DR7808_GENCTRL2,Data);
//清空后四位
Data&amp;=0XF0;
//高8位不变
WData|=Data&lt;&lt;8;
WData|=Data;
WData|=(config-&gt;OCTH2)&lt;&lt;2;
WData|=(config-&gt;OCTH1);
DR7808_Write_Reg(DR7808_GENCTRL2,WData,RData);
//清空WData
WData=0;
DR7808_delay(20);
//读取GENCTRL2配置
DR7808_Read_Reg(DR7808_CSA_OC_SH,Data);
WData=0;
//最高位PWM不变
WData=(Data&amp;0X80)&lt;&lt;8;
WData|=(config-&gt;CSA_BLK_SEL)&lt;&lt;9;
WData|=(config-&gt;CSA2_SH_EN)&lt;&lt;8;
WData|=(config-&gt;CSA1_SH_EN)&lt;&lt;7;
WData|=(config-&gt;OC_SEP_EN)&lt;&lt;6;
WData|=(config-&gt;CSA2_SEL)&lt;&lt;3;
WData|=(config-&gt;CSA1_SEL);
//写入过流数据
DR7808_Write_Reg(DR7808_CSA_OC_SH,WData,RData);
}
// 需要配置Reg Bank
// 静态充放电电流设置
void DR7808_ST_ICHG_Conifg(ST_ICHG_InitTypeDef* config,uint8_t *RData)
{
uint16_t WData=0;
uint8_t Data;
// 读取DR7808_GENCTRL1配置 并将REG BANK 其配置为0
DR7808_Read_Reg(DR7808_GENCTRL1,Data);
Data=Data&amp;0xfd;
WData=Data&lt;&lt;8;
WData|=Data;
//写入reg bank
DR7808_Write_Reg(DR7808_GENCTRL1,WData,RData);
DR7808_delay(20);
WData=0;
//设置是电流1还是电流2
WData|=(config-&gt;HB8_ICHG)&lt;&lt;15;
WData|=(config-&gt;HB7_ICHG)&lt;&lt;14;
WData|=(config-&gt;HB6_ICHG)&lt;&lt;13;
WData|=(config-&gt;HB5_ICHG)&lt;&lt;12;
WData|=(config-&gt;HB4_ICHG)&lt;&lt;11;
WData|=(config-&gt;HB3_ICHG)&lt;&lt;10;
WData|=(config-&gt;HB2_ICHG)&lt;&lt;9;
WData|=(config-&gt;HB1_ICHG)&lt;&lt;8;
//设置电流挡位2
WData|=(config-&gt;ICHGST_2)&lt;&lt;4;
//设置电流挡位1
WData|=(config-&gt;ICHGST_1);
//写入电流挡位
DR7808_Write_Reg(DR7808_ST_ICHG,WData,RData);
}
// dr7808 ID获取
uint8_t DR7808_GetChipID(void)
{
uint8_t Data;
DR7808_Read_Reg(DR7808_DEVID,Data);
return Data;
}
//读取所有寄存器
void Get_All_Reg(uint8_t* RData)
{
uint8_t i=0;
for(i=0;i&lt;0x1f;i++)
{
    DR7808_Read_Reg(i,RData);
    RData++;
    DR7808_delay(330);
}

}




</code></pre>

<p>以上是.c文件</p>

<div></div>

<div></div>

<p>以上总的文件</p>

<p>&nbsp;</p>

<p><strong>DR7808退出Fail Safe:</strong></p>

<p>&nbsp;</p>

<div>
<pre>
<code>// dr7808 退出FS Mode 经过验证
void DR7808_Quit_FS(void)
{
uint8_t Data={0X00,0X00,0X00};
//读取并且清除Gensata
DR7808_Read_Clear_Reg(DR7808_GENSTAT,Data);
DR7808_delay(2000);
//看门狗位置1
DR7808_Write_Reg(DR7808_GENCTRL1,0x0027,Data);
DR7808_delay(2000);
//看门狗位置0
DR7808_Write_Reg(DR7808_GENCTRL1,0x0000,Data);
DR7808_delay(2000);
}</code></pre>
</div>

<p>&nbsp;</p>

<p><strong>DR7808关闭看门狗:</strong></p>

<p>&nbsp;</p>

<div>
<pre>
<code>// dr7808 禁用看门狗 经过验证
void DR7808_Dis_WD(void)
{
uint8_t Data;
DR7808_delay(2000);
//看门狗Unlock 置1
DR7808_Write_Reg(DR7808_GENCTRL1,0x00A7,Data);
DR7808_delay(2000);
//禁用看门狗
DR7808_Write_Reg(DR7808_GENCTRL2,0x4380,Data);
}</code></pre>
</div>

<p>&nbsp;</p>

<p><strong>DR7808设置HBMode:</strong></p>

<div>
<pre>
<code>HBMODE_InitTypeDef HBinit;
HBinit.HB8_Mode=HSn_ON;
HBinit.HB7_Mode=HighImpedance;
HBinit.HB6_Mode=HSn_ON;
HBinit.HB5_Mode=HighImpedance;
HBinit.HB4_Mode=LSn_ON;
HBinit.HB3_Mode=HighImpedance;
HBinit.HB2_Mode=LSn_ON;
HBinit.HB1_Mode=HighImpedance;
DR7808_Half_Bridge_Mode(&amp;HBinit,RegData);</code></pre>
</div>

<p><strong>DR7808设置PWM SET:</strong></p>

<p>&nbsp;</p>

<div>
<pre>
<code>// PWM 设置桥壁
PWMSET_InitTypeDef PWMinit;
// PWM2 和 PWM3 同样的设置方法
PWMinit.PWM1_EN=1;
PWMinit.PWM1_HB=HB6;
DR7808_PWMSET_Channel(&amp;PWMinit,RegData);</code></pre>
</div>

<p>&nbsp;</p>

<p><strong>DR7808设置VDS 监控阈值:</strong></p>

<p>&nbsp;</p>

<div>
<pre>
<code>//设置VDS监控阈值
// half bridge Vds threshold Setting
// 半桥Vds阈值设定
/*
    000B: 0.15V
    001B: 0.20V (default)
    010B: 0.25V
    011B: 0.30V
    100B: 0.40V
    101B: 0.50V
    110B: 0.60V
    111B: 2.0V
*/
VDS_Vth_InitTypeDef VDS_ThInit;
VDS_ThInit.HB1_VDSTh=Vdsth2_0;
VDS_ThInit.HB2_VDSTh=Vdsth2_0;
VDS_ThInit.HB3_VDSTh=Vdsth2_0;
VDS_ThInit.HB4_VDSTh=Vdsth2_0;
VDS_ThInit.HB5_VDSTh=Vdsth2_0;
VDS_ThInit.HB6_VDSTh=Vdsth2_0;
VDS_ThInit.HB7_VDSTh=Vdsth2_0;
VDS_ThInit.HB8_VDSTh=Vdsth2_0;
DR7808_VDS_Monitoring_1_4(&amp;VDS_ThInit,RegData);
DR7808_VDS_Monitoring_5_8(&amp;VDS_ThInit,RegData);</code></pre>
</div>

<p>&nbsp;</p>

<p><strong>DR7808读取所有寄存器:</strong></p>

<p>&nbsp;</p>

<div>
<pre>
<code>Get_All_Reg(RData);</code></pre>
</div>

<p>&nbsp;</p>

<p><strong>DR7808 CSA相关配置:</strong></p>

<p>&nbsp;</p>

<div>
<pre>
<code>//关闭CSA
CSA_InitTypeDef CSA_Init;
// 关闭CSA1和CSA2
CSA_Init.CSA1_OFF=1;
CSA_Init.CSA2_OFF=1;

DR7808_CSA_Conifg(&amp;CSA_Init,RegData);
/*
// CSA 结构体
typedef struct{
//配置CSA方向 CSA_Bidirectional 或者 CSA_Unidirectional
//配置双向或者单向
uint8_t CSA1_Direction;
uint8_t CSA2_Direction;
// 配置 CSA Gain的大小 10,20,40,80
uint8_t CSA1_Gain;
uint8_t CSA2_Gain;
// 配置OCP是否开启
uint8_t OverCurrentProtect;
//配置CSA 在高边或者底边
//Configure CSA on the high-side or the low-side
uint8_t CSA1_Level;
uint8_t CSA2_Level;
//配置过流滤波时间
//Overcurrent filter time
uint8_t OC1FILT;
uint8_t OC2FILT;
//关闭CSA
//DisEnable CSA 设置为1
//Enable CSA 设置为0
uint8_t CSA1_OFF;
uint8_t CSA2_OFF;
// Overcurrent detection threshold
// 过流检测阈值设置
uint8_t OCTH1;
uint8_t OCTH2;
//Overcurrent detection threshold of SO1 with CSD1 = 0
//00B: VSO1 &gt; VDD / 2 (default)
//01B: VSO1 &gt; VDD / 2 + VDD / 10
//10B: VSO1 &gt; VDD / 2 + 2 x VDD / 10
//11B: VSO1 &gt; VDD / 2 + 3x VDD / 10
//Overcurrent detection threshold of SO1 with CSD1 = 1
//00B: VSO1 &gt; VDD / 2+2 x VDD / 20 or VCSOx &lt; VDD / 2 – 2 × VDD / 20 (default)
//01B: VSO1 &gt; VDD / 2+ 4x VDD / 20 or VCSOx &lt; VDD / 2 – 4 × VDD / 20
//10B: VSO1 &gt; VDD / 2+ 5 x VDD / 20 or VCSOx &lt; VDD / 2 ? 5 × VDD / 20
//11B: VSO1 &gt; VDD / 2+ 6x VDD / 20 or VCSOx &lt; VDD / 2 – 6 × VDD / 20
uint8_t CSA_BLK_SEL;
//1: CSA1 and CSA2 hold blank time is tccp + tblank/2
//0:CSA1 and CSA2 hold blank time is tccp + tblank(default)
// blank time 用于PWM 抑制功能时间设置
uint8_t CSA2_SH_EN;
uint8_t CSA1_SH_EN;
//选择是否使用PWM 抑制功能
//Select whether to use PWM suppression
uint8_t OC_SEP_EN;
// 选择 OCEN情况下只有CSA连接的半桥turn off 还是所有半桥Turn off
uint8_t CSA2_SEL;
uint8_t CSA1_SEL;
// CSA SEL根据CSA连接的半桥选择

}CSA_InitTypeDef;
*/</code></pre>
</div>

<p>好啦,就酱拉,测试电路板如下:</p>

<p>&nbsp;</p>

<p> &nbsp;</p>
</div><script>                                        var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                                       
                                        if(parseInt(discuz_uid)==0){
                                                                                                (function($){
                                                        var postHeight = getTextHeight(400);
                                                        $(".showpostmsg").html($(".showpostmsg").html());
                                                        $(".showpostmsg").after(loginstr);
                                                        $(".showpostmsg").css({height:postHeight,overflow:"hidden"});
                                                })(jQuery);
                                        }                </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

xutong 发表于 2023-10-19 14:03

<pre>
<code class="language-cpp">#include "bsp_lpspi.h"
SPI_HandleTypeDef SpiHandle;

void Spi_delay(uint32_t count)
{
    volatile uint32_t i = 0;
    for (i = 0; i &lt; count; ++i)
    {
      __asm("NOP"); /* 调用nop空指令 */
         __asm("NOP"); /* 调用nop空指令 */
          __asm("NOP"); /* 调用nop空指令 */
         __asm("NOP"); /* 调用nop空指令 */
            __asm("NOP"); /* 调用nop空指令 */
    }
}
void LPSPI_Init(void)
{
   
    GPIO_InitTypeDefGPIO_InitStruct;
    /* Enable SPI1 clock */
    SPIx_CLK_ENABLE();
    SPIx_SCK_GPIO_CLK_ENABLE();
    SPIx_MISO_GPIO_CLK_ENABLE();
    SPIx_MOSI_GPIO_CLK_ENABLE();
    SPIx_CS_GPIO_CLK_ENABLE();
   
   

    /* 初始化GPIO 配置*/
    /*##-1- Configure peripheral GPIO ##########################################*/
    /* SPI SCK GPIO pin configuration*/
    GPIO_InitStruct.Pin       = SPIx_SCK_PIN;
    GPIO_InitStruct.Mode      = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull      = GPIO_PULLDOWN;
    GPIO_InitStruct.Speed   = GPIO_SPEED_FREQ_HIGH;
    GPIO_InitStruct.Alternate = SPIx_SCK_AF;
    HAL_GPIO_Init(SPIx_SCK_GPIO_PORT, &amp;GPIO_InitStruct);

    /* SPI MISO GPIO pin configuration*/
    GPIO_InitStruct.Pin = SPIx_MISO_PIN;
    GPIO_InitStruct.Alternate = SPIx_MISO_AF;
    HAL_GPIO_Init(SPIx_MISO_GPIO_PORT, &amp;GPIO_InitStruct);

    /* SPI MOSI GPIO pin configuration*/
    GPIO_InitStruct.Pin = SPIx_MOSI_PIN;
    GPIO_InitStruct.Alternate = SPIx_MOSI_AF;
    HAL_GPIO_Init(SPIx_MOSI_GPIO_PORT, &amp;GPIO_InitStruct);
   
   /* SPI CS GPIO pin configuration*/
    GPIO_InitStruct.Pin = SPIx_CS_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull      = GPIO_PULLDOWN;
    GPIO_InitStruct.Speed   = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(SPIx_CS_GPIO_PORT, &amp;GPIO_InitStruct);
   
      /* 初始化SPI 配置*/
   /*##-2- Configure the SPI peripheral #######################################*/
    /* Set the SPI parameters */
    SpiHandle.Instance               = SPIx;
    SpiHandle.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256;
    SpiHandle.Init.Direction         = SPI_DIRECTION_2LINES;
    SpiHandle.Init.CLKPhase          = SPI_PHASE_1EDGE;
    SpiHandle.Init.CLKPolarity       = SPI_POLARITY_HIGH;
    SpiHandle.Init.DataSize          = SPI_DATASIZE_8BIT;
    SpiHandle.Init.FirstBit          = SPI_FIRSTBIT_MSB;
    SpiHandle.Init.TIMode            = SPI_TIMODE_DISABLE;
    SpiHandle.Init.CRCCalculation    = SPI_CRCCALCULATION_DISABLE;
    SpiHandle.Init.CRCPolynomial   = 7;
    SpiHandle.Init.NSS               = SPI_NSS_SOFT;
    SpiHandle.Init.Mode            = SPI_MODE_MASTER;
    //初始化SPI
    HAL_SPI_Init(&amp;SpiHandle);
    //默认拉高CS引脚
    HAL_GPIO_WritePin(SPIx_CS_GPIO_PORT,SPIx_CS_PIN,GPIO_PIN_SET);

}
void Lpspi_Write(uint8_t datasize,uint8_t *data)
{

//写数据
HAL_GPIO_WritePin(SPIx_CS_GPIO_PORT,SPIx_CS_PIN,GPIO_PIN_RESET);
HAL_SPI_Transmit(&amp;SpiHandle,data, datasize, 5000);
Spi_delay(30);
HAL_GPIO_WritePin(SPIx_CS_GPIO_PORT,SPIx_CS_PIN,GPIO_PIN_SET);
}
void Lpspi_Read(uint8_t datasize,uint8_t *data,uint8_t *Rxdata)
{
//读写数据
HAL_GPIO_WritePin(SPIx_CS_GPIO_PORT,SPIx_CS_PIN,GPIO_PIN_RESET);
HAL_SPI_TransmitReceive(&amp;SpiHandle,data,Rxdata, datasize, 5000);
Spi_delay(30);
HAL_GPIO_WritePin(SPIx_CS_GPIO_PORT,SPIx_CS_PIN,GPIO_PIN_SET);
}
</code></pre>

<p>转换为STM32 SPI的头文件</p>

<pre>
<code class="language-cpp">/*
analogysemi
xutong 2023/10/19
*/
#ifndef __BSP_LPSPI_H
#define __BSP_LPSPI_H

#include "stm32h7xx_hal.h"


#define SPIx                           SPI1
#define SPIx_CLK_ENABLE()                __HAL_RCC_SPI1_CLK_ENABLE()
#define SPIx_SCK_GPIO_CLK_ENABLE()       __HAL_RCC_GPIOB_CLK_ENABLE()
#define SPIx_MISO_GPIO_CLK_ENABLE()      __HAL_RCC_GPIOB_CLK_ENABLE()
#define SPIx_MOSI_GPIO_CLK_ENABLE()      __HAL_RCC_GPIOB_CLK_ENABLE()

#define SPIx_CS_GPIO_CLK_ENABLE()      __HAL_RCC_GPIOB_CLK_ENABLE()
/* Definition for SPIx Pins */
#define SPIx_SCK_PIN                     GPIO_PIN_3
#define SPIx_SCK_GPIO_PORT               GPIOB
#define SPIx_SCK_AF                      GPIO_AF5_SPI1
#define SPIx_MISO_PIN                  GPIO_PIN_4
#define SPIx_MISO_GPIO_PORT            GPIOB
#define SPIx_MISO_AF                     GPIO_AF5_SPI1
#define SPIx_MOSI_PIN                  GPIO_PIN_5
#define SPIx_MOSI_GPIO_PORT            GPIOB
#define SPIx_MOSI_AF                     GPIO_AF5_SPI1

#define SPIx_CS_PIN                      GPIO_PIN_6
#define SPIx_CS_GPIO_PORT                GPIOB




void LPSPI_Init(void);

void Lpspi_Write(uint8_t datasize,uint8_t *data);
void Lpspi_Read(uint8_t datasize,uint8_t *data,uint8_t *Rxdata);

#endif /* __BSP_LPSPI_H */</code></pre>

<p>&nbsp;</p>
页: [1]
查看完整版本: DR7808驱动使用NXP RT052