历史上的今天
返回首页

历史上的今天

今天是:2025年03月12日(星期三)

正在发生

2018年03月12日 | HOLTEK 主I2C的源程序代码

2018-03-12 来源:eefocus

HOLTEK 主I2C的源程序代码

调用的代码
            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++)
     {
     }
 }


推荐阅读

史海拾趣

Glow-Lite Corp公司的发展小趣事

对于红外遥控发射电路,网友可能会有多方面的问题。以下是一些可能的问题及其详细回答:

一、红外遥控发射电路的基本工作原理是什么?

回答
红外遥控发射电路的基本工作原理是,当用户按下遥控器上的某个按键时,遥控器内部的微控制器(CPU)会读取与该按键对应的二进制数据,并通过信号调理电路进行处理。随后,这些数据被调制电路转换为适合传输的信号,并经过放大后,由红外线发射二极管以红外光的形式发射出去。接收设备上的红外接收头接收到这些红外光信号后,会将其转换为电信号,并经过进一步的处理还原为原始的控制指令,从而实现遥控功能。

二、红外遥控发射电路常见的故障有哪些?

回答
红外遥控发射电路常见的故障主要包括以下几个方面:

  1. 电池电量不足或接触不良:这是最常见的故障之一,当电池电量不足或电池卡簧接触不良时,会导致遥控器无法正常工作。

  2. 按键故障:按键上的导电橡胶易磨损、老化,或按键电路中的铜箔线条断裂、开焊等,都会导致按键失灵。

  3. 振荡电路故障:振荡电路中的陶瓷谐振器易受到机械冲击而损坏,导致振荡频率偏移或停振,进而影响遥控信号的发射。

  4. 红外发光二极管故障:红外发光二极管可能因引脚开焊、内部开路或失效等原因而无法正常工作。

  5. 驱动电路故障:驱动电路中的晶体三极管、电阻等元件可能因开路、放大系数下降等原因导致故障。

  6. 编码集成电路故障:编码集成电路是整个遥控器的核心部分,其内部集成了多个复杂的电路。如果编码集成电路发生故障,将直接影响遥控信号的生成和发射。

三、如何判断红外遥控发射电路是否故障?

回答
判断红外遥控发射电路是否故障,可以采用以下几种方法:

  1. 观察指示灯:如果遥控器上有指示灯,可以通过观察指示灯是否闪亮来判断遥控器是否有红外信号发射。

  2. 替换法:用一个确认无故障的遥控器去控制同一台设备,如果控制有效,则说明原遥控器可能存在故障。

  3. 万用表检测:使用万用表测量遥控器电池电压、按键电阻、红外发光二极管两端电压等,以判断电路是否正常。

  4. 收音机检测:利用收音机的中频载波与遥控器振荡频率接近的特点,通过收音机接收遥控器发出的信号来判断遥控器是否具有发射能力。

四、如何维修红外遥控发射电路的故障?

回答
维修红外遥控发射电路的故障,需要根据具体的故障原因采取相应的措施。以下是一些常见的维修方法:

  1. 更换电池:如果电池电量不足或接触不良,应更换新电池或清理电池卡簧。

  2. 清洁按键:如果按键故障是由于导电橡胶磨损或灰尘等杂物造成的,可以用软布蘸无水酒精清洗按键表面。

  3. 更换元件:如果振荡电路、红外发光二极管、驱动电路或编码集成电路等元件损坏,应更换相应的元件。

  4. 焊接修复:如果电路中存在开焊、断裂等现象,应使用焊接工具进行修复。

  5. 调整电路:如果故障是由于电路参数设置不当或元件老化等原因造成的,应对电路进行调整或更换老化元件。

通过以上方法,可以有效地解决红外遥控发射电路中的常见故障。

GCi Technologies公司的发展小趣事
使用定时器设置所需的充电时间。
Belkin公司的发展小趣事

在发展过程中,贝尔金也通过收购其他公司来增强自身实力。例如,2013年贝尔金正式完成对Linksys的收购,这一举措进一步丰富了其产品线,并加强了在网络设备领域的竞争力。此外,贝尔金还通过不断整合内部资源,优化生产流程,提高产品质量和效率。

Gilway Technical Lamp公司的发展小趣事
如果确认压缩机损坏且无法修复,需要更换新的压缩机。在更换过程中,需要注意选择与冰箱型号相匹配的压缩机,并确保正确安装和连接。
ELANTEC (Renesas )公司的发展小趣事

近年来,随着全球半导体市场的不断变化和技术的快速发展,Renesas也面临着一些挑战。为了应对这些挑战并保持竞争力,Renesas开始进行战略转型和结构调整。公司加强了与客户的合作和沟通,深入了解市场需求和趋势;同时,Renesas还加大了对新技术和新产品的研发投入,不断提升自身的技术实力和创新能力。此外,Renesas还注重人才培养和引进,打造了一支高素质、专业化的团队。这些措施的实施使Renesas在应对挑战和转型过程中取得了积极的成效。

DILABS公司的发展小趣事

面对数字化浪潮的冲击,DILABS积极拥抱变革。他们加大了对人工智能、物联网等前沿技术的研发投入,推动公司向数字化转型。同时,DILABS还积极参与行业标准的制定和推广工作,为电子行业的未来发展贡献自己的力量。展望未来,DILABS将继续秉承创新、品质、环保和数字化的理念,为全球客户提供更加优质、高效的电子产品和服务。

问答坊 | AI 解惑

急需,ADC0832 DIP8的资料!!

急需,ADC0832 DIP8的资料!!急需,ADC0832 DIP8的资料!!急需,ADC0832 DIP8的资料!!急需,ADC0832 DIP8的资料!!急需,ADC0832 DIP8的资料!!急需,ADC0832 DIP8的资料!!急需,ADC0832 DIP8的资料!!急需,ADC0832 DIP8的资料!!…

查看全部问答>

从外形辨别电容种类的困惑(checked)

本帖最后由 辛昕 于 2018-4-8 23:03 编辑 说起来,有一句俗话形容这种想法特别合适: 海不可斗量,人不可貌相。 难道不是吗? 那时候见到的东西其实还少。 否则我后来怎么会见过 长得很像金属轴对称式的电容,电感呢? 甚至,我还见过长得 ...…

查看全部问答>

MCF52233_GPT

 呵呵,我们的Freescale。终于有Freescale的版块了,现在把以前写的一些东西转过来,希望能有更多人的关注Freescale。 MCF52233_GPT—General Purpose Time Module    今天嘛——给介绍下Coldfire的GPT这个模块.在调这块的时候碰到 ...…

查看全部问答>

实用信号源

本帖最后由 paulhyde 于 2014-9-15 09:38 编辑 实用信号源  可以做出来的  程序和硬件  …

查看全部问答>

请在CE下用过SQLite的兄弟们看一下.关于发布SQLite的问题.都要做哪些准备工作啊?

小弟是第一次接触CE的东西.请大家帮帮忙. 程序代码如下,在WinForm的工程下可以运行.我就把代码复制到WINCE下的项目里了. 也添加了引用. 编译成功后,我将exe文件 数据库 和SQLite3.dll 一起复制到了PDA上. SQLite3.dll 放到了Windows下了. 运行e ...…

查看全部问答>

无线点菜宝是用什么开发的?用的什么芯片呢?

无线点菜宝是用什么开发的?用的什么芯片呢?  它支持WIFI的 …

查看全部问答>

EVC 上如何建立一个多播SOCKET

如题,         WSAPROTOCOL_INFO wsa_info;         wsa_info.dwServiceFlags1=XP1_SUPPORT_MULTIPOINT;         wsa_info.dwCatalogEntryId=0;       ...…

查看全部问答>

第一次做工控,请教wincc里面怎么写脚本设置控件的tag值

如题,即用vbs动态设置tag。查了半天没有看到控件的tag属性,不知道编程咋个实现,请给个代码,谢…

查看全部问答>