当前位置:首页 > 单片机 > 单片机
[导读]HOLTEK 主I2C的源程序代码调用的代码 case C_READ+C_I2C: return_buf[2] = comm_buf[4]; // read(comm_buf[3],comm_buf[4],&return_buf[3]);

HOLTEKI2C的源程序代码

调用的代码
             case C_READ+C_I2C:
                 return_buf[2] = comm_buf[4];    //
                 read(comm_buf[3],comm_buf[4],&return_buf[3]);
                 break;
                
             case C_WRITE+C_I2C:
                 return_buf[2] = 0;
                 write(comm_buf[3],comm_buf[4],&comm_buf[5]);
                 break;

 


 主I2C的代码

 #define CHIP_ADDR 0x78

 unsigned char cread(uchar addr);
 void cwrite(uchar addr,uchar dat);
 void read(uchar addr, uchar num, uchar * buf);
 void write(uchar addr, uchar num,uchar * buf);
 void i2c_start(void);
 void i2c_stop(void);
 uchar WaitAck(void);
 void SendNotAck(void);
 void SendtAck(void);
 void delay_5us(void);
 void delay(unsigned char num);
 void i2c_writ2(unsigned char dat);
 uchar i2c_rea2(bit ack);


 /***********************************************
     总线启动函数
 ***********************************************/
 void i2c_start()
 {
     SCL=1;delay_5us();
     SDA=1;delay_5us();
     SDA=0;delay_5us();delay_5us();
     SCL=0;delay_5us();
 }

 /***********************************************
     总线停止函数
 ***********************************************/
 void i2c_stop()
 {
     SCL=0;
     SDA=0;delay_5us();
     SCL=1;delay_5us();
     SDA=1;delay_5us();
 }

 /***********************************************
     I2C总线发送数据时的ACK应答
 ***********************************************/
 uchar WaitAck(void)
 {
     uchar errtime=255;  //因故障接收方无ACK 超时值为255
     SDA=1 ;delay_5us();
     SCL=1 ;delay_5us();
     while(SDA)
     {
         if (--errtime == 0)
         {
             i2c_stop();
             return 0;
         }
     }
     SCL=0;
     return 1;
 }

 /***********************************************
     I2C总线接收数据时的NO ACK应答
 ***********************************************/
 void SendNotAck(void)
 {
     SDA=1 ;
     delay_5us();
     SCL=1 ;
     delay_5us();
     SCL=0;
 }

 /***********************************************
     I2C总线接收数据时的ACK应答
 ***********************************************/
 void SendtAck(void)
 {
     SDA=0 ;
     delay_5us();
     SCL=1 ;
     delay_5us();
     SCL=0;
 }

 /***********************************************
     写1个字节的函数
 ***********************************************/
 void i2c_writ2(uchar dat)
 {
     uchar i;
     for(i=0;i<8;i++)
     {
 //        SDA=1;
         if((dat&0x80)==0x00) SDA=0;
         else SDA=1;
         SCL=1;delay_5us();SCL=0;
         dat<<=1;
     }
     SDA=1;
     SCL=1;delay_5us();
     SCL=0;delay_5us();
 }
 

 /***********************************************
     读当前1字节数据函数
 ***********************************************/
 unsigned char cread(uchar addr)
 {
     unsigned char i;
     i2c_start();
     i2c_writ2(CHIP_ADDR);        // Write
     i2c_writ2(addr);
     i2c_start();                // Start
     i2c_writ2(CHIP_ADDR+1);        // Read
     i = i2c_rea2(0);
     i2c_stop();
     delay(10);
     return(i);
 }

 /***********************************************
     写当前1字节数据函数
 ***********************************************/
 void cwrite(uchar addr,uchar dat)
 {
     i2c_start();
     i2c_writ2(CHIP_ADDR);        // Write
     i2c_writ2(addr);
     i2c_writ2(dat);
     i2c_stop();
     delay(30);
 }

 /***********************************************
     读数据
 ***********************************************/
 void read(uchar addr, uchar num, uchar * buf)
 {
     i2c_start();
     i2c_writ2(CHIP_ADDR);        // Write
     i2c_writ2(addr);
     i2c_start();                // Start
     i2c_writ2(CHIP_ADDR+1);        // Read
     for( ; num>0 ; num--)        // 个数
     {
         *buf++ = i2c_rea2(1);    // 读
     }
     i2c_stop();
     delay(10);
 }

 /***********************************************
     写数据
 ***********************************************/
 void write(uchar addr, uchar num,uchar * buf)
 {
     i2c_start();
     i2c_writ2(CHIP_ADDR);        // Write
     i2c_writ2(addr);
     for( ; num>0 ; num--)        // 个数
     {
         i2c_writ2(*buf++);        // 写
     }
     i2c_stop();
     delay(30);
 }

 /***********************************************
     读1字节函数
 ***********************************************/
 uchar i2c_rea2(bit ack)
 {
     uchar i,j;
     j=0x00;
     SDA=1;
     for(i=0;i<8;i++)
     {
         SCL=1;
         j=j<<1;
         if(SDA) j|=0x01;
         SCL=0;delay_5us();
     }
     if(ack) SDA=0;
     SCL=1;delay_5us();
     SCL=0;delay_5us();
     return j;
 }

 /***********************************************
     延时程序
 ***********************************************/
 void delay_5us()
 {
     uchar i;
     //for(i=0;i<2;i++){}
     for(i=0;i<4;i++)
     {
     }
 }
 

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

SCL(serial clock):时钟线,传输CLK信号,一般是I2C主设备向从设备提供时钟的通道。

关键字: I2C 总线通信 时钟线

今天,小编将在这篇文章中为大家带来I2C总线的有关报道,通过阅读这篇文章,大家可以对它具备清晰的认识,主要内容如下。

关键字: I2C 总线

在这篇文章中,小编将对I2C总线的相关内容和情况加以介绍以帮助大家增进对它的了解程度,和小编一起来阅读以下内容吧。

关键字: I2C 总线

今天,小编将在这篇文章中为大家带来SPI总线和I2C总线的有关报道,通过阅读这篇文章,大家可以对二者具备清晰的认识,主要内容如下。

关键字: SPI I2C 总线

I2C总线将是下述内容的主要介绍对象,通过这篇文章,小编希望大家可以对它的相关情况以及信息有所认识和了解,详细内容如下。

关键字: I2C 总线

一直以来,I2C总线都是大家的关注焦点之一。因此针对大家的兴趣点所在,小编将为大家带来I2C总线的相关介绍,详细内容请看下文。

关键字: I2C 总线

本文中,小编将对I2C总线予以介绍,如果你想对它的详细情况有所认识,或者想要增进对它的了解程度,不妨请看以下内容哦。

关键字: I2C 总线

在这篇文章中,小编将为大家带来I2C总线的相关报道。如果你对本文即将要讲解的内容存在一定兴趣,不妨继续往下阅读哦。

关键字: I2C 总线

Holtek推出新一代Arm® Cortex®-M0+智能卡读卡器单片机,HT32F61141。最高运行速度为48MHz,工作电压为2.5V~5.5V,并符合-40℃~85℃工业温度范围。HT32F61141内建2个智能...

关键字: HOLTEK 读卡器 MCU

Holtek针对直流无刷电机控制领域,推出BLDC Flash MCU BD66FM5245,可支持方波与弦波控制。具备反电动势噪声抑制滤波器可使方波Sensorless启动或低速更加稳定,非常适合各种三相或单相BLDC...

关键字: HOLTEK MCU
关闭
关闭