msp430——软件模拟II2C实例

发布者:mmsg3814最新更新时间:2020-01-20 来源: eefocus关键字:msp430  软件模拟  II2C 手机看文章 扫描二维码
随时随地手机看文章

#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  

}

关键字:msp430  软件模拟  II2C 引用地址:msp430——软件模拟II2C实例

上一篇:MSP430 使用一些理解
下一篇:MSP430中断原理分析

推荐阅读最新更新时间:2024-11-10 10:50

MSP430 SPI接口DMA模式通信
因为在tinyos系统下,节点写flash的速度过慢,开始怀疑是不是SPI的速度有问题,所以后来就直接在IAR上裸机读写FLASH,看看速度可以去到多少。用到了430的SPI的DMA模式 DMA模式之所以会更快,是因为所要传输的数据省去了要经过CPU处理这一步,直接在内部总线传输到DMA寄存器,然后DMA寄存器在根据情况通过总线传输到目标寄存器。这里的总线,我也还没搞清楚。在DMA传输数据的时候,虽然说CPU可以继续干自己的活,但是如果CPU要使用总线的话,而总线被DMA占用了,这时候该怎么办? void SpiDmaSend(uint8_t cmd,uint8_t *tx_addr, uint8_t *rx_addr,u
[单片机]
基于MSP430F2012和nRF24L01的有源RFID标签的应用设计
1.引言 射频识别(RFID)技术是采用无线射频的方式实现双向数据交换并识别身份,RFID定位正是利用了这一识别特性,利用阅读器和标签之间的通信信号强度等参数进行空间的定位。 RFID标签按供电方式分为有源和无源2种 ,无源标签通过捕获阅读器发射的电磁波获取能量,具有成本低、尺寸小的优势;有源标签通常采用电池供电,具有通信距离远、读取速度快、可靠性好等优点 ,但为了满足煤矿井下定位,需要考虑低功耗设计以增强电池的续航能力。本文从有源标签的设计理念出发,针对小范围空间RFID定位的需求,根据低功耗、高效率的原则进行RFID标签的设计,并阐述了其硬件组成、软件流程和防冲突能力。 2.系统硬件设计 2.1 系统结构 有源标签在设计中除了
[电源管理]
基于<font color='red'>MSP430</font>F2012和nRF24L01的有源RFID标签的应用设计
基于MSP430F249的ADC7864触摸程序函数
这个例子是我参照51单片机的例子写的,测试过,能正常读取数据,没转换为坐标 使用的是中断法,下降沿促发 //文件名:tourch_screen.h //基于ADS7846的触摸屏程序 //宏定义:对管脚的定义 // #ifndef _touch_screen_h_ #define _touch_screen_h_ extern unsigned int x_zb,y_zb; //测的x,y坐标 //函数:Touch_Port_Ini() //描述:初始化触摸控制端口 //返回值:无 void Touch_Port_Ini(); //初始化端口 #endif //描述:管脚的宏定义 //
[单片机]
MSP430G2553测试程序(长短按键识别)
//原始状态P1.6亮,P1.0暗,利用状态机进行按键检测,短按键情况下并释放的瞬间P1.0翻转,P1.6翻转 //长按键P1.0,P1.6按照10Hz的频率闪烁 // MSP430G2xx3 // ----------------- // /|\| XIN|- // | | | // --|RST XOUT|- // P1.3|KEY P1.6|-- LED // | P1.0|-- LED // 作者 http://jiwm.blog.163.com // Built with IAR Embedded
[单片机]
基于MSP430的三相电能表SA9904B采集系统
本文介绍由TI公司的MSP430F435 单片机和SAMES 的SA9904B 电能测量集成芯片组合成三相电能表的无用功率和有用功率等参量的采集系统。 硬件部分 MSP430F435 T1 公司的MSP430 系列单片机是一种具有超低功耗的功能强大的单片机。新开发的F 系列具有Flash 存储器,在系统设计,开发调试及实际应用上比其他MCU 都有比较明显的优势。 1、超低功耗 MSP430F 系列运行在1MHZ 时钟的条件下时,工作模式不同为0.1~400uA,工作电压为1.8~3.6V。 2、 超强处理能力 8MIPS 的CPU 内核,16 位×16 位的硬件乘法器。 3、灵活的配置方法 MSP4
[单片机]
MSP430单片机经典下载电路
适用于大部分 F1系列 F2系列 F4系列等
[单片机]
电容触摸MSP430电路与LED驱动电路设计详解
  MSP430系列单片机以低功耗和外设模块的丰富性而著称,而针对电容触摸应用,MSP430的PIN RO 电容触摸检测方式支持IO口直接连接检测电极,不需要任何外围器件,极大的简化了 电路设计 ,而本设计文档中使用的MSP430G2XX5 更支持多达2个IO口,可驱动24个以上的LED灯,达到理想的显示效果。   电容触摸实现原理   MSP430根据型号的不同支持多种电容触摸检测方式,有RC 震荡、比较器、PIN RO,本设计使用的是PIN Relaxation Oscillator 方式,原理如图1,芯片管脚内部检测电路由施密特触发器、反向器,以及一个电阻组成,震荡信号经过施密特触发器变成脉冲信号,再通过反向器反馈回RC 电
[单片机]
电容触摸<font color='red'>MSP430</font>电路与LED驱动电路设计详解
MSP430单片机中断详解
中断是MSP430微处理器的一大特色,有效地利用中断可以简化程序和提高执行效率。MSP430的几乎每个外围模块都能够产生中断,为MSP430针对事件(即外围模块产生的中断)进行的编程打下基础。MSP430在没有事件发生时进入低功耗模式,事件发生时,通过中断唤醒CPU,事件处理完毕后,CPU再次进入低功耗状态。由于CPU的运算速度和退出低功耗的速度很快,所以在应用中,CPU大部分时间都处于低功耗状态。 MSP430的中断分为3种:系统复位、不可屏蔽中断、可屏蔽中断。 (1)系统复位的中断向量为0xFFFE。 (2)不可屏蔽中断的中断向量为0xFFFC。响应不可屏蔽中断时,硬件自动将OFIE、NMIE、ACCVIE复位。软
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved