这个是从我刚申请的blog上 粘过来的,想大家共同提高,没给出完全的代码,自己动手吧
飞利浦(Philips)的IIC,物美价廉啊!才2条线搞定一切。不错、不错。所以,EEPROM呀,I/O扩展啊,什么A/D D/A啊,外加LED驱动、日历时钟芯片等等全用它。好多mcu自带IIC控制器,不过我们常玩的51系列不怎么咬它,还好对于主从固定的模式(51为主,其他IIC器件为从),我们可以用软件实现主对从的双向读写
如图 我们首先的 有 启动IIC器件的函数 start(),和停止IIC器件的函数 stop(),由于要对其进行写地址(SAR/W),和写寄存器地址,得有个写1字节的函数 write_byte(),然后就是连续写的函数write(),和连续读read(),外加2个检验是否听话的标志位 ack(),ACK,nck(),NCK。
好了,东西差不多了。我们来看看怎么写一字节进这个玩意去。
void write_byte(unsigned char money) //偶喜欢钱 就把money当要写进去的数吧
{
unsigned char i = 8; //每字节8位 么办法一个一个来
start(); //开始哦
do
{ //好了这里容易 自己去搞定吧 就是依次把移出的位 传给IIC器件吗
}while (i-- != 0)
SDA = 1; // 移完了 1字节 接着干吗?? 释放总线等 应答位啊
SCL = 1;
if (SDA = = 0) //应答那里来 SDA哦 SDA=0 为应答位 =1为非应答位
{
ack(); //返回有应答
}
else
{
nck(); //返回无应答
} ///////// 哦耶 我会写写IIC的程序了哦
}
好了 我们来个 在IIC器件m处连续写n个 在51中首地址为 k 的数
void write(unsigned char m,unsigned char k,unsigned char n)
{
start();
write_byte(SAW) ; //得让IIC知道你在写还是读那个IIC器件 所以的先写入个SAW
if (NCK) //这是个 对无应答的处理
{
}
write_byte(m) ; //往m处写吧
if (NCK) //这还是个对无应答的处理
{
}
do
{
//好了把51中从k开始的数用 write_byte() 一个一个的往IIC里扔吧
}
delay(); //给点时间让IIC去消化下 呵呵其实是 IIC页写功能要求的有点时间自己倒腾
}
连写的程序也过了 搞读吧 在IIC器件m处连续读n个数并把它们放在51中首地址为 k 的地方
void read(unsigned char m,unsigned char k,unsigned char n)
{
start();
write_byte(SAW) ; //读之前还有点东西要写 就是 m了
if (NCK) //这是个 对无应答的处理
{
}
write_byte(m) ; //去m处读,所以
if (NCK) //这还是个对无应答的处理
{
}
stop();
start();
write_byte(SAR) ; //真正的读开始了
// 接下来就是个 从SDA读n个数 每个数读8位的程序了
// 自己轻松搞定吧 快下班了 或者以后写吧
}
这个只要注意SAW、SAR 就能用在任意IIC了,但连读和连写 当n > 1 时,还有个致命的小问题,书上有,给懒人留点发挥的空间吧,反正问题容易解决,只是完全不看书的话,一定出事而已