msp430g2553硬件IIC

发布者:脑力激荡最新更新时间:2020-04-29 来源: eefocus关键字:msp430g2553  硬件IIC  从器件地址 手机看文章 扫描二维码
随时随地手机看文章

#include "msp430g2553.h"

#include "uart.h"


unsigned char RX_Data;

void I2C_Init(unsigned char SA);//I2C初始化,SA为从器件地址

void I2C_ReadData(unsigned char address);//I2C读出某一地址的数据

unsigned char I2C_WriteData(unsigned char address,unsigned char data);//I2C向某一地址写入数据

void delay(void);


void I2C_Init(unsigned char SA)

{

  P1SEL |= (BIT6 + BIT7);

  P1SEL2|= (BIT6 + BIT7); 

  UCB0CTL1 |= UCSWRST;                      // Enable SW reset 

  UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC;     // I2C Master, synchronous mode 

  UCB0CTL1 |= UCSSEL_2 + UCSWRST;            // Use SMCLK, keep SW reset 

  UCB0BR0 = 30;                             // fSCL = SMCLK/80 = ~100kHz 

  UCB0BR1 = 0; 

  UCB0CTL0 &= ~UCSLA10; // 7位地址模式

  UCB0I2CSA = SA;                         // Slave Address is 2ch 

  UCB0CTL1 &= ~UCSWRST;                     // Clear SW reset, resume operation 

  delay();

}


unsigned char I2C_WriteData(unsigned char address,unsigned char data)

{

    while( UCB0CTL1& UCTXSTP );

    UCB0CTL1 |= UCTR;                // 写模式  

    UCB0CTL1 |= UCTXSTT;             // 发送启动位  


    UCB0TXBUF = address;           // 发送字节地址  

    // 等待UCTXIFG=1与UCTXSTT=0 同时变化等待一个标志位即可  

    while((IFG2 & UCB0TXIFG)==0) 

    {  

        if( UCB0STAT& UCNACKIFG )      // 若无应答 UCNACKIFG=1  

        {  

            return 1;  

        }  

    }    


    UCB0TXBUF = data;          // 发送字节内容  

    while((IFG2 & UCB0TXIFG)==0);     // 等待UCTXIFG=1  


    UCB0CTL1 |= UCTXSTP;  

    while(UCB0CTL1& UCTXSTP);       // 等待发送完成  


    return 0;  

}


unsigned char I2C_WriteNData( unsigned char address, unsigned char *pWbuf, unsigned char len)  

    unsigned char i;    

  while( UCB0CTL1& UCTXSTP );  

  UCB0CTL1 |= UCTR;                // 写模式  

  UCB0CTL1 |= UCTXSTT;             // 发送启动位  


  UCB0TXBUF = address;           // 发送字节地址  

  // 等待UCTXIFG=1与UCTXSTT=0 同时变化等待一个标志位即可  

  while((IFG2 & UCB0TXIFG)==0) 

  {  

        if( UCB0STAT& UCNACKIFG )      // 若无应答 UCNACKIFG=1  

        {  

            return 1;  

        }  

  }    


  for( i= 0; i < len; i++)  

  {  

    UCB0TXBUF = *pWbuf++;      // 发送寄存器内容  

    while(UCB0CTL1& UCTXSTP);   // 等待UCTXIFG=1     

  }  


  UCB0CTL1 |= UCTXSTP;  

  while(UCB0CTL1& UCTXSTP);       // 等待发送完成  


  return 0;  

}  

void I2C_ReadData(unsigned char address)

{

    UCB0CTL1 |= UCTR ;

    UCB0CTL1 |= UCTXSTT;             // I2C TX, start condition 

    UCB0TXBUF = address;////eeprom low addr 

    while((IFG2 & UCB0TXIFG)==0); 

    UCB0CTL1 &= ~UCTR;             // I2C RX, 

    UCB0CTL1 |= UCTXSTT;   

    while(UCB0CTL1&UCTXSTT); 

    UCB0CTL1 |= UCTXSTP;

    while((IFG2&UCB0RXIFG)==0); 

    RX_Data = UCB0RXBUF; 

    while(UCB0CTL1 & UCTXSTP);

}



unsigned char  I2C_ReadNData(unsigned char address, unsigned char *pRead, unsigned char len )

{

    unsigned char i;

    while( UCB0CTL1& UCTXSTP );

    UCB0CTL1 |= UCTR; // 写模式

    UCB0CTL1 |= UCTXSTT; // 发送启动位和写控制字节

    UCB0TXBUF = address; // 发送字节地址

    // 等待UCTXIFG=1与UCTXSTT=0 同时变化等待一个标志位即可

    while((IFG2 & UCB0TXIFG)==0);

    UCB0CTL1 &= ~UCTR; // 读模式

    UCB0CTL1 |= UCTXSTT; // 发送启动位和读控制字节

    while(UCB0CTL1& UCTXSTT); // 等待UCTXSTT=0

    // 若无应答 UCNACKIFG = 1

    for( i= 0; i< len -1 ; i++)

    {

        while((IFG2&UCB0RXIFG)==0);  // 读取字节内容,不包括最后一个字节内容

        *pRead++= UCB0RXBUF;

    }

    UCB0CTL1 |= UCTXSTP; // 在接收最后一个字节之前发送停止位

    while((IFG2&UCB0RXIFG)==0); // 读取最后一个字节内容

    *pRead = UCB0RXBUF;

    while( UCB0CTL1& UCTXSTP );

    return 0;

}

void delay(void)

{

  unsigned int i,n;

  for(i=0;i<100;i++)

    for(n=0;n<0xff;n++);

}


int main( void )

{

    unsigned char ReadBuf[10];

    unsigned char temp = 1;

    // Stop watchdog timer to prevent time out reset

    WDTCTL = WDTPW + WDTHOLD;

    BCSCTL1=CALBC1_1MHZ;

    DCOCTL=CALDCO_1MHZ;

    Uart_Init();

    P1DIR |= BIT0;

    P1OUT |= BIT0;

    I2C_Init(0x51);//1010 000X>>1


    //I2C_WriteData(0x02,5);

    _EINT();

    //I2C_Init(0x51);//1010 000X>>1

    //I2C_ReadData(tUart.RecBuf[0]-0x30);

    while(1)

    {

        if(tUart.RecFlag)

        {

            tUart.RecFlag = 0;

            tUart.Len = 0; 


            //I2C_Init(0x51);//1010 000X>>1

            //I2C_ReadData(tUart.RecBuf[0]-0x30);

            I2C_WriteData(0x03,temp++);

            I2C_ReadNData(0x02, ReadBuf, 8 );

            UartSendStr(ReadBuf);

            //UartSendByte(RX_Data);

        }

    }

}


关键字:msp430g2553  硬件IIC  从器件地址 引用地址:msp430g2553硬件IIC

上一篇:MSP430FR2433 LaunchPad板子energy trace技术测量电流电压
下一篇:基于MSP430F149的超声波测距

推荐阅读最新更新时间:2024-11-22 11:49

MSP430G2553时钟外部晶振配置说明
摘要:关于MSP430G2553的时钟分类以及ACLK,MCLK和SMCLK的时钟源以下均不会做具体解释,在百度或者CSDN能搜到好多相关的说明文章。本文主要论证一下ACLK,MCLK和SMCLK可选作为时钟源的LFXT1CLK的频率是多少。在BAIDU以及TAOBAO中搜索不到下图电路板中的无源晶振,所以想要自己动手对其进行推导。(2553的技术文档介绍中该晶振为32kHz晶振) 主要思路: 配置相关时钟寄存器,将外部晶振LFXT1CLK作为SMCLK的时钟源,SMCLK作为定时器A的时钟源,配置定时器使相应引脚输出PWM波,根据PWM波的频率,最终推导出LFXT1CLK对应的外部无源晶振的频率。 小试牛刀 本步主要
[单片机]
<font color='red'>MSP430G2553</font>时钟外部晶振配置说明
stm32硬件i2c stm32硬件iic缺陷如何解决
STM32单片机具有IIC接口,IIC接口具有多主机功能、主设备功能、C地址检测、产生和检测7位/10位地址和广播呼叫和支持不同的通讯速度。 STM硬件I2C的状态标签如下: 发送器/接收器模式标志、字节发送结束标志、中先忙标志、错误标志 STM硬件有9个寄存器。 STM32硬件I2C的CLK在50kHz及以下情况下工作,短时间内不会出现任何情况下的卡住。 STM32硬件I2C的CLK在常用的100kHz和400kHz下工作,一小时内大概率出现卡住现象。 STM32硬件I2C的CLK在任何频率下工作,在读取或发送数据时不允许有其他中断事件干扰,否则将有卡住现象。 总的来说,STM32硬件I2C是个坑,对正常工作的环境要求非常高
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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