IIC 简单操作介绍

以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, offset Addr, offset Addr Len, Write Data Buffer, Write Data Buffer Len.
发送从机地址,发送子地址,发送要写的数据
START 写 写 写 STOP


综合操作为基本操作的有序组合。函数的调用流程即为此。
数据结构的抽象可以采用结构体来管理。

你可能感兴趣的:(杂项)