首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

用s5pc100的GPIO模拟IIC(3)

用s5pc100的GPIO模拟IIC(3)

(6)获取从机给主机的ACK信号       

       

                                uint8 iic_get_ack()       
                        {       

                                                                        uint8 ret;               
       
                                                               
               

       
                                                                SCL = HIGH;               
       
                                                                delay(50);               
       
                                                               
               

       
                                                                ret = SDA;               
       
                                                               
               

       
                                                                SCL = LOW;               
       
                                                                delay(50);               
       
                                                               
               

       
                                                                return ret;               
       
                                }       


        四、读取LM75测量的温度值

        通过IIC读取LM75测量温度值的时序如下:



        实例代码如下:
       

                                unsigned int __read_lm75()       
                        {       

                                                                        uint8 ack;               
       

                                                                uint8 high,low;               
       

                       
       

                                                                //设置IIC连接的pin为输出模式               
       

                                                                SET_GPIO_MODE(GPD.GPDCON,3,1);               
       

                                                                SET_GPIO_MODE(GPD.GPDCON,4,1);               
       

                       
       

                                                                delay(100);               
       

                       
       

                                                                //产生起始信号               
       

                                                                iic_start();               
       

                       
       

                                                                //发送从机地址               
       

                                                                iic_write_byte(0x91);               
       

                       
       

                                                                //设置IIC连接的pin(SDA)为输入模式               
       

                                                                SET_GPIO_MODE(GPD.GPDCON,3,0);               
       

                       
       

                                                                //等待从机的ACK               
       

                                                                do{               
       

                                                                ack = iic_get_ack();               
       

                                                                }while(ack);               
       

                       
       

                                                                //读取从机发送过来的数据               
       

                                                                high = iic_read_byte();               
       

                       
       

                                                                //设置IIC连接的pin(SDA)为输出模式               
       

                                                                SET_GPIO_MODE(GPD.GPDCON,3,1);               
       

                       
       

                                                                //发送ACK信号               
       

                                                                iic_send_ack();               
       

                       
       

                                                                //设置IIC连接的pin(SDA)为输入模式               
       

                                                                SET_GPIO_MODE(GPD.GPDCON,3,0);               
       

                       
       

                                                                //读取从机发送过来的数据               
       

                                                                low = iic_read_byte();               
       

                       
       

                                                                //设置IIC连接的pin(SDA)为输出模式               
       

                                                                SET_GPIO_MODE(GPD.GPDCON,3,1);               
       

                       
       

                                                                //发送停止信号               
       

                                                                iic_stop();               
       

                       
       

                                                                return (high << 8) | low;               
       

                                }       
                       
       

                        实验的经验:       
                        1.读不到从机发送的ACK信号,原因是没有将SDA的那根线设为输入模式       
                        2.在做的过程中,一开始每次读取的时候温度的值一直没有改变,后来发现是由于每次没有发送停止信号产生的。        
继承事业,薪火相传
返回列表