历史上的今天
返回首页

历史上的今天

今天是:2025年01月20日(星期一)

正在发生

2020年01月20日 | msp430——软件模拟II2C实例

2020-01-20 来源:eefocus

#include   

#define   SDA              BIT1  

#define   SCL              BIT2  

     

#define  SEG_A  0xA0   //0x0200---0x027F    

#define  SEG_B  0xB0   //0x0280---0x02FF  

#define  SEG_C  0xC0   //0x0300---0x037F  

 

//0x0380---0x0400  

__no_init char wokao@0x243;  

//=============================  

 char *send_ptr;  

 char  DEVICE_ADR=0;  

 char WORD_ADR=0;  

 char  REC_DATA=0;  

 char START_flag = 0;  

 char STOP_flag = 0;  

 char PreState = 0;  

 char NowState = 0;  

//*********************函数声明*************************************  

void ACK(void);  

 

//****************************************************************  

void main( void )  

{  

  // Stop watchdog timer to prevent time out reset  

  WDTCTL = WDTPW + WDTHOLD;  

   

  //======================MCLK=16MHz=====================================  

  DCOCTL = CALDCO_16MHZ;  

  BCSCTL1 = CALBC1_16MHZ;    //MCLK=DCO=16MHz  

 P3DIR &= ~(SDA+SCL);  

  while(1)  

  {  

    NN=10;  

    PreState = READ_SDA;  

    while(READ_SCL && NN--)  

    {      

      NowState = READ_SDA;  

      if(PreState && !NowState)  

      {  

        START_flag = 1;  

        _DINT();  

      }  

      if(!PreState && NowState)  

      {  

        STOP_flag = 1;  

        _EINT();  

      }    

      PreState = NowState;  

      if(START_flag)  

      {  

        START_flag=0;  

        while(READ_SCL);          //START时的SCL高电平状态就等待  

        for(gg=8;gg>0;gg--)       //接收器件地址  

        {  

          while(!READ_SCL);       //SCL低电平状态就等待  

           

          DEVICE_ADR<<=1;  

          if(READ_SDA)            //数据的第一个CLK高电平来临  

            DEVICE_ADR |= 0x01;  

           

          while(READ_SCL);        //SCL高电平状态就等待  

        }  

        ACK();                    //对设备地址ACK应答信  

        //-----------以上收到了设备地址,并知晓主机要对从机进行读还是写操作---  

          

        for(gg=8;gg>0;gg--)       //接收内存单元地址  

        {  

          while(!READ_SCL);  

           

          WORD_ADR<<=1;  

          if(READ_SDA)  

            WORD_ADR |= 0x01;  

           

          while(READ_SCL);  

        }      

        //-----------以上就已经接收到内存单元地址------------  

        ACK();                  //对内存单元ACK应答信号  

          

          

        if(DEVICE_ADR & 0x01)     //从机发数据给主机  R/W=1  

        {  

          if(DEVICE_ADR==SEG_A+0x01)  

          {  

            send_ptr =(char*)(0x0200 + WORD_ADR);  

          }  

          else if(DEVICE_ADR==SEG_B+0x01)  

          {  

            send_ptr =(char*)(0x0280 + WORD_ADR);  

          }  

          else if(DEVICE_ADR==SEG_C+0x01)  

          {  

            send_ptr =(char*)(0x0300 + WORD_ADR);  

          }  

           

          //--------以上是判断出为主机读从机,要把要读的地址单元赋给指针---  

           

          for(gg=8;gg>0;gg--)  

          {  

            while(!READ_SCL);  

            if( *send_ptr & 0x80)  

              _NOP();  

            else  

            {  

              P3DIR |= SDA;     //输出0  

            }  

            while(READ_SCL);    //SCL为1,就保持SDA输出不变  

            P3DIR &= ~SDA;      //SCL为0,就把SDA从新切换到接收状态  

            *send_ptr <<=1;  

          }  

          ACK();                //从机数据发送完毕,应答信号  

          _NOP();  

          //------------------以上是从机发数据给主机-----------------  

        }  

        else  //主机写从机  R/W=0  

        {  

          for(gg=8;gg>0;gg--)     //接收主机要写到该器件内存单元的数据  

          {  

            while(!READ_SCL);  

             

            REC_DATA <<=1;  

            if(READ_SDA)  

              REC_DATA |= 0x01;  

             

            while(READ_SCL);  

          }  

          if(DEVICE_ADR==SEG_A)  

          {  

            send_ptr =(char*)(0x0200 + WORD_ADR);  

            *send_ptr = REC_DATA;  

          }  

          else if(DEVICE_ADR==SEG_B)  

          {  

            send_ptr =(char*)(0x0280 + WORD_ADR);  

            *send_ptr = REC_DATA;  

          }  

          else if(DEVICE_ADR==SEG_C)  

          {  

            send_ptr =(char*)(0x0300 + WORD_ADR);  

            *send_ptr = REC_DATA;  

          }  

          ACK();    

          _NOP();  

          while(!READ_SCL);  

        }  

      }// if(START_flag)  

       

    }//while(NN--)  

    _EINT();  

    _NOP();  

  }//while(1)  

}  

//****************************************************  

void ACK(void)  

{  

  // while(READ_SCL);  

  while(!READ_SCL);  

  P3DIR |= SDA;        //第9个CLK变高的情况下,SDA输出0  

  while(READ_SCL);    

  P3DIR &= ~SDA;       //第9个CLK变低的情况下,SDA输出1  

}

推荐阅读

史海拾趣

Hi-G Relays公司的发展小趣事

机顶盒,这一在现代家庭娱乐中扮演重要角色的设备,全称为数字视频变换盒,俗称“机顶盒”或“机上盒”。其专业性体现在作为连接电视与外部信号源的桥梁,能够接收并转换多种来源的数字电视信号,如有线电缆、卫星天线、宽带网络及地面广播,使之在电视机上得以播放。同时,机顶盒还具备强大的解码能力,能将复杂的数字信号转换成电视可识别的视频和音频流,确保用户享受到高清乃至超高清的视觉盛宴。

科普性方面,机顶盒不仅让传统模拟电视机焕发新生,通过数模转换技术,让观众能够观看到数字电视节目,更通过其丰富的增值服务,如电子节目指南、因特网网页浏览等,极大地丰富了电视观看体验。此外,机顶盒还具备网络交互功能,用户可通过其连接到互联网,享受在线购物、观看网络视频、玩游戏等多元化活动,使电视机从单向接收信息的设备转变为智能互动终端。

随着技术的不断进步,机顶盒的功能和应用场景也在不断扩展。从基本的电视观看,到家庭影院般的视听享受,再到智能语音控制、个性化节目推荐等智能化服务,机顶盒正逐步成为现代家庭娱乐不可或缺的一部分。未来,随着高清、超高清技术的普及以及人工智能、云计算等技术的应用,机顶盒将向更加智能化、多功能化的方向发展,为用户带来更加便捷、丰富的娱乐体验。

驰兴电感(Coilank)公司的发展小趣事

随着电子行业的快速发展,驰兴电感紧跟市场趋势,不断拓展产品应用领域。除了传统的消费电子和通讯领域外,驰兴电感还成功将产品应用于汽车电子、网络通讯、智能家居等新兴领域。这些领域的拓展不仅为公司带来了更广阔的市场空间,也进一步提升了驰兴电感在电子行业中的地位。

Emhiser Research Inc公司的发展小趣事

随着业务的不断发展,Emhiser Research开始实施国际化战略。公司首先在欧洲设立了研发中心和销售机构,随后又在美国和亚洲等地建立了分公司。这些分支机构不仅帮助公司更好地了解当地市场需求,也为公司拓展国际市场提供了有力支持。通过国际化战略的实施,Emhiser Research的产品逐渐打入了全球电子市场。

AR RF/Microwave Instrumentation公司的发展小趣事

随着科技的不断发展,AR RF/Microwave Instrumentation意识到要想在激烈的市场竞争中保持领先地位,必须不断进行技术创新。公司投入大量资源进行研发,成功推出了一系列具有创新性的产品,如宽带高功率放大器、固态射频放大器等。这些产品不仅性能卓越,而且能够满足不同客户的需求,进一步巩固了公司在行业内的地位。

客益(Guestgood)公司的发展小趣事

随着科技的不断发展,AR RF/Microwave Instrumentation意识到要想在激烈的市场竞争中保持领先地位,必须不断进行技术创新。公司投入大量资源进行研发,成功推出了一系列具有创新性的产品,如宽带高功率放大器、固态射频放大器等。这些产品不仅性能卓越,而且能够满足不同客户的需求,进一步巩固了公司在行业内的地位。

Dearborn Electronics Inc公司的发展小趣事

随着技术的不断进步,Dearborn Electronics Inc.不断投入研发,推出了一系列具有创新性的产品,如钽电容、陶瓷电容器等。这些产品以其卓越的性能和可靠性赢得了市场的广泛认可。同时,公司也积极拓展市场,将产品销售到全球各地,特别是医疗、石油、交通、工业等严苛应用领域。

问答坊 | AI 解惑

求教,vxworks读pci设备,还有其它

cpu为奔腾的,跑vxworks,版本是5.5, 因为项目需要,用fpga开发了一个pci接口的16路串口 在cpu对该串口进行读写的测试过程中,数据的正确性没问题 存在的问题是读pci口的速度太慢,每读一个32位双字,需要16个pci时钟周期 写pci口很快,一般3 ...…

查看全部问答>

有人了解Honeywell的软件吗?

如题,我遇到一个传输方面的问题了,希望做过honeywell的朋友帮下忙。…

查看全部问答>

wince gui移植 文字滚动问题

在gui移植的时候,原来的芯片是支持480*272的,现移植到支持800*480的芯片上,可以移植后一切正常,就是在超过480宽的像素位置之后,所有的字体都向左滚动,并且第一个字符不会显示,直接从第二个字符开始滚动,哪位高手知道这是为什么啊??…

查看全部问答>

求救!!那位高人认识这个文件是那家公司的FS文件系统和版本号?

以前我公司的一个工程师在基于ARM9 2410上面整合的UCOS II和FS文件系统,但所有系统文件的原码都已经打包,只留了个API接口集合的头文件(如下),里面没有任何公司和版本信息,现在要基于该系统平台开发一新系统,但没有详细的平台使用信息,感觉无从下手, ...…

查看全部问答>

LED半导体照明电源及控制电

replyreload += \',\' + 692905;作为一种新的光源,近年来各大公司和研究机构对LED电源和驱动电路的研究方兴未艾。与荧光灯的电子镇流器不同,LED驱动电路的主要功能是将交流电压转换为直流电压,并同时完成与LED的电压和电流的匹配。随着硅集成电 ...…

查看全部问答>

如何选择单片机芯片

如何选择单片机芯片 当我们自己想要设计一个简单的产品时,先要设计其电路图,我想请教一下大家,我该如何选择单片机芯片,单片机有如此多的系列,每个系列中有好多的型号。我该如何选择,有什么标准没有?…

查看全部问答>

再问 LM Flash Programmer

看到版主--永远的不知   回复的一个帖子,“ 您按照TI stellarisware里的boot_seral和boot_demo1例程下载试试,下载工具用lmflash programmer,下载这两个程序前,先把flash擦干净,先通过jtag下载boot_seral,再通过lmflash programmer选择 ...…

查看全部问答>

CC2538+CC2592 Contiki源代码的修改

请问各路大神,Contiki官方源码是针对于CC2538dk平台,没有加PA。我目前使用的板子是CC2538+CC2592,请问如何修改Contiki的代码?有没有人做过这方面的工作,望指点指点…

查看全部问答>

【TI C2000的使用经验】2806X产品说明书中致命错误

玩C2000产品也有好久了。现在呢能想到一点就写一点。论坛里最佩服的大哥dontium在写程序上确实给了我不少启示,略表感谢下~。 首先发上来的是我觉得最致命的错误。 SysCtrlRegs.EPWMCFG.bit.CONFIG = 1; 该寄存器在technical reference gu ...…

查看全部问答>