通过SMBus over I2C通道与DPU交互

本卡的SMBUS接口由板卡的MCU实现,MCU的SMBUS Slave Address为0xD40x6A(7位地址)

针对BMC而言,作为Master读写流程如下:

一次完整的交互可以分为两步:

  1. Master发送Read/Write Request,即发起读写请求。
  2. Master发送Read/Write Response,即发起读写响应,回读数据。
  • 若无特别说明,Master发送两次命令的时间间隔至少为1ms。
  • 当发起读写响应,读到的错误码为0xF或读不到有效数据时,代表SMBUS正处在BUSY状态,需要重新读取,重新获取的时间间隔可阶梯式增长。
  • 如果连续5s都是BUSY状态,则需要检测MCU心跳,看MCU是否正常工作。

本通信协议SMBUS所描述的帧格式全是小端格式(LSB,低字节先发、高字节后发)

命令格式描述说明:

白色底表示master发送给slave的数据,灰色底表示slave发送给master的数据。

Slave address是指MCU作为slave的设备地址,与单板相关。

Command code为固定值:Request命令为0x20,Response命令为0x21。

Byte Count表示有效的数据长度N(其中N的值与具体的芯片实现相关),单位字节(Byte)。

Data Byte1 ~ Data ByteN表示有效的数据,Request命令是从Master发给Slave,Response命令是从Slave发给Master,数据结构定义详见命令格式。

Read/Write Request命令格式

Master(BMC/CPU)要与MCU进行交互,首先必须要发送的便是读请求(Read Request)或者写请求(Write Request)。读写请求根据Master与Slave交互的具体功能而决定。如果Master要向MCU发送控制命令,如配置启动方式,则为写请求;如果Master需要从MCU获取数据,如获取日志、结温、版本号等,则属于读请求。读请求和写请求,对Master来说,本质都是IIC/SMBUS Master write操作。其帧格式具体如下图所示:

其中请求数据(Data Byte1 ~ Data Byte N)帧格式数据结构定义如下:

Request Data Structure

Bytes

Name

1

LUN

Bit0-bit6:Rserved

Bit7=1表示最后一帧,Bit7=0表示数据未写完

2

arg

作为opcode的补充参数,不能以bit位的形式占用

3 ~ 4

opcode

命令字,详见“opcode定义”

5~8

offset

数据读取偏移,从0开始,超长数据时需要分多次读取,如第一次读取填0,读取长度为32,则第二次读取时offset填32

9 ~ 12

length

读操作:

数据读长度,指的是期望Response返回的Data长度。

写操作:

数据写长度, 指的是请求数据中Data字段的长度。

Length应考虑对端(Slave设备)以及本端(Master)的I2C/SMBUS发送/接收Buffer能力,根据Buffer能力减去消息头长度。本产品MCU作为Slave设备,其Buffer能力约束在64Byte。Master端buffer大小需要由调用方自行确认。

对于I2C设备,需要考虑PEC字段是否占用Buffer深度。

13 ~ N

data

数据区,对于内容变长的opcode,数据多少与slave侧驱动能力相关。

本卡的MCU针对data的最大长度限制在16字节。16字节不包含每一帧数据最后的PEC字段(CRC)。

本卡的MCU实现的SMBUS通信要求必须支持PEC字段以保证数据通信的可靠性。

Read/Write Response命令格式

与读请求(Read Request)和写请求(Write Request)相对应,有读响应(Read Response)和写响应(Write Response)。对于读请求来说,读响应即返回响应的数据,而对于写请求来说,则视具体命令字而定,有的命令字支持回读状态以查询执行的情况,有的命令字则不支持回读状态。读响应和写响应,对Master来说,本质都是IIC/SMBUS Master read操作。其帧格式具体如下图所示:

其中响应数据(Data Byte1 ~ Data ByteN)帧格式数据结构定义如下:

Response Data Structure

Bytes

Name

1 ~ 2

error_code

错误码,详见“错误码定义”

3 ~ 4

opcode

命令字,详见“opcode定义”

5 ~ 8

total_length

opcode的数据总长度

9 ~ 12

length

数据区长度。本规范定义opcode的数据总长度固定。除最后一帧响应外,其它帧响应数据区长度都必须是Request Data中的length长度。

13 ~ N

data

数据区,根据实际数据长度返回。如果不是最后一帧,则返回对应offset开始的lenth字节。