本卡的SMBUS接口由板卡的MCU实现,MCU的SMBUS Slave Address为0xD4,即0x6A(7位地址)。
针对BMC而言,作为Master读写流程如下:
一次完整的交互可以分为两步:
本通信协议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,数据结构定义详见命令格式。
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 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字节。 |