FUSB302MPX学习资料

FUSB302MPX具有以下特点:

1. 支持USB Power Delivery 2.0协议和USB Type-C规范。
2. 集成了USB PD控制器和Type-C CC检测器,可实现双向通信和电源管理。
3. 支持多种电源模式,包括供电、充电和外设模式。
4. 包含SPI接口,可通过软件配置各种参数,例如电源模式、VCONN电压等等。
5. 具有强大的ESD保护功能,可保障系统的稳定性和可靠性。

FUSB302MPX作为PD从设备的工作方法:

1. 检测CC线:

        FUSB302MPX通过检测CC线上的电压和电流来确定连接的设备类型和电源能力。

2. 发送请求:

        如果FUSB302MPX检测到已连接的USB Type-C主设备支持USB PD协议,

        那么它会向主设备发送一个请求,请求特定的电源供应电压和电流。

3. 协商电源:

        主设备接收到请求后,会向FUSB302MPX发送响应消息,告诉它可使用的电源参数范围。

        然后FUSB302MPX将选择最适合的电源参数并向主设备发送接受消息。

4. 开始充电:

        如果协商成功,FUSB302MPX将开始从主设备接收电源,并将其转换成适当的电压和

        电流以供给被充电设备。

5. 监控充电:

        FUSB302MPX将监视充电过程中的电流和电压,并在达到设定阈值时停止充电,

        以保护被充电设备。

通讯示例代码:

#include "stm32f4xx.h"
#include "usb_pd.h" // 包含USB PD协议栈头文件
#include "fusb302.h" // 包含FUSB302MPX驱动程序头文件

void USB_PD_Sink_Init(void)
{
  FUSB302_Init(); // 初始化FUSB302MPX芯片
  USB_PD_Init(FUSB302_Send_Request); // 初始化USB PD协议栈,并在发送请求时调用FUSB302_Send_Request函数
}

void FUSB302_Send_Request(uint32_t voltage, uint32_t current)
{
  uint8_t message[4];
  
  message[0] = 0x80; // 控制字节,表示发送请求消息
  message[1] = (voltage & 0xFF);
  message[2] = ((voltage >> 8) & 0x03) | ((current & 0x3F) << 2);
  message[3] = (current >> 6);
  
  FUSB302_Send_Message(message, 4); // 向FUSB302MPX芯片发送请求消息
}

void USB_PD_Sink_Task(void)
{
  uint8_t message[28];
  
  if(FUSB302_Receive_Message(message, 28)) // 如果接收到USB PD消息
  {
    uint8_t header = message[0];
    
    switch(header & 0x7F) // 解析控制字节
    {
      case 0x00: // GoodCRC消息,忽略
        break;
      
      case 0x01: // GotoMin消息,停止充电
        FUSB302_Send_Message(message, 0); // 发送Empty消息确认
        break;
      
      case 0x03: // Request消息,协商电源参数
        {
          uint32_t voltage = (message[1] & 0x3F) | ((message[2] & 0x03) << 6);
          uint32_t current = ((message[2] >> 2) & 0x3F) | ((message[3] & 0x0F) << 6);
          
          if(FUSB302_Accept_Request(voltage, current)) // 如果协商成功
          {
            uint8_t response[4];
            
            response[0] = 0x80; // 控制字节,表示发送接受消息
            response[1] = (voltage & 0xFF);
            response[2] = ((voltage >> 8) & 0x03) | ((current & 0x3F) << 2);
            response[3] = (current >> 6);
            
            FUSB302_Send_Message(response, 4); // 发送接受消息
          }
          else // 如果协商失败
          {
            FUSB302_Send_Message(message, 0); // 发送Empty消息拒绝
          }
        }
        break;
      
      default: // 其他消息类型,忽略
        break;
    }
  }
}

初始化示例代码:

#define FUSB_CTRL_REG   0x01    // Control register address
#define FUSB_SWITCHES1_REG  0x1c    // Switches1 register address
#define FUSB_CONTROL3_REG   0x16    // Control3 register address
#define FUSB_POWER_REG  0x56    // Power register address
#define FUSB_MASK_REG   0x0d    // Mask register address
#define FUSB_MEASURE_REG    0x29    // Measure register address

uint8_t init_fusb302mpx(void)
{
    uint8_t buf[2];

    // Reset FUSB302MPX
    buf[0] = FUSB_CTRL_REG;
    buf[1] = 0x00;  // clear everything
    HAL_I2C_Master_Transmit(&hi2c1, FUSB_I2C_ADDR, buf, 2, 100);  
    buf[1] = 0x08;  // set I2C_RESET bit to reset I2C state machine
    HAL_I2C_Master_Transmit(&hi2c1, FUSB_I2C_ADDR, buf, 2, 100);

    // Enable pull-down on CC1 and CC2 pins
    buf[0] = FUSB_SWITCHES1_REG;
    buf[1] = 0x48;
    HAL_I2C_Master_Transmit(&hi2c1, FUSB_I2C_ADDR, buf, 2, 100);

    // Set VBUS present threshold to 4.45V
    buf[0] = FUSB_CONTROL3_REG;
    buf[1] = 0x10;
    HAL_I2C_Master_Transmit(&hi2c1, FUSB_I2C_ADDR, buf, 2, 100);

    // Enable all interrupt masks
    buf[0] = FUSB_MASK_REG;
    buf[1] = 0x9f;  // enable all interrupts except for HardReset received
    HAL_I2C_Master_Transmit(&hi2c1, FUSB_I2C_ADDR, buf, 2, 100);

    // Set current limit to 3.5A
    buf[0] = FUSB_POWER_REG;
    buf[1] = 0xc0;
    HAL_I2C_Master_Transmit(&hi2c1, FUSB_I2C_ADDR, buf, 2, 100);

    // Set VCONN switch current limit to 1.5A
    buf[0] = FUSB_MEASURE_REG;
    buf[1] = 0x29;
    HAL_I2C_Master_Transmit(&hi2c1, FUSB_I2C_ADDR, buf, 2, 100);

    // ...

    return 0;
}

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值