打印

MSP430模拟IIC总线程序

[复制链接]
1744|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lzlong|  楼主 | 2011-12-8 15:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
P4.7---SDA
P4.6---SCL
#include "msp430x44x.h"
#define SCL   0X40;
#define SDA   0X80;
#define Ram_addr 0x250;

int R_word;  
int Ack_Flag;

void Delay(int m)
{
   while(m-- > 0);
}

void Start(void)
{
  P4OUT = 0;
  P4DIR &= ~SCL;
  P4DIR &= ~SDA;//SET HIGH LEVEL
  P4DIR |= SDA;
  P4DIR |= SCL;
  
}

void Stop(void)
{
  P4DIR |= SDA;
  P4DIR &= ~SCL;
  P4DIR &= ~SDA;
  P4DIR |= SCL;
}


void Send_Byte(char Byte)
{
  int i;
  for (i=0;i<8;i++)
  {
    if(Byte & 0x80)
    {
      P4DIR &= ~SDA;
    }
    else
    {
      P4DIR |= SDA;
    }
    P4DIR &= ~SCL;
    Delay(50);
    P4DIR |= SCL;
   Byte = Byte << 1;
  }
}

void Ack(void)
{
  P4DIR &= ~SDA;
  P4DIR &= ~SCL;
  Ack_Flag = 0;
  Delay(10);
  if ((P4IN & 0x80))
  {
    Ack_Flag = 1;
  }
  P4DIR |= SCL;
  Delay(10);
}

void NOAck(void)
{
  P4DIR &= ~SDA;
  Delay(10);
  P4DIR &= ~SCL;
  Delay(10);
  P4DIR |= SCL;
  Delay(10);
  P4DIR |= SDA;
}

void Receive_Byte(void)
{

  int j;
  R_word = 0x00;
  P4DIR &= ~SDA;
  for(j=0;j<8;j++)
  {
    P4DIR &= ~SCL;
    if(P4IN & 0x80)
    {
      R_word |= 0x01;
    }
    else
    {
      R_word &= 0xFE;
    }
    //Delay(50);
    P4DIR |= SCL;
    R_word = R_word << 1;
   }
   R_word = R_word >>1;
}

void I2C_Write(int W_addr,int word)
{
  
  while (1)
  {
   
    Start();
    Delay(20);
    Send_Byte(0xA0);//write a byte :slave device
    Ack();
    if (Ack_Flag)
       continue;
    Send_Byte(W_addr);// write a byte :e2prom address
    Ack();
    if(Ack_Flag)
       continue;
   
    Send_Byte(word);
    Ack();
    if(!(Ack_Flag))
       break;
  }
  Stop();
  
}

void I2C_Random_Read(int R_addr)
{
  int *paddr;
  paddr = (int*)Ram_addr;
  while(1)
  {
    Start();
    Send_Byte(0xA0);
    Ack();
    if(Ack_Flag)
      continue;
    Send_Byte(R_addr);
    Ack();
    if(Ack_Flag)
      continue;
    Start();
   Send_Byte(0xA1);
    Ack();
   if(!Ack_Flag)
     break;
}
  Receive_Byte();
  *paddr = R_word;
  NOAck();
  Stop();

   
}

void main(void)
{
  P4DIR = 0XFF;
  WDTCTL = WDTHOLD+WDTPW;
  while(1)

  {
    I2C_Write(0x2A,0x10);
    Delay(500);
    I2C_Random_Read(0x2A);
   }
  
}

相关帖子

沙发
zhengbo7hui| | 2011-12-8 21:33 | 只看该作者
好东西,最近想做一个I2C的通信试验,收藏了,谢谢了。

使用特权

评论回复
板凳
tianm| | 2011-12-8 22:52 | 只看该作者
可以参考

使用特权

评论回复
地板
lzlong|  楼主 | 2011-12-9 10:12 | 只看该作者
谢楼主分享 楼主辛苦了

使用特权

评论回复
5
thlight| | 2011-12-13 14:13 | 只看该作者
谢楼主 分享了

使用特权

评论回复
6
sqcumt123| | 2011-12-15 09:36 | 只看该作者
楼主辛苦了,俺们一定好好学习一下

使用特权

评论回复
7
wdswds123| | 2013-5-21 10:26 | 只看该作者
很好,正在研究

使用特权

评论回复
8
smilingangel| | 2013-5-21 19:34 | 只看该作者
楼主的很强大的,谢谢啦。这个IIC总线的很不错的

使用特权

评论回复
9
jisjkla| | 2013-5-21 20:53 | 只看该作者
看不懂 研究下

使用特权

评论回复
10
leadman| | 2013-5-21 23:33 | 只看该作者
这MSP430模拟IIC总线程序想要看懂,得先了解i2c总线的协议

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

141

帖子

1

粉丝