PD3.0协议BMC编码具体实现
时间: 2023-07-13 13:24:35 浏览: 333
USB PD3.0 Spec
PD3.0协议中的BMC编码(Binary Marked Code)是一种将8位二进制数据转换为5位二进制数据的编码方式。它的主要作用是在传输数据时,通过将5位二进制数据作为传输单元,降低传输数据的错误率,提高传输的可靠性。
PD3.0协议中的BMC编码规则如下:
- 将8位二进制数据拆分为两组,每组4位。
- 对每组4位数据进行编码,得到两个5位的BMC编码数据。
- 将两个5位BMC编码数据拼接起来,得到一个10位的BMC编码数据。
- 重复上述步骤,直到所有的8位二进制数据都编码完成。
具体实现时,可以使用一个指针指向需要编码的数据,然后按照上述规则对每个8位二进制数据进行编码,并将编码后的数据存储到一个缓存区中。具体代码如下:
```c
uint8_t *pd30_bmc_encode(uint8_t *data, uint32_t len, uint8_t *bmc_data)
{
uint8_t *p = data;
uint8_t *q = bmc_data;
uint8_t cur_byte;
uint8_t cur_bit = 0;
for (uint32_t i = 0; i < len; i++) {
// 拆分8位二进制数据为两组4位
uint8_t high = (*p) >> 4;
uint8_t low = (*p) & 0x0F;
// 对每组4位数据进行编码
cur_byte = 0;
for (uint8_t j = 0; j < 4; j++) {
if ((high & (1 << j)) != 0) {
cur_byte |= (1 << cur_bit);
}
if (++cur_bit == 5) {
*q++ = cur_byte;
cur_byte = 0;
cur_bit = 0;
}
}
for (uint8_t j = 0; j < 4; j++) {
if ((low & (1 << j)) != 0) {
cur_byte |= (1 << cur_bit);
}
if (++cur_bit == 5) {
*q++ = cur_byte;
cur_byte = 0;
cur_bit = 0;
}
}
p++;
}
// 处理最后一个不足5位的BMC编码数据
if (cur_bit > 0) {
cur_byte <<= (5 - cur_bit);
*q++ = cur_byte;
}
return q;
}
```
这段代码中,参数data是需要编码的数据,len是数据的长度,bmc_data是存储编码后数据的缓存区。函数返回值是编码后数据的结束地址。
需要注意的是,在编码完成后,如果最后一个BMC编码数据不足5位,需要在末尾补0,使其成为一个完整的5位BMC编码数据。
另外,PD3.0协议中还定义了一些特殊的BMC编码规则,例如掩码编码、ID编码等,需要根据具体的协议规范进行实现。
阅读全文