打印
[MCU]

谁做过用MSP430F249的I2C模块与24CXX连接

[复制链接]
1300|29
手机看帖
扫描二维码
随时随地手机跟帖
楼主
zhanglli| | 2020-6-21 20:54 | 显示全部楼层 回帖奖励 |倒序浏览

#include <msp430x14x.h>
#include"string.h"
#define SDA_1 P1OUT |= BIT3
#define SDA_0 P1OUT &= ~BIT3
#define SCL_1 P1OUT |= BIT2
#define SCL_0 P1OUT &= ~BIT2
#define SDA_out P1DIR |=BIT3
#define SDA_in P1DIR &= ~BIT3
unsigned char Readword[12];
void init_clk(void)
{
    unsigned char j;
    BCSCTL1&= ~XT2OFF ;

    do
    {
        IFG1 &= ~ OFIFG;
        for( j=0xff ; j>0 ; j--)
        {
            _NOP();
        }
    }
    while((IFG1&OFIFG)!=0);
        BCSCTL2|=SELM_2+SELS;

}
void Delay(void)        //Delay
{
  unsigned char t;
  for(t=0;t<50;t++)
    _NOP();
}
void Delay1(void)        //Delay
{
  unsigned char t;
  for(t=0;t<200;t++)
    _NOP();
}

void Start(void)         //Start
{
  SDA_out;
  SCL_1;
  _NOP();
   SDA_1;
  Delay();
   SDA_0;
  Delay();
  SCL_0;
  Delay();
}
void Stop(void)       //Stop
{
  SDA_0;
  Delay();
  SCL_1;
  Delay();
  SDA_1;
  Delay();
}

void ACK(void)        //ACK
{
  SDA_0;
  Delay();
  SCL_1;
  Delay();
  SCL_0;
  Delay();
  SDA_1;
  Delay();

}
void NACK(void)      // NOT ACK
{
  SDA_1;
  Delay();
  SCL_1;
  Delay();
  SCL_0;
  Delay();
  SDA_0;
  Delay();

}


void Write1(void)     //Write a bie : 1
{
  SDA_1;
  Delay();
  SCL_1;
  Delay();
  SCL_0;
  Delay();

}
void Write0(void)             //Write a bit : 0
{
  SDA_0;
  Delay();
  SCL_1;
  Delay();
  SCL_0;
  Delay();

}

void Writebyte(unsigned char Wchar)    //Write a byte(8 bit)
{
  unsigned char   i;
  for(i=0;i<8;i++)
  {
    if(Wchar&0x80) Write1();
    else Write0();
    Wchar<<=1;
  }
  SDA_1;
  Delay();
}

unsigned char CheckACK(void)  //receive ACK
{
  unsigned char flag;
  //SDA_1;
  Delay();
  SCL_1;
  Delay();
  SDA_in;
  _NOP();_NOP();
  flag = P1IN&BIT3 ;        //read SDA
  SCL_0;
  Delay();
  SDA_out;
  if(flag) return 0;
   else return 1;
}

unsigned char Readbyte(void)
{
  unsigned char rchar=0 ,i,flag;

   SCL_0;
   Delay();
  for(i=0;i<8;i++)
  {
    SDA_in;
    Delay();
    SCL_1;
    Delay();
    flag=P1IN&BIT3;
     rchar<<=1;
     if(flag) rchar |= 0x01;
    _NOP();
    SDA_out;
    Delay();
    SCL_0;
    Delay();
  }
     SCL_0;
     Delay();
  return rchar;
}
void  ReadNbyte(unsigned char address,unsigned char dataaddr,unsigned int n)
{
    unsigned char i;
      Start();
     Writebyte(address);    //find eeprom
     if(!CheckACK())
       {Stop();return ;}
     Writebyte(dataaddr);   //find unit address
     if(!CheckACK())
        {Stop();return ;}
     Start();
     Writebyte(0xa1);  //read
     if(!CheckACK())
        {Stop();return ;}

   for(i=0;i<n;i++)
   {
    Readword[i]=Readbyte();
    ACK();
   }
    Stop();
    Delay();
}

void WriteNbyte(unsigned char address,unsigned char dataaddr,unsigned char *sbuff,unsigned char n)
{
  unsigned char i;
      Start();
     Writebyte(address);    //find eeprom
     if(!CheckACK())
       {Stop();return ;}
     Writebyte(dataaddr);   //find unit address
     if(!CheckACK())
        {Stop();return ;}
      for(i=0;i<n;i++)
        {
            Writebyte(sbuff[i]);
            if(!CheckACK())
            {Stop();return ;}
        }
     Stop();
     Delay();

}
void main(void)
{
    unsigned char write[9],i;
    for(i=0; i<8; i++){
    write[i] =49+i;
    }

    WDTCTL = WDTPW + WDTHOLD;
//   init_clk();
    P1DIR |= (BIT2 + BIT3);
//   P1SEL = 0x0c;                      // P1.2,3 = SCL&SDA
     while(1)
     {
     //write
     WriteNbyte(0xa0,0x00,write,8);
      Delay1();
     //read
     ReadNbyte(0xa0,0x00,8);
     Delay1();Delay1();
     }

}

使用特权

评论回复
沙发
zhanglli| | 2020-6-26 09:53 | 显示全部楼层

MSP430G 系列处理器在芯片内部划分出了256 字节的Flash 空间作为信息Flash,可用于存储非易失性数据

使用特权

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

本版积分规则