硬件实现I2C协议 (主机传输)
- 设备默认是
Slave
, 某个设备产生一个Start
, 就成了Master
.
- 检查总线是否空闲:
SR2->BUSY == 0
继续; - 生成
Start
信号; - 检查是否
Start
成功:SR1->SB == 1
继续.
Master
广播地址 (8 bit
):7 bit
地址 +1 bit
模式 (LSB
, \(R / \bar{W}\)).
- 广播地址,无需检查
SR1->TxE
(此时仍为0
); - 检查是否有从机回应 (地址匹配):
SR1->ADDR == 1
继续 (地址匹配的从机). 此时,SR1->TxE
为1
,SR1->BTF
为0
(第一次传输数据为地址, 不会改变BTF
); - 先后访问
SR1
和SR2
, 清零SR1->ADDR
; 否则, 之后传输了非地址数据, 也不会将SR1->BTF
置一.
- 传输数据
- 检查数据寄存器是否为空:
SR1->TxE == 1
继续; - 写入数据;
- 如果需要连续传输数据, 重复上两步;
- 确保最后一个字节也发送成功 (可在结束通讯前判断):
SR1->BTF == 1
继续.
- 产生
Stop
信号, 结束通讯
- 检查传输是否完成 (最后一个字节也传输完成):
SR1->BTF == 1
继续; - 如果仅传输了地址, 未传输过非地址数据,
SR1->BTF
仍为0
, 无需检查; - 生成
Stop
信号.
END