打印

MSP430F249的I2C模块与24CXX连接

[复制链接]
2038|30
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
huangchui|  楼主 | 2018-5-4 15:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
jiajs| | 2018-5-4 16:01 | 只看该作者

你要例程参考?

使用特权

评论回复
板凳
huangchui|  楼主 | 2018-5-4 16:04 | 只看该作者

嗯,看看寄存器的配置和时序操作

使用特权

评论回复
地板
wyjie| | 2018-5-4 16:08 | 只看该作者
你只要写出来iic的驱动,其他的都一样的。

使用特权

评论回复
5
huangchui|  楼主 | 2018-5-4 16:13 | 只看该作者

网上找不到相关的例程,MPS430论坛找好久不见

使用特权

评论回复
6
huangchui|  楼主 | 2018-5-4 16:16 | 只看该作者


两个引脚摸拟的I2C时序会
MSP430F249自带的I2C模块功能不知怎么用,怎么设置

使用特权

评论回复
7
jlyuan| | 2018-5-4 16:22 | 只看该作者
你安装msp430来找,例程应该都差不多的。

使用特权

评论回复
8
yszong| | 2018-5-4 16:27 | 只看该作者
如果只搜索249资料肯定少的。

使用特权

评论回复
9
huangchui|  楼主 | 2018-5-4 16:30 | 只看该作者

MSP430 系列 IIC模块与24CXX通信的例子很少,
大都是MSP430 IIC模块与其他IC,用中断的多

使用特权

评论回复
10
zhaoxqi| | 2018-5-4 16:35 | 只看该作者

24CXX是EEPROM么?这个资料很多的,I2C总线一般用模拟的

使用特权

评论回复
11
huangchui|  楼主 | 2018-5-4 16:42 | 只看该作者
知道了,结贴了

使用特权

评论回复
12
hellosdc| | 2018-5-5 23:16 | 只看该作者
用的MSP430时, 内部有几十个字节information memory 可以当EEPROM来用

使用特权

评论回复
13
uiint| | 2018-5-5 23:17 | 只看该作者
写驱动程序前要知道i2c协议,eeprom的datasheet,还有相应的引脚图。

使用特权

评论回复
14
51xlf| | 2018-5-5 23:17 | 只看该作者
#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();
     }

}

使用特权

评论回复
15
i1mcu| | 2018-5-5 23:18 | 只看该作者
许多应用设计都需要使用EEPROM

使用特权

评论回复
16
pmp| | 2018-5-5 23:18 | 只看该作者
使用EEPROM注意设计细节,可以避免如读写时序不正确

使用特权

评论回复
17
mmbs| | 2018-5-5 23:19 | 只看该作者
MSP430的EEPROM程序

使用特权

评论回复
18
1988020566| | 2018-5-5 23:19 | 只看该作者
MSP430F5438的片内FLASH可以当做EEPROM

使用特权

评论回复
19
lzbf| | 2018-5-5 23:20 | 只看该作者
https://wenku.baidu.com/view/61f407d6f705cc175527094b.html

使用特权

评论回复
20
houjiakai| | 2018-5-5 23:20 | 只看该作者
huangchui 发表于 2018-5-4 16:04
嗯,看看寄存器的配置和时序操作

主要还得看硬件的设计。

使用特权

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

本版积分规则

918

主题

12323

帖子

4

粉丝