以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
综合操作为基本操作的有序组合。函数的调用流程即为此。
数据结构的抽象可以采用结构体来管理。
初始化动作
{
取消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
综合操作为基本操作的有序组合。函数的调用流程即为此。
数据结构的抽象可以采用结构体来管理。