MAX22216例程,4通道电磁阀驱动芯片

例程的获取,联系智联微官网。

TRINAMIC,步进电机驱动,精密运动控制-深圳市智联微电子有限公司

1、简介

MAX22216集成了四个可编程半桥,电压最大36V,每路半桥最高可提供1AFS电流,通道并联后电流最大3.2A。它主要用于驱动感应负载,如开关电磁阀、直流电机、比例阀、双稳态阀、继电器等。MAX22216的工作环境温度为-40°C至+125°C。

MAX22216支持支持高侧/低侧单端驱动操作,和桥接负载(BTL)配置。还支持通道并联。

MAX22216支持电压控制电流控制混合方案。在电压驱动调节模式(VDR 模式)下,半桥输出电压受控。电源变化会得到内部补偿。在电流驱动调节模式(CDR 模式)下,半桥输出电流受到控制。电流由内部感应并反馈至控制器,以实现精确的闭环调节。可对比例 P 和积分 I 进行配置,以优化稳态误差和动态性能。

MAX22216集成了旨在优化电磁线圈和直流电机驱动控制的功能。这些功能包括用于省电的两级定序器、用于降噪的驱动信号斜坡控制 (RAMP)、用于抵消静摩擦和磁滞影响的抖动功能 (DITH)、用于缩短通断周期的快速退磁功能 (DC_H2L) 以及用于限制浪涌失速电流的直流电机电流限制器

先进的诊断功能可提高系统可靠性并实现预测性维护。 这些功能包括柱塞运动检测 (DPM)、电感测量行程时间测量开负载检测 (OL) 以及通过串行接口进行实时电流监控。

2、芯片引脚

3、SPI时序

MAX22216支持SPI和芯片内部寄存器通信,SPI的时钟频率最大10MHz,CRC校验可选,要是 CRC_EN 引脚置为高电平可激活CRC校验。

“WnR”为在最高位,用这位区分SPI是写访问还是读访问。如果要写访问,这位要置“1”,如果要读访问,这位要置“0”。

下图是不带CRC校验的SPI通信时序。SPI 输入数据传输由一个 24 位字组成:8 位地址和一个 W/R 位,外加 16 位数据。

不带CRC校验的SPI通信时序

下图是带有 CRC 校验通信错误的SPI通信时序。SPI 输入数据传输由 32 位组成: 地址和 W/R 位为 8 位,数据为 16 位,CRC校验为 8 位。如果 CRC_EN 引脚为高电平,则启用 CRC 错误检测。

带CRC校验的SPI通信时序

SPI返回值

每次SPI通信,正常都有返回值,先返回8bit的SPI状态位,后面16bit数据。16bit的数据,和上一个指令是读访问还是写访问有关。

如果上一条命令是写访问,DATA_OUT 将包含上一条命令中发送的 D[15:0] 数据。

如果上一条命令是读访问,DATA_OUT 将包含上一条命令中发送的 A[6:0] 地址的寄存器映射数据。所以如果要对寄存器读访问,需要连续读两次,用后面那次的返回值

4、编程指导

下面的例程是基于STM32F103C8T6开发,用STM32cubemx生成工程文件

4.1、SPI通信例程

#include "spi.h"

volatile uint16_t register_value;            //一个临时变量
volatile uint8_t max22216_crc_en = 1;        // 1:SPI启动 CRC校验;0:SPI不使用 CRC校验
__MAX22216 MAX22216_Registers;


// => CRC wrapper
//extern uint8_t max22216_CRC8(uint8_t *data, size_t length);
// <= CRC wrapper

// SPI通信的 CRC 计算
uint8_t max22216_CRC(uint8_t *data, size_t length)
{
    volatile uint8_t crc = 0x1F;             // 0b11111;
	volatile uint8_t crc_old;
	for(size_t i = 0; i < length; i++)
    {
		crc_old = crc;
		crc = FIELD_SET(crc, (1 << 5), 5, FIELD_GET(crc_old, (1 << 4), 4));
		crc = FIELD_SET(crc, (1 << 4), 4, FIELD_GET(crc_old, (1 << 3), 3) ^ FIELD_GET(crc_old, (1 << 4), 4) ^ FIELD_GET(data[i / 8], (1 << (7 - (i % 8))), 7 - (i % 8)));
		crc = FIELD_SET(crc, (1 << 3), 3, FIELD_GET(crc_old, (1 << 2), 2));
		crc = FIELD_SET(crc, (1 << 2), 2, FIELD_GET(crc_old, (1 << 1), 1) ^ FIELD_GET(crc_old, (1 << 4), 4) ^ FIELD_GET(data[i / 8], (1 << (7 - (i % 8))), 7 - (i % 8)));
		crc = FIELD_SET(crc, (1 << 1), 1, FIELD_GET(crc_old, 1, 0));
		crc = FIELD_SET(crc, 1, 0, FIELD_GET(crc_old, (1 << 4), 4) ^ FIELD_GET(data[i / 8], (1 << (7 - (i % 8))), 7 - (i % 8)));
	}
	return (crc & 0x1F);
}


/**
  * @brief  往寄存器值写入参数,并更新获取到的SPI_STATUS状态字节
  * @param  address:寄存器地址
  * @param    value:写入的值
  * @return 返回SPI状态字,如果通信成功的话
  * @attention   有的寄存器仅读访问,也有寄存器可读可写,具体查 MAX22216 规格书确认
  *
  */
void max22216_writeInt(uint8_t address, int16_t value)
{
    uint8_t send_data[4] = {0,0,0,0};
    uint8_t datagram1[4] = {0,0,0,0};
    
    send_data[0] = address | TMC_WRITE_BIT;
	send_data[1] = (value >>  8) & 0xff;
	send_data[2] = value  & 0xff;
    
    if(max22216_crc_en)
        send_data[3] = max22216_CRC(&send_data[0], 27);
        
    HAL_GPIO_WritePin(SPI_CSN_GPIO_Port,SPI_CSN_Pin,GPIO_PIN_RESET);   	//SPI_CS片选拉低   
    HAL_SPI_TransmitReceive(&hspi1, send_data, datagram1, ((max22216_crc_en) ? 4 : 3),100);		
    HAL_GPIO_WritePin(SPI_CSN_GPIO_Port,SPI_CSN_Pin,GPIO_PIN_SET);  	//SPI_CS片选拉高
    
    MAX22216_Registers.SPI_STATUS.Value = datagram1[0];                     //更新SPI状态字 SPI_STATUS
}


/**
  * @brief  获取寄存器值并返回,并更新获取到的SPI_STATUS状态字节
  * @param  address:寄存器地址
  * @return 返回获取到的寄存器的值
  * @attention   有的寄存器仅写访问,也有寄存器可读可写,具体查 MAX22216 规格书确认
  *
  */
int16_t max22216_readInt(uint8_t address)
{
    uint8_t send_data[4] = {0,0,0,0};
	uint8_t receive_data[4] = {0,0,0,0};
    
    send_data[0] = address;
    
    if(max22216_crc_en)
        send_data[3] = max22216_CRC(&send_data[0], 27);
    
    //SPI读,需要读两次。是因为每次SPI通信,返回的是前一次读或写访问返回的数据
    HAL_GPIO_WritePin(SPI_CSN_GPIO_Port,SPI_CSN_Pin,GPIO_PIN_RESET);    
    HAL_SPI_TransmitReceive(&hspi1, send_data, receive_data, ((max22216_crc_en) ? 4 : 3), 100);		
    HAL_GPIO_WritePin(SPI_CSN_GPIO_Port,SPI_CSN_Pin,GPIO_PIN_SET);  	//SPI_CS片选拉高
    HAL_GPIO_WritePin(SPI_CSN_GPIO_Port,SPI_CSN_Pin,GPIO_PIN_RESET);    
    HAL_SPI_TransmitReceive(&hspi1, send_data, receive_data, ((max22216_crc_en) ? 4 : 3), 100);
    HAL_GPIO_WritePin(SPI_CSN_GPIO_Port,SPI_CSN_Pin,GPIO_PIN_SET);  	//SPI_CS片选拉高

    MAX22216_Registers.SPI_STATUS.Value = receive_data[0];                     //更新SPI状态字 SPI_STATUS
	return (receive_data[1] << 8) | receive_data[2];
}

4.2、MAX22216的初始化例程

// MAX22216 的参数配置,初始化。
void max22216_init(void)
{
    uint16_t current_I, current_P;                           // CDR 电流模式的 I 和 P 参数。电压模式不用设置。
    HAL_GPIO_WritePin(GPIOB, CRC_EN_Pin, (max22216_crc_en) ? GPIO_PIN_SET : GPIO_PIN_RESET);        // max22216_crc_en如果是1,则 CRC_EN引脚置高电平,否则低电平
    HAL_GPIO_WritePin(GPIOB, ENABLE_Pin, GPIO_PIN_SET);      // ENABLE 引脚从高电平,要延时0.8mS,芯片才能正常工作。ENABLE引脚低电平时,芯片处于休眠模式
    HAL_Delay(1);
    
    register_value = max22216_readInt(MAX22216_STATUS);
    
    // 下面是写参数配置,参数说明看“MAX22216_Register.h”。如果有的参数只有1bit,那么可配置为“SET”或“RESET”。如果参数有2bit以上,可配置数字。
    //配置 MAX22216的 GLOBAL_CFG(0x01)寄存器
        MAX22216_Registers.GLOBAL_CFG.CHS           = N2IFB;             // 配置为2个独立全桥
        MAX22216_Registers.GLOBAL_CFG.ACTIVE        = SET;               // 使能部件
        MAX22216_Registers.GLOBAL_CFG.VDRnVDRDUTY   = SET;             // 不使能 VDR 模式下的VM补偿
        MAX22216_Registers.GLOBAL_CFG.STAT_POL      = RESET;             // STAT0、STAT1 状态引脚活动时高电平
        MAX22216_Registers.GLOBAL_CFG.CNTL_POL      = RESET;             // 引脚 CNTLx 高电平有效
        MAX22216_Registers.GLOBAL_CFG.M_UVM         = RESET;             // 0: 开启 VM引脚的欠压锁定故障检测
        MAX22216_Registers.GLOBAL_CFG.M_COMF        = RESET;             // 0: 开启 SPI 的通信失败故障检测
        MAX22216_Registers.GLOBAL_CFG.M_DPM         = RESET;             // 0: 开启 DPM柱塞运动检测
        MAX22216_Registers.GLOBAL_CFG.M_HHF         = RESET;             // 0: 开启 未达到激励电流检测
        MAX22216_Registers.GLOBAL_CFG.M_OLF         = RESET;             // 0: 开启 负载开路检测
        MAX22216_Registers.GLOBAL_CFG.M_OCP         = SET;             // 0: 开启 过电流保护检测
        MAX22216_Registers.GLOBAL_CFG.M_OVT         = RESET;             // 0: 开启 过温故障检测
    

    //配置 MAX22216的 GLOBAL_CTRL(0x00)寄存器
        MAX22216_Registers.GLOBAL_CTRL.F_PWM_M      = F_PWM_M_100KHz;    // 设置主斩波器频率。
        MAX22216_Registers.GLOBAL_CTRL.CNTL0        = RESET;            // 初始化 22216前先关闭通道 0
        MAX22216_Registers.GLOBAL_CTRL.CNTL1        = RESET;            // 初始化 22216前先关闭通道 1
        MAX22216_Registers.GLOBAL_CTRL.CNTL2        = RESET;            // 初始化 22216前先关闭通道 2
        MAX22216_Registers.GLOBAL_CTRL.CNTL3        = RESET;            // 初始化 22216前先关闭通道 3
    
    //配置 CFG_CTRL0 (0x0D,0x1B,0x29,0x37)寄存器
        MAX22216_Registers.CFG_CTRL0[0].CTRL_MODE   = Limiter_VDR;      // 选择 直流电机控制模式, 可配置的参数看“CTRL_MODE”枚举变量。
        MAX22216_Registers.CFG_CTRL0[0].RAMP        = 0;                // 设置斜坡扫描速率。可编程的电压/电流斜坡(RAMP)使阀门的启动/关闭更加平稳,从而降低了噪音。
        MAX22216_Registers.CFG_CTRL0[0].RUPE        = RESET;            // 不启动斜坡上升阶段   
        MAX22216_Registers.CFG_CTRL0[0].RMDE        = RESET;
        MAX22216_Registers.CFG_CTRL0[0].RDWE        = RESET;
        MAX22216_Registers.CFG_CTRL0[0].H2L_EN      = RESET;        
        MAX22216_Registers.CFG_CTRL0[0].OL_EN       = SET;
        MAX22216_Registers.CFG_CTRL0[0].HHF_EN      = SET;
        
    //配置 CFG_CTRL1 (0x0E,0x1C,0x2A,0x38)寄存器
        MAX22216_Registers.CFG_CTRL1[0].HSnLS       = RESET;              // 0: 配置为低压侧驱动;             1: 配置为高压侧驱动
        MAX22216_Registers.CFG_CTRL1[0].F_PWM       = F_PWM_1;          // 设置通道的时钟分频,这里设置 1 分频
        MAX22216_Registers.CFG_CTRL1[0].SNSF        = SNSF_1;           // 改变会影响电流的计算。
        MAX22216_Registers.CFG_CTRL1[0].GAIN        = GAIN_1;           // 改变会影响电流的计算。
        MAX22216_Registers.CFG_CTRL1[0].SLEW_RATE   = 0;
        MAX22216_Registers.CFG_CTRL1[0].T_BLANKING  = 0;
        
     // CDR 电流模式的 I 和 P 参数。电压模式不用设置。
        current_P = 100;                                                // 数值范围 0...65535。
        current_I = 40;                                                 // 数值范围 0...65535。
        
    
    // 用 SPI 配置 22216 芯片的两个全局参数寄存器
    max22216_writeInt(MAX22216_GLOBAL_CFG,              MAX22216_Registers.GLOBAL_CFG.Value);                   //配置 MAX22216的 GLOBAL_CFG( 0x01)寄存器
    
    MAX22216_FIELD_WRITE(MAX22216_FAULT1, MAX22216_UVM_FAULT1_MASK, MAX22216_UVM_FAULT1_SHIFT, SET);                // 激活后,清除UVM标志,FAULT1(0x66)寄存器的bit4写 '1' 清除
    register_value = max22216_readInt(MAX22216_STATUS);                                                             // 检查 MAX22216_STATUS 寄存器的 UVM 标志有没请0,也就是 bit1。
    
    max22216_writeInt(MAX22216_GLOBAL_CTRL,             MAX22216_Registers.GLOBAL_CTRL.Value);                  //配置 MAX22216的 GLOBAL_CTRL(0x00)寄存器
    
    // 配置4个通道的 CFG_CTRL0(ch) 寄存器。这里把 4 个通道配置成一样
    max22216_writeInt(MAX22216_CFG_CTRL0( Channel_0 ),  MAX22216_Registers.CFG_CTRL0[0].Value);      //配置 MAX22216的 CFG_CTRL0(0x0D)寄存器
    max22216_writeInt(MAX22216_CFG_CTRL0( Channel_1 ),  MAX22216_Registers.CFG_CTRL0[0].Value);
    max22216_writeInt(MAX22216_CFG_CTRL0( Channel_2 ),  MAX22216_Registers.CFG_CTRL0[0].Value);
    max22216_writeInt(MAX22216_CFG_CTRL0( Channel_3 ),  MAX22216_Registers.CFG_CTRL0[0].Value);
    
    // 配置4个通道的 CFG_CTRL1(ch) 寄存器。这里把 4 个通道配置成一样
    max22216_writeInt(MAX22216_CFG_CTRL1( Channel_0 ),  MAX22216_Registers.CFG_CTRL1[0].Value);      //配置 MAX22216的 CFG_CTRL1(0x0E)寄存器
    max22216_writeInt(MAX22216_CFG_CTRL1( Channel_1 ),  MAX22216_Registers.CFG_CTRL1[0].Value);
    max22216_writeInt(MAX22216_CFG_CTRL1( Channel_2 ),  MAX22216_Registers.CFG_CTRL1[0].Value);
    max22216_writeInt(MAX22216_CFG_CTRL1( Channel_3 ),  MAX22216_Registers.CFG_CTRL1[0].Value);



#if 0          // 如果是 CDR 电流模式,则需要配置 P 和 I 参数。     电流或电压控制模式的选择,是在 MAX22216_Registers.CFG_CTRL0[ch]寄存器的CTRL_MODE参数设置。
    // 配置4个通道的 PI 参数中的 P 参数寄存器。这里把 4 个通道配置成一样。仅 CDR 电流模式有效
    max22216_writeInt(MAX22216_CFG_I( Channel_0 ) ,     current_P);
    max22216_writeInt(MAX22216_CFG_P( Channel_1 ),      current_P);
    max22216_writeInt(MAX22216_CFG_P( Channel_2 ),      current_P);
    max22216_writeInt(MAX22216_CFG_P( Channel_3 ),      current_P);
    
    // 配置4个通道的 PI 参数中的 I 参数寄存器。这里把 4 个通道配置成一样。仅 CDR 电流模式有效
    max22216_writeInt(MAX22216_CFG_I( Channel_0 ) ,     current_I);
    max22216_writeInt(MAX22216_CFG_I( Channel_1 ),      current_I);
    max22216_writeInt(MAX22216_CFG_I( Channel_2 ),      current_I);
    max22216_writeInt(MAX22216_CFG_I( Channel_3 ),      current_I);
#endif

}

4.3、对通道的操作

/**
  * @brief  配置单个通道的 激励水平(电压或电流),和保持水平(电压或电流)
  * @param        ch: 选择通道,Channel_0,,,3。
  * @param    DC_L2H:配置通道的激励水平(电压或电流)。数值范围 0...65535。
  * @param      DC_H: 配置通道的保持水平(电压或电流)。数值范围 0...65535。
  * @return     无
  * @attention   参数计算可看压缩包里的《MAX22216的相关计算》表格。分电压模式和电流模式
  * 电压模式            DC_L2H 是电压(V),  DC_H 是电压(V),    DC_L 是电压(V),    DC_H2L 是电压(V);
  * 电流模式            DC_L2H 是电流(mA), DC_H 是电流(mA),   DC_L 是电流(mA),   DC_H2L 是电压(V);
  * 直流电机控制模式    DC_L2H 是电流(mA), DC_H 是电压(V),    DC_L 是电压(V),    DC_H2L 是电压(V);
  * 电压电流混合模式    DC_L2H 是电压(V),  DC_H 是电流(mA),   DC_L 是电流(mA),   DC_H2L 是电压(V);
  *
  */
void max22216_Single_Ended_Operation(uint8_t ch, uint16_t DC_L2H, uint16_t DC_H)
{
    max22216_writeInt(MAX22216_CFG_DC_L2H( ch ) ,     DC_L2H);          // 配置通道的 激励水平,影响通道刚打开时的扭矩和功率。
    max22216_writeInt(MAX22216_CFG_DC_H(   ch ) ,     DC_H);            // 配置通道的 保持水平,影响通道  保持时的扭矩和功率。
    max22216_writeInt(MAX22216_CFG_L2H_TIME(   ch ),  10);              // 配置通道的 激励时间。这里可以按照需求实际修改。


#if 0        // 如果需要通道的快速退磁,则把这里置 1。如果启动快速退磁,22216会在结束时打开一个方向电压。
    max22216_writeInt(MAX22216_DC_H2L,                  50);
    MAX22216_FIELD_WRITE(MAX22216_CFG_CTRL0( ch ), MAX22216_H2L_EN_MASK, MAX22216_H2L_EN_SHIFT, SET);
#else
    MAX22216_FIELD_WRITE(MAX22216_CFG_CTRL0( ch ), MAX22216_H2L_EN_MASK, MAX22216_H2L_EN_SHIFT, RESET);
#endif

    
    
    // 通过 SPI 配置寄存器方式,控制通道[ch] 的开和关。
    // 控制通道[ch] 的开和关,其实也可以用 22216 的 CNTL0...3几个引脚,本例程没使用这种方式。
    // 可以在程序需要的地方,控制通道的开启和关闭,写在这里是做个例子。
//    MAX22216_FIELD_WRITE(MAX22216_GLOBAL_CTRL,             MAX22216_CNTL0_MASK, MAX22216_CNTL0_SHIFT, SET);         // 控制通道 0 的开启
//    MAX22216_FIELD_WRITE(MAX22216_GLOBAL_CTRL,             MAX22216_CNTL0_MASK, MAX22216_CNTL0_SHIFT, RESET);       // 控制通道 0 的关闭

    // 又例如控制通道 1 的开启和关闭
//    MAX22216_FIELD_WRITE(MAX22216_GLOBAL_CTRL,             MAX22216_CNTL1_MASK, MAX22216_CNTL1_SHIFT, SET);         // 控制通道 1 的开启
//    MAX22216_FIELD_WRITE(MAX22216_GLOBAL_CTRL,             MAX22216_CNTL1_MASK, MAX22216_CNTL1_SHIFT, RESET);       // 控制通道 1 的关闭
}

4.4、一些定义

// Autogenerated C header for registers in MAX22216
// Generator version: 1.0

#ifndef MAX22216_REGISTERS
#define MAX22216_REGISTERS

#include "stdint.h"

#define Offset_ADDR(m)      (0x0E * m)
#define Offset_ADDR_2(m)    (0x09 * m)

#define MAX22216_GLOBAL_CTRL         0x00
#define MAX22216_GLOBAL_CFG          0x01
#define MAX22216_STATUS              0x02
#define MAX22216_STATUS_CFG          0x03
#define MAX22216_DC_H2L              0x04
#define MAX22216_ADC_VM_MEASUREMENT  0x05
#define MAX22216_VM_THRESHOLD        0x06
#define MAX22216_F_AC                0x07
#define MAX22216_U_AC_SCAN           0x08


                                                                        //     ch = 0  ch = 1  ch = 2  ch = 3
#define MAX22216_CFG_DC_L2H(ch)      (0x09 + Offset_ADDR(ch))           //      0x09    0x17    0x25    0x33
#define MAX22216_CFG_DC_H(ch)        (0x0A + Offset_ADDR(ch))           //      0x0A    0x18    0x26    0x34
#define MAX22216_CFG_DC_L(ch)        (0x0B + Offset_ADDR(ch))           //      0x0B    0x19    0x27    0x35
#define MAX22216_CFG_L2H_TIME(ch)    (0x0C + Offset_ADDR(ch))           //      0x0C    0x1A    0x28    0x36
#define MAX22216_CFG_CTRL0(ch)       (0x0D + Offset_ADDR(ch))           //      0x0D    0x1B    0x29    0x37
#define MAX22216_CFG_CTRL1(ch)       (0x0E + Offset_ADDR(ch))           //      0x0E    0x1C    0x2A    0x38
#define MAX22216_CFG_DPM0(ch)        (0x0F + Offset_ADDR(ch))           //      0x0F    0x1D    0x2B    0x39
#define MAX22216_CFG_DPM1(ch)        (0x10 + Offset_ADDR(ch))           //      0x10    0x1E    0x2C    0x3A
#define MAX22216_CFG_DC(ch)          (0x11 + Offset_ADDR(ch))           //      0x11    0x1F    0x2D    0x3B
#define MAX22216_CFG_R_THLD(ch)      (0x12 + Offset_ADDR(ch))           //      0x12    0x20    0x2E    0x3C
#define MAX22216_CFG_IND(ch)         (0x13 + Offset_ADDR(ch))           //      0x13    0x21    0x2F    0x3D
#define MAX22216_CFG_IND_1(ch)       (0x14 + Offset_ADDR(ch))           //      0x14    0x22    0x30    0x3E
#define MAX22216_CFG_P(ch)           (0x15 + Offset_ADDR(ch))           //      0x15    0x23    0x31    0x3F
#define MAX22216_CFG_I(ch)           (0x16 + Offset_ADDR(ch))           //      0x16    0x24    0x32    0x40



#define MAX22216_I_DPM_PEAK(ch)      (0x41 + Offset_ADDR_2(ch))         //      0x41    0x4A    0x53    0x5C
#define MAX22216_I_DPM_VALLEY(ch)    (0x42 + Offset_ADDR_2(ch))         //      0x42    0x4B    0x54    0x5D
#define MAX22216_TRAVEL_TIME(ch)     (0x43 + Offset_ADDR_2(ch))         //      0x43    0x4C    0x55    0x5E
#define MAX22216_REACTION_TIME(ch)   (0x44 + Offset_ADDR_2(ch))         //      0x44    0x4D    0x56    0x5F
#define MAX22216_I_MONITOR(ch)       (0x45 + Offset_ADDR_2(ch))         //      0x45    0x4E    0x57    0x60
#define MAX22216_I_DC(ch)            (0x46 + Offset_ADDR_2(ch))         //      0x46    0x4F    0x58    0x61
#define MAX22216_I_IND_AC(ch)        (0x47 + Offset_ADDR_2(ch))         //      0x47    0x50    0x59    0x62
#define MAX22216_R(ch)               (0x48 + Offset_ADDR_2(ch))         //      0x48    0x51    0x5A    0x63
#define MAX22216_PWM_DUTY(ch)        (0x49 + Offset_ADDR_2(ch))         //      0x49    0x52    0x5B    0x64



#define MAX22216_FAULT0              0x65
#define MAX22216_FAULT1              0x66

#define MAX22216_OTP_CONTROL         0x68
#define MAX22216_OTP_STATUS          0x69
#define MAX22216_OTP_DATA0           0x7A
#define MAX22216_OTP_DATA1           0x7B
#define MAX22216_OTP_ADDR            0x7C


#pragma anon_unions
//SPI只要通信成功,都有数据返回,包括返回SPI_STATUS状态字节
typedef union // 用来描述SPI_STATUS的数据字
{
	uint8_t Value;
	struct // 用来描述控制寄存器的数据字
	{
		// 低位在前,高位在后
		uint8_t STAT0   		    : 1;    // 
		uint8_t STAT1     	        : 1;    // 
		uint8_t DPM                 : 1;    // 1: 柱塞移动故障
		uint8_t UVM                 : 1;    // 1: 说明 VM引脚欠电压锁定故障
		uint8_t COMER 	            : 1;    // 1: CRC校检错误故障。 如果检测到 CRC错误,芯片不会更改配置。相反,MAX22216/MAX22217 会将下一次 SPI 传输的状态字节的 COMER 位设置为高电平。
		uint8_t OLF 	            : 1;    // 1: 通道关闭期间开路负载 指示
		uint8_t OCP                 : 1;    // 1: 说明过电流保护
		uint8_t OVT    	            : 1;    // 1: 说明过温保护
	};
}__SPI_STATUS;


typedef union // 用来描述 GLOBAL_CTRL(0x00) 的数据字
{
	uint16_t Value;
	struct
	{
		// 低位在前,高位在后
		uint8_t CNTL0               : 1;    // 用于根据 GLOBAL_CFG 寄存器的 CHS 寄存器字段控制相应通道。0:关闭通道;1:打开通道
        uint8_t CNTL1               : 1;    // 用于根据 GLOBAL_CFG 寄存器的 CHS 寄存器字段控制相应通道。0:关闭通道;1:打开通道
		uint8_t CNTL2               : 1;    // 用于根据 GLOBAL_CFG 寄存器的 CHS 寄存器字段控制相应通道。0:关闭通道;1:打开通道
        uint8_t CNTL3               : 1;    // 用于根据 GLOBAL_CFG 寄存器的 CHS 寄存器字段控制相应通道。0:关闭通道;1:打开通道
		uint8_t F_PWM_M             : 4;    // 配置主斩波器频率。
        uint8_t reserved            : 8;    // 保留位,保持0
	};
}__GLOBAL_CTRL;


typedef union // 用来描述 GLOBAL_CFG(0x01) 的数据字
{
	uint16_t Value;
	struct
	{
		// 低位在前,高位在后
		uint8_t CHS                 : 4;    // 选择半桥和全桥各多少个,详细看 CHS_type
        uint8_t VDRnVDRDUTY         : 1;    // 1:VM补偿开启; 0: VM补偿关闭。只能在VDR模式设置,在CDR模式下无效。
        uint8_t reserved            : 1;    // 保留位,保持0
		uint8_t STAT_POL            : 1;    // 配置状态引脚的极性。   1:STAT0、STAT1 状态引脚活动时低电平;  0: STAT0、STAT1 状态引脚活动时高电平
        uint8_t CNTL_POL            : 1;    // 控制引脚的极性。       1:引脚CNTLx低电平有效                 0:引脚CNTLx高电平有效;
		uint8_t M_UVM               : 1;    //                       1: 屏蔽 VM引脚的欠压锁定故障检测;       0: 开启 VM引脚的欠压锁定故障检测
        uint8_t M_COMF              : 1;    //                       1: 屏蔽 SPI 的通信失败故障检测;         0: 开启 SPI 的通信失败故障检测
        uint8_t M_DPM               : 1;    //                       1: 屏蔽 DPM柱塞运动检测;                0: 开启 DPM柱塞运动检测
        uint8_t M_HHF               : 1;    //                       1: 屏蔽 未达到激励电流检测;             0: 开启 未达到激励电流检测
        uint8_t M_OLF               : 1;    //                       1: 屏蔽 负载开路检测;                   0: 开启 负载开路检测
        uint8_t M_OCP               : 1;    //                       1: 屏蔽 过电流保护检测;                 0: 开启 过电流保护检测
        uint8_t M_OVT               : 1;    //                       1: 屏蔽 过温故障检测;                   0: 开启 过温故障检测
        uint8_t ACTIVE              : 1;    // 激活位                 1:使能器件;                           0:禁用器件,启用低功耗模式;
	};
}__GLOBAL_CFG;



typedef union // 用来描述 CFG_CTRL0 (0x0D,0x1B,0x29,0x37) 的数据字
{
	uint16_t Value;
	struct
	{
		// 低位在前,高位在后
		uint8_t RAMP                : 8;    // 设置斜坡扫描速率。可编程的电压/电流斜坡(RAMP)使阀门的启动/关闭更加平稳,从而降低了噪音。
        uint8_t RUPE                : 1;    // 启用斜坡上升
        uint8_t RMDE                : 1;    // 斜坡中间使能位
		uint8_t RDWE                : 1;    // 斜坡下降使能位
        uint8_t H2L_EN              : 1;    // 1: H2L快速退磁使能位
		uint8_t OL_EN               : 1;    // 1: 开路负载电路使能(使能上拉/下拉)
        uint8_t HHF_EN              : 1;    // 1:启用电流未达故障检测
        uint8_t CTRL_MODE           : 2;    // 0: 电压控制; 1: 电流控制; 2: 限制电压(驱动直流电机); 3: 电压和电流控制
    };
}__CFG_CTRL0;


typedef union // 用来描述 CFG_CTRL1 (0x0E,0x1C,0x2A,0x38) 的数据字
{
	uint16_t Value;
	struct
	{
		// 低位在前,高位在后
		uint8_t SNSF                : 2;    // 设置感应缩放因子。会影响电流的计算。
        uint8_t GAIN                : 2;    // 为电流驱动器调节 (CDR) 设置数字增益。会影响电流的计算。
        uint8_t SLEW_RATE           : 2;    // SRC[1:0]: 回转速率控制位。(当 F_PWM > 50kHz 时,"10"、"11 "被抑制)。
		uint8_t T_BLANKING          : 2;    // 定义当前测量的额外消隐时间。
        uint8_t F_PWM               : 2;    // 定义通道使用的 PWM 频率。 
		uint8_t HSnLS               : 1;    // 0: 配置为低压侧驱动;             1: 配置为高压侧驱动
    };
}__CFG_CTRL1;


typedef union // 用来描述 CFG_DPM1(0x10,0x1E,0x2C,0x3A) 的数据字
{
	uint16_t Value;
	struct
	{
		// 低位在前,高位在后
		uint8_t DPM_START           : 8;    // 一旦实际电流超过 DPM_START*8,检测即开始。
        uint8_t DPM_MIN_NBR         : 4;    // 要检测到有效的 BEMF 跌落,必须至少在 DPM_MIN_NBR*2 个连续 PWM 周期内满足该条件。
        uint8_t END_HIT_AUTO        : 1;    // 
		uint8_t END_HIT_TO_HIZ_AUTO : 1;    // 
        uint8_t DPM_EN              : 1;    // 
		
    };
}__CFG_DPM1;



typedef struct
{
    __SPI_STATUS    SPI_STATUS;
    __GLOBAL_CTRL   GLOBAL_CTRL;
    __GLOBAL_CFG    GLOBAL_CFG;
    
    __CFG_CTRL0     CFG_CTRL0[4];
    __CFG_CTRL1     CFG_CTRL1[4];
    __CFG_DPM1      CFG_DPM1[4];
    
}__MAX22216;

extern __MAX22216 MAX22216_Registers;




#endif

5、写在最后

如果需要完整工程,联系深圳市智联微电子有限公司获取,网址TRINAMIC,步进电机驱动,精密运动控制-深圳市智联微电子有限公司

  • 40
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,但我无法提供关于M2芯片下载IDEA教程的信息。M2芯片是苹果的一款自研芯片,而IDEA是一款Java集成开发环境,它们之间没有直接的联系。你可以尝试在苹果的官方网站或者IDEA的官方网站上查找相关的下载和安装教程。此外,你还可以在在线技术论坛或社区中搜索相关问题,或者咨询苹果或IDEA的客服支持。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [emqtt-bench mac m2芯片编译](https://download.csdn.net/download/m875302177/87803323)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [苹果m2芯片生态兼容性调研(java全栈架构师需求)](https://blog.csdn.net/u013600314/article/details/126766031)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Mac m1/m2 芯片安装brew和svn保姆级教程](https://blog.csdn.net/SuperAutoBot/article/details/129562447)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值