IIC 简单操作介绍
发布时间:2020-12-15 06:33:39 所属栏目:百科 来源:网络整理
导读:以CAT24CXX为例 初始化动作 { 取消SDA,SCL内部上拉 设置SDA,SCL为输出 拉高SDA 延时一定时间 拉高SCL } 空闲状态下SDA,SCL都为高 发送一个START状态 { 拉高SDA,延时 拉高SCL,延时 拉低SDA,延时 拉低SCL,延时 } 在SCL为高的时候让SDA产生一个下降沿 发送
以CAT24CXX为例 初始化动作 { 取消SDA,SCL内部上拉 设置SDA,SCL为输出 拉高SDA 延时一定时间 拉高SCL } 空闲状态下SDA,SCL都为高 发送一个START状态 { 拉高SDA,延时 拉高SCL,延时 拉低SDA,延时 拉低SCL,延时 } 在SCL为高的时候让SDA产生一个下降沿 发送一个STOP状态 { 拉低SDA,延时 拉高SCL,延时 拉高SDA,延时 } 在SCL为高的时候让SDA产生一个上升沿 获取IIC总线上的ACK信号 { 拉高SDA 设置SDA为输入,延时 拉高SCL,延时 读取SDA的数据 拉低SDA,延时 设置SDA为输出 可根据SDA的值为0或1进行返回 } 发送一个ACK { 设置SDA为输出 拉低SDA,延时 拉高SCL,延时 拉低SCL,延时 拉高SDA 设置SDA为输入,延时 } 在SCL脉冲期,保持SDA为低 发送一个NOACK { 拉高SDA,延时 拉高SCL,延时 拉低SCL,延时 拉高SDA 设置SDA为输入,延时 } 在SCL脉冲期,保持SDA为高 向总线上写数据 ?需要知道写入数据字节数和字节内容的起始地址 { 判断参数有效性 循环 字节数 次 ? ? 循环8次 每个字节有8bit 每次发送一个bit ? ? ? ? 判断bit值 ? ? ? ? ? ? 高 拉高SDA ? ? ? ? ? ? 低 拉低SDA ? ? ? ? 延迟 ? ? ? ? 拉高SCL,延时 ? ? ? ? 拉低SCL,延时 ? ? 8bit发送完毕,获取IIC总线上的ACK信号 如果是NOACK则函数返回 } 在总线上读取数据 需要知道要读的字节数和存放的缓冲区地址 { 判断参数有效性 拉高SDA 设置SDA为输入,延时 循环 字节数 次 ? ? 循环8次 每次读入1bit ? ? ? ? 拉高SCL,延时 ? ? ? ? 获取SDA值 ? ? ? ? 拉低SCL,延时 ? ? ? ? SDA值存入对应bit ? ? 如果读入次数还没到 ?发送ACK信号 ? ? 如果读入次数到了 ? ?发送NOACK信号 ? ? 将读入的缓冲区交给要存放的缓冲区,处理要处理的指针变量等 将SDA设置为输出 } 以上为IIC基本操作流程,下面简单说一下综合的操作流程 从某个Slave上读数据 { 产生START 发送Slave Addr,R/W位=0 表示写 判断发送成功否 发送要读取的Flash的偏移地址 片内offset 判断发送成功否 重启总线 发送START 发送Slave Addr, R/W位=1 表示读 读取需要的个数的数据 发送STOP 结束 } 可能需要的参数: Slave Addr,offset Addr,offset Addr Len,Read Data Buffer,Read Data Buffer Len. 发送了从机地址,发送了一个子地址,读取了数据 START 写 写 START 读 STOP 向某个Slave上写数据 { 产生START 发送Slave Addr R/W位=0 表示写 判断发送成功否 发送要写入的数据在Slave Flash中的地址 片内offset 判断发送成功否 发送数据 判断发送完 发送STOP 结束 } 可能需要的参数:Slave Addr,Write Data Buffer,Write Data Buffer Len. 发送从机地址,发送子地址,发送要写的数据 START 写 写 写 STOP 综合操作为基本操作的有序组合。函数的调用流程即为此。 数据结构的抽象可以采用结构体来管理。
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |