差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录前一修订版
后一修订版
前一修订版
stm32:i2c [2024/12/23 11:27] laythystm32:i2c [2024/12/23 12:23] (当前版本) laythy
行 1: 行 1:
-I2C硬件:\\+⓵ -- I2C硬件:\\
 {{ :stm32:i2c.jpeg?600|}} {{ :stm32:i2c.jpeg?600|}}
 {{ :stm32:i2chardware.jpeg?600|}} {{ :stm32:i2chardware.jpeg?600|}}
行 14: 行 14:
 因此,把AT24C02的A0、A1、A2都接低电平时,它的I2C写地址为0xA0,读地址为0xA1。</code> 因此,把AT24C02的A0、A1、A2都接低电平时,它的I2C写地址为0xA0,读地址为0xA1。</code>
  
-**I2C软件(时序基本单元):**\\+**⓶ -- I2C软件(时序基本单元):**\\
 【写在前面】为了学习和基本单元的拼接方便,现规定除了起始和终止条件,所有基本单元的SCL都以低电平开始。实线代表主机控制,虚线代表从机控制。\\ 【写在前面】为了学习和基本单元的拼接方便,现规定除了起始和终止条件,所有基本单元的SCL都以低电平开始。实线代表主机控制,虚线代表从机控制。\\
-**起始:**SCL为高时SDA下降沿。\\+**起始:**SCL为高时SDA下降沿。(在后面“指定地址读”可以看出,起始的本质是切换读写状态)\\
 **终止:**SCL为高时SDA上升沿。\\ **终止:**SCL为高时SDA上升沿。\\
 {{ :stm32:startandstop.jpeg?600|}} {{ :stm32:startandstop.jpeg?600|}}
行 28: 行 28:
 {{ :stm32:i2csendackandreceiveack.jpeg?600|}} {{ :stm32:i2csendackandreceiveack.jpeg?600|}}
  
-**拼接6块基本数据单元拼图,组成一帧完整数据帧:**\\ +**⓷ -- 拼接6块基本数据单元拼图,组成一帧完整数据帧:**\\ 
-I2C协议规定,发送的第一字节为硬件地址,而后由芯片厂商自定,一般是寄存器地址或操作指。\\ +I2C协议规定,发送的第一字节为硬件地址,而后由芯片厂商自定,一般是寄存器地址或指令控制字。\\ 
-{{ :stm32:i2coneframeactualwaveform.png?800|}}+下面数据帧的详解看B站江科大stm32入门视频的[10-1]节00:35:18。\\ 
 +**指定地址写:**\\ 
 +{{ :stm32:i2cspecificaddrwrite.jpeg?600|}} 
 +**当前地址读:**\\ 
 +I2C协议规定,一旦起始第一个字节最后一位为读,那么紧跟着下一字节数据就是从机发数据主机接收,没有时间给主机发送“指定地址”的时间。而从机读的数据就是当前地址指针的数据。\\ 
 +当前地址指针:AT24C02每次上电后初始化为0,之后每一次读或写操作都会+1。\\ 
 +{{ :stm32:i2ccurrentaddrread.jpeg?600|}} 
 +**定地址读:**\\ 
 +指定地址读是一种复合格式,前半部分为指定地址写,后半部分是当前地址读。下面的(->P)表示前半部分可停可不停,官方推荐不停。\\ 
 +前半部分依次是:S->[ADDR+W]->RA->[REGADDR]->RA(->P),紧接着后半部分的:S->[ADDR+R]->RA->[DATA]->SA->P\\ 
 +执行完前半部分后当前地址指针就会变成其中的ADDR,然后后半部分当前地址读自然就输出指定地址的数据了。\\ 
 +{{ :stm32:i2cspecificaddrread.jpeg?800|}} 
 +记住,在进行读或写操作后,地址指针会自动+1。也就是说可以连续发送或接收多个字节数据。\\ 
 +连续写入多字节数据:在一字节写完后再发送n个字节,会依次存放到前一字节的后面。S->[ADDR+W]->RA->[REGADDR]->RA-[DATA]->RA-……->RA>P\\ 
 +连续读取多字节数据:S->[ADDR+R]->RA->[REGADDR]->SA-[DATA]->SA-……->NSA>P,注意读取最后一字节数据后要给非应答(NonSendAcknowledge)。\\