1683|0

1704

帖子

0

TA的资源

五彩晶圆(初级)

楼主
 

MSP430学习的第一个模拟I2C程序 [复制链接]

#include <msp430.h>
unsigned char I2CBUF;
unsigned char checkbit;
#define SCL_H   (P10OUT |= BIT2)      // P10.2为SCL
#define SCL_L   (P10OUT &= ~BIT2)
#define SDA_H   (P10OUT |= BIT1)     //p10.1为SDA
#define SDA_L   (P10OUT &= ~BIT1)
#define SDA_OUT  (P10DIR |= BIT1)
#define SDA_IN  (P10DIR &= ~ BIT1)
void I2C_Start(void)    //I2C开始信号
{
 SDA_OUT;
 SCL_L;
 SDA_H;
 __delay_cycles(5);
 SCL_H;
 __delay_cycles(5);
 SDA_L;
 __delay_cycles(5);
 SCL_L;
 __delay_cycles(5);
}
unsigned char testACK(void) {
 SDA_IN;
 __delay_cycles(5);
 SCL_H;
 __delay_cycles(5);
 checkbit = (P10IN & BIT1) >> 4;
 __delay_cycles(5);
 SCL_L;
 __delay_cycles(5);
 return (checkbit);
}
void I2C_ACK(void)                //应答信号
{
 SDA_OUT;
 SCL_L;
 SDA_L;
 __delay_cycles(5);
 SCL_H;
 __delay_cycles(5);
 SCL_L;
 __delay_cycles(5);
 SDA_H;
}
void I2C_NACK(void) {
 SDA_OUT;
 SDA_H;
 __delay_cycles(5);
 SCL_H;
 __delay_cycles(5);
 SCL_L;
 __delay_cycles(5);
}
void I2C_STOP(void)             //产生结束信号
{
 SCL_L;
 __delay_cycles(5);
 SDA_L;
 __delay_cycles(5);
 SCL_H;
 __delay_cycles(5);
 SDA_H;
 __delay_cycles(5);
}
void I2C_WRITE(unsigned char data)
{
 SDA_OUT;
 unsigned char i;
 for (i = 8; i > 0; i--)      //高位循环8次,发送1个字节数据
    {
  if (data & 0x80)   //判断数据高位是0还是1
     {
   SDA_H;           //高位数据写1
  }
  else
  {
   SDA_L;
  }
  SCL_H;
  __delay_cycles(5);  //发送数据
  SCL_L;
  __delay_cycles(5);
  data <<= 1;

 }
}
unsigned char I2C_READ(void)
{
 unsigned char j;
 unsigned char BUFFER = 0X00;
 SDA_IN;
 for (j = 8; j >0; j--)      //高位循环8次,发送1个字节数据
    {
  SCL_H;
  __delay_cycles(5);
  BUFFER <<= 1;
  if ((P10IN & BIT1) == BIT1)   //判断数据高位是0还是1
  {
   BUFFER |= 0X01;         //高位数据写1
  }
  else
  {
   BUFFER |= 0XFE;
  }
  __delay_cycles(5);  //发送数据
  SCL_L;
  __delay_cycles(5);
 }
 return BUFFER;
}
void C16_WRITEDATA(unsigned char address, unsigned char DATA)
{
 I2C_Start();
 I2C_WRITE(address);
 testACK();
 I2C_ACK();
 I2C_WRITE(0x00);
 testACK();
 I2C_ACK();
 I2C_WRITE(DATA);
 I2C_STOP();
}
unsigned char C16_READEDATA(unsigned char address)
{
 unsigned char READDATA;
 I2C_Start();
 I2C_WRITE(0XA1);
 testACK();
 I2C_ACK();
 I2C_WRITE(address);
 I2C_Start();
 testACK();
 I2C_ACK();
 I2C_WRITE(0XA1);
 READDATA = I2C_READ();
 I2C_STOP();
 return READDATA;
}
int main(void)
{
    const int DATA = 0X88;
 unsigned char READBUFFER;
 WDTCTL = WDTPW + WDTHOLD;
 P10DIR |= BIT1 + BIT2;
 P2DIR |= BIT0;
 P2OUT &= ~BIT0;
 C16_WRITEDATA(0X00, DATA);
 __delay_cycles(5);
 READBUFFER = C16_READEDATA(0X00);
 while (1)
 {
  if (READBUFFER == 0X88)
  {
   P2OUT |= BIT0;
  } else {
   P2OUT &= ~ BIT0;
  }
  __delay_cycles(15);
 }
}

 
点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

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