以文本方式查看主题

-  曙海教育集团论坛  (http://sun4.cn/bbs/index.asp)
--  单片机初中级  (http://sun4.cn/bbs/list.asp?boardid=55)
----  51读写IIC器件  (http://sun4.cn/bbs/dispbbs.asp?boardid=55&id=2212)

--  作者:wangxinxin
--  发布时间:2010-12-7 14:21:29
--  51读写IIC器件

这个是从我刚申请的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 时,还有个致命的小问题,书上有,给懒人留点发挥的空间吧,反正问题容易解决,只是完全不看书的话,一定出事而已