N15 I²C(串行通信总线)

一、多路IO

红黑树(Red-Black Tree)是一种自平衡二叉搜索树(BST) ,通过5 条颜色性质 将树高控制在 O(log n) 量级,保证查找、插入、删除的时间复杂度稳定为 O(log n) 。相比 AVL 树,它平衡要求更宽松 ,插入 / 删除时旋转次数更少。

(内核链表核心)

内核list_head链表节点只存前后指针,不包含业务数据。要通过链表节点指针找回整个结构体指针

  • 已知 s2.list 是struct stu里的list成员指针
  • 用 &s1.list - &s1 = 24 得到偏移量
  • 那么 (struct stu *)((char *)&s2.list - 24) 就能得到 &s2,即从链表节点指针反推出父结构体指针

二、I²C:串行通信总线

cs 复制代码
        IOMUXC_SetPinMux(IOMUXC_UART4_RX_DATA_I2C1_SDA, 1);
        IOMUXC_SetPinMux(IOMUXC_UART4_TX_DATA_I2C1_SCL, 1);
        IOMUXC_SetPinConfig(IOMUXC_UART4_RX_DATA_I2C1_SDA, 0x98b0);
        IOMUXC_SetPinConfig(IOMUXC_UART4_TX_DATA_I2C1_SCL, 0x98b0);
  • 你把 SDA 设为输入 / 释放后,GPIO_DR 里的值永远是 1(你写的),完全反映不了从机拉低的 0 电平。
  • 只有 GPIO_PSR 会实时采样引脚的物理电压 :
    • 从机拉低 SDA → PSR 读到 0
    • 从机释放 SDA → PSR 读到 1
特性 开漏输出 (Open-Drain) 推挽输出 (Push-Pull)
输出结构 仅 N-MOS 下拉 N-MOS 下拉 + P-MOS 上拉
高电平 需外部上拉电阻 内部 P-MOS 主动拉高
低电平 内部 N-MOS 主动拉低 内部 N-MOS 主动拉低
高阻态 MOS 管关断时为高阻 无高阻态(始终输出高 / 低)
总线共享 支持 "线与",多设备并联安全 不支持,易短路冲突
电平兼容 可通过上拉电源实现电平转换 电平固定为 GPIO 电源电压

空闲时总线保持高电平

  • SCL(Serial Clock):串行时钟线,由主机驱动,同步所有设备的通信节奏。
  • SDA(Serial Data) :串行数据线,双向传输数据与地址,采用开漏输出设计,支持多设备共享。

不需要像UART那样通信时接地,一般情况已经共地了

ACK/NACK 的完整机制

I²C 通信中,发送方 在每发送完 8 位数据后,会主动检测第 9 位的 ACK/NCK 信号;接收方则在第 9 个时钟周期驱动 SDA 来发出应答。
时序:空闲时总线保持高电平

起始信号:SCL为高时,SDA由高到低

数据发送期间:SCL为低时,SDA可以跳变,SCL为高时,SDA保持不变(每次传输以8bit为

基本单位)

数据发送完成后,由接收方发出应答信号(1bit的低电平),如果没有应答,通信强制停止。

停止信号:SCL为高时,SDA由低到高。

1.通信只能由主机发起。

2.时钟线永远由主机控制。

3.数据线传输数据时由发送方控制,应答信号由接收方控制

------主机写数据控制数据位,从机控制应答

------主机读从机控制数据位,主机控制应答

4.主机第一次发送的数据永远是7位从机地址+1位的读写标志(0写 1读)。

IIC典型时钟频率:100K ; 400K ;3.4M (指的上限)

IIC从机访问:

向从机写数据:

1.向总线发送从机地址+写标志

2.向总线发送从机内寄存器地址(从机内寄存器首地址)

3.向总线发送需要写入的数据(可以循环写入多个数据,该地址为从机接收数据后存储的地址)

4.通信结束

向从机读取数据:

1.向总线发送从机地址+写标志

2.向总线发送从机内寄存器地址(从机内寄存器首地址,该地址为从机向主机发送数据的地址)

3.主机重新发起通信,向总线写从机地址+读标志

4.主机读取数据(可循环读取)----最后一个字节接收完成后应该发送一个NCK信号

5.通信停止

必须先等待stop信号,然后读数据。

需要先产生stop信号再读数据,如果先goto的话读不到最后一个字节。

相关推荐
h_a_o777oah13 小时前
【树论】树链剖分:将树形结构转化为线性结构以处理树上路径问题(洛谷 P3384 附C++代码模板)
数据结构·算法·线段树·acm·树链剖分·树论·重链剖分
HEJOO913 小时前
指针的算术运算详解
java·数据结构·算法
Coder-magician13 小时前
《代码随想录》刷题打卡day47:并查集-part01
数据结构·算法·图论
垆边人似月.14 小时前
VLAN 资源池(100~200 分档)
数据结构·算法
程序员清风15 小时前
算法与数据结构入门:复杂度、数组与链表
数据结构·算法·链表
Logic10118 小时前
C语言/数据结构排序题解:三个数的最大乘积——排序后比较两种候选情况
c语言·数据结构·数组·排序·时间复杂度·算法题·负数处理
殷色玫瑰19 小时前
C++ string类详解:常用接口、字符串操作与模拟实现
java·linux·c语言·开发语言·数据结构·c++
写后端的胖头鱼21 小时前
时间复杂度 & 空间复杂度
java·数据结构·算法·时间复杂度·空间复杂度
多弗朗皮卡丘21 小时前
数据结构番外:环形队列
数据结构·c
50万马克的面包1 天前
顺序表和链表_精华知识点_CSDN博客
数据结构·链表