msp430——软件模拟II2C实例

发布者:DazzlingSmile最新更新时间:2018-05-03 来源: eefocus关键字:msp430  软件模拟II2C 手机看文章 扫描二维码
随时随地手机看文章
  1. #include  

  2. #define   SDA              BIT1  

  3. #define   SCL              BIT2  

  4.      

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

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

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

  8.  

  9. //0x0380---0x0400  

  10. __no_init char wokao@0x243;  

  11. //=============================  

  12.  char *send_ptr;  

  13.  char  DEVICE_ADR=0;  

  14.  char WORD_ADR=0;  

  15.  char  REC_DATA=0;  

  16.  char START_flag = 0;  

  17.  char STOP_flag = 0;  

  18.  char PreState = 0;  

  19.  char NowState = 0;  

  20. //*********************函数声明*************************************  

  21. void ACK(void);  

  22.  

  23. //****************************************************************  

  24. void main( void )  

  25. {  

  26.   // Stop watchdog timer to prevent time out reset  

  27.   WDTCTL = WDTPW + WDTHOLD;  

  28.    

  29.   //======================MCLK=16MHz=====================================  

  30.   DCOCTL = CALDCO_16MHZ;  

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

  32.  P3DIR &= ~(SDA+SCL);  

  33.   while(1)  

  34.   {  

  35.     NN=10;  

  36.     PreState = READ_SDA;  

  37.     while(READ_SCL && NN--)  

  38.     {      

  39.       NowState = READ_SDA;  

  40.       if(PreState && !NowState)  

  41.       {  

  42.         START_flag = 1;  

  43.         _DINT();  

  44.       }  

  45.       if(!PreState && NowState)  

  46.       {  

  47.         STOP_flag = 1;  

  48.         _EINT();  

  49.       }    

  50.       PreState = NowState;  

  51.       if(START_flag)  

  52.       {  

  53.         START_flag=0;  

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

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

  56.         {  

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

  58.            

  59.           DEVICE_ADR<<=1;  

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

  61.             DEVICE_ADR |= 0x01;  

  62.            

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

  64.         }  

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

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

  67.           

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

  69.         {  

  70.           while(!READ_SCL);  

  71.            

  72.           WORD_ADR<<=1;  

  73.           if(READ_SDA)  

  74.             WORD_ADR |= 0x01;  

  75.            

  76.           while(READ_SCL);  

  77.         }      

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

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

  80.           

  81.           

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

  83.         {  

  84.           if(DEVICE_ADR==SEG_A+0x01)  

  85.           {  

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

  87.           }  

  88.           else if(DEVICE_ADR==SEG_B+0x01)  

  89.           {  

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

  91.           }  

  92.           else if(DEVICE_ADR==SEG_C+0x01)  

  93.           {  

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

  95.           }  

  96.            

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

  98.            

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

  100.           {  

  101.             while(!READ_SCL);  

  102.             if( *send_ptr & 0x80)  

  103.               _NOP();  

  104.             else  

  105.             {  

  106.               P3DIR |= SDA;     //输出0  

  107.             }  

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

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

  110.             *send_ptr <<=1;  

  111.           }  

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

  113.           _NOP();  

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

  115.         }  

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

  117.         {  

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

  119.           {  

  120.             while(!READ_SCL);  

  121.              

  122.             REC_DATA <<=1;  

  123.             if(READ_SDA)  

  124.               REC_DATA |= 0x01;  

  125.              

  126.             while(READ_SCL);  

  127.           }  

  128.           if(DEVICE_ADR==SEG_A)  

  129.           {  

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

  131.             *send_ptr = REC_DATA;  

  132.           }  

  133.           else if(DEVICE_ADR==SEG_B)  

  134.           {  

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

  136.             *send_ptr = REC_DATA;  

  137.           }  

  138.           else if(DEVICE_ADR==SEG_C)  

  139.           {  

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

  141.             *send_ptr = REC_DATA;  

  142.           }  

  143.           ACK();    

  144.           _NOP();  

  145.           while(!READ_SCL);  

  146.         }  

  147.       }// if(START_flag)  

  148.        

  149.     }//while(NN--)  

  150.     _EINT();  

  151.     _NOP();  

  152.   }//while(1)  

  153. }  

  154. //****************************************************  

  155. void ACK(void)  

  156. {  

  157.   // while(READ_SCL);  

  158.   while(!READ_SCL);  

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

  160.   while(READ_SCL);    

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

  162. }  


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

上一篇:MSP430常见问题解答
下一篇:MSP430 使用一些理解

推荐阅读最新更新时间:2024-03-16 16:01

MSP430按键控制串口发送数据
#include msp430.h //MSP430G2553 - 使用USCI_A0,Up Mode, DCO SMCLK // // 介绍: 该程序利用USCI_A0来与计算机通信 通过接在P1.3口的按键来实现按一次发送一个数据 // 波特率9600,数据格式8N1 // // ACLK = 32768, SMCLK = 32768 MCLK = DCO-16M // // MSP430G2553 // ----------------- // /|\| XIN|- // | | | // --|RST XOUT|- // |
[单片机]
MSP430G2553测试程序(呼吸灯)
//****************************************************************************** //修改者 http://jiwm.blog.163.com //MSP430G2553 呼吸灯演示程序 - 使用Timer_A,Up Mode, DCO SMCLK // // 介绍: 该程序利用TIMER A 的 UP模式 在P1.6脚产生PWM输出 // 将CCR0设置为1500来定义PWM的周期,利用循环不断改变CCR1的值, // 实现利用改变PWM的占空比来改变LED亮度. // ACLK = na, SMCLK = MCLK = TACLK =
[单片机]
MSP430F5529 DriverLib 库函数学习笔记(六)定时器A产生PWM波
平台:Code Composer Studio 10.3.1 MSP430F5529 LaunchPad™ Development Kit (MSP‑EXP430F5529LP) 1.通过Timer_A_outputPWM配置产生PWM波 所选输出引脚为P1.2 初始化函数 #define TIMER_PERIOD 12500 void Timer_A_PWM_Init(void) { Timer_A_outputPWMParam htim = {0}; //P1.2复用输出 GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P1, GPIO_
[单片机]
<font color='red'>MSP430</font>F5529 DriverLib 库函数学习笔记(六)定时器A产生PWM波
MSP430 ADC12模块寄存器设置解读
一。简单介绍: ADC12模块中是由以下部分组成:输入的16路模拟开关(外部8路,内部4路),ADC内部电压参考源,ADC12内核,ADC时钟源部分,采集与保持/触发源部分,ADC数据输出部分,ADC控制寄存器等组成。 四种采样模式: (1)单通道单次转换模式 (2)序列通道单词转换模式 (3)单通道多次转换模式 (4)序列通道多次转换模式 个人觉得(3)模式应该是使用较多的, 对选定的通道进行多次转换,直到关闭该功能或ENC=0。进行如下设置: x=CSStartAdd,指向转换开始地址 ADC12MEMx存放转换结果 ADC12MCTLx寄存器中定义了通道和参考电压 在这种模式下,改变转换模式,不必先停止
[单片机]
<font color='red'>MSP430</font> ADC12模块寄存器设置解读
MSP430系统应用结构设计与选型
1 MSP430 简介 MSP430是TI公司推出的16位单片机系列产品,在电池供电的低功耗应用中具有独特的优势。其工作电压为1.8~3.6 V,正常工作时功耗可控制在200μA左右,低功耗模式可实现2μA甚至O.1μA的低功耗。MSP430系列单片机作为性能优异的MCU在中国已经得到了广泛的应用。MSP430具有高集成度,通常在单个芯片上集成了12位的A/D转换器、比较器、多个定时器,以及片内USART、看门狗、片内DCO等。一般单片就可满足大多数的应用需要。 MSP430单片机的程序存储器是Flash存储器,并且支持JTAG在线编程,可以方便地实现程序的下载、仿真、调试和升级。 目前整合性最好的MSP430F44X系列
[单片机]
MSP430F1612 第一个程序,点亮一个LED灯
I/O操作 MSP430有6组IO端口,其中P1和P2具有中断功能,其他端口不具备中断功能。而点亮一个LED灯只需要控制一个引脚的高低电平即可。这里不需要用到中断功能。那在这里,我们编码涉及的寄存器只有4个,分别是PxIN、PxOUT、PxDIR和PxSEL。而且MSP430F1612的IO功能并不需要配置时钟,所以整个程序只需要配置4个IO端口的寄存器和看门狗寄存器。 对4个寄存器的描述分别如下: PxSEL寄存器中的每一个位用于选择该引脚是使用外设功能还是GPIO功能. Bit = 0:选择IO功能;Bit = 1:选择外设功能 例如: P4SEL |= 0x0080; //P4.7选择外设功能,0000 0
[单片机]
<font color='red'>MSP430</font>F1612 第一个程序,点亮一个LED灯
基于MSP430单片机的PID参数整定仪
  PID控制是最常的控制策略,在工业过程控制中90%以上的控制回路具有PID结构。PID控制之所以被广泛应用主要是因为它算法简单,在实际中容易被理解和实现,而且许多高级控制都以PID控制为基础。但是由于环境的变化,使被控对象具有时变性,参数经过一段时间以后会出现性能欠佳、适应性变差、控制效果下降等情况。因此,寻求参数自动整定技术,以适应复杂工况及高性能指标的控制要求,是实现节能优化控制的重要手段,具有重大的工程实践意义。   1 自整定过程原理   本文主要研究了一种手持式的PID参数整定仪器,此整定仪具有整定单变量和双变量的双重功能,控制系统主要采用低能耗的MSP430微控制器,软件部分采用的软件开发平台是IAR MSP4
[单片机]
基于<font color='red'>MSP430</font>单片机的PID参数整定仪
msp430单片机18B20温度计
MSP 430 单片机 18B20温度计 #include msp430x22x4.h typedef unsigned char uchar; typedef unsigned int uint; #define DQ1 P2OUT |= BIT4 #define DQ0 P2OUT &= ~BIT4 #define DQ_in P2DIR &= ~BIT4 #define DQ_out P2DIR |= BIT4 #define DQ_val (P2IN & BIT4) double data; /******************************************* 函数名称:DelayNus 功
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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