12回答

0收藏

[求助] 430 f247 EEPROM IIC读写一个字节 求高手指点

TI TI 5915 人阅读 | 12 人回复 | 2013-03-16

麻烦高手指点一下 怎么老是读不到写的数据 写了02 每次读都是04

新建 Microsoft Word 文档.doc

28.5 KB, 下载次数: 6

分享到:
回复

使用道具 举报

回答|共 12 个

倒序浏览

沙发

ming1006

发表于 2013-3-16 14:59:14 | 只看该作者

表示为什么不直接贴出来,更直观呢
板凳

ming1006

发表于 2013-3-16 15:02:00 | 只看该作者

看了一下,表示解决不了,看成是430内部flash了
地板

神韵1206

发表于 2013-3-16 15:35:53 | 只看该作者

ming1006 发表于 2013-3-16 14:59
表示为什么不直接贴出来,更直观呢

怎么贴?不太懂
5#

神韵1206

发表于 2013-3-16 15:40:54 | 只看该作者

ming1006 发表于 2013-3-16 15:02
看了一下,表示解决不了,看成是430内部flash了

能否加你QQ。。。。。。。
6#

ming1006

发表于 2013-3-16 15:41:02 | 只看该作者

神韵1206 发表于 2013-3-16 15:35
怎么贴?不太懂

就是直接复制到回复框,文字直接显示
7#

ming1006

发表于 2013-3-16 15:43:26 | 只看该作者

神韵1206 发表于 2013-3-16 15:40
能否加你QQ。。。。。。。

240043926,不过表示这个问题我也无能为力,因为没搞过
8#

神韵1206

发表于 2013-3-16 15:55:13 | 只看该作者

ming1006 发表于 2013-3-16 15:41
就是直接复制到回复框,文字直接显示

/#define uchar unsigned char
void init_clock() //时钟初始化
{  
  WDTCTL=WDTPW+WDTHOLD;                //关看门狗
  BCSCTL1&= ~XT2OFF;
do                                        //判断晶振是否起振
  {
  IFG1 &= ~OFIFG;                           // Clear OSCFault flag
  for (int i = 0x47FF; i > 0; i--);         // Time for flag to set
  }
  while ((IFG1 & OFIFG));                  // OSCFault flag still set?
  BCSCTL2=SELM_2+SELS; //MCLK 和 SMCLK 选择 XT2时钟源16MHZ
}


void init_pio()              
{
   P5SEL|=0x06;//p5.1SDA,p5.2SCL
}

void EEPROM_I2C_init(void)//iic初始化函数
{
  P5SEL |= BIT1 + BIT2;                     //设置p5.1,p5.2口为外围模块功能
  UCB1CTL1 |=UCSWRST;                     
  UCB1CTL0 |= UCMST + UCMODE_3+UCSYNC;             //设置为IIC主机模式
  UCB1CTL1 |= UCSSEL_2+UCSWRST;                     //USCI时钟源选择SMCLK
  UCB1BR0 = 0xc8;                             //SMCLK/30
  UCB1BR1 = 0;  
  UCB1CTL1 &=~UCSWRST;                      //进入I2C模式
}

void init()                      //初始化
{  
   init_clock();
   init_pio();
   EEPROM_I2C_init();
}

void msec(int x)        //
{  
        int j=0;
        while(x>=0)
        {
        for (j=0; j<600; j++);
                x--;
        }
}

void EEPROM_I2C_Write_ONEByte(uchar adderss_pre,uchar adderss_curr,uchar data)  //EEPROM_I2C写1字节函数  
{
  while(UCB1STAT&UCBBUSY);
  UCB1I2CSA=(deviceaddress|adderss_pre);     //设定从机地址为50
  UCB1CTL1 |= UCTR + UCTXSTT;               //发送起始条件
  while((UC1IFG&UCB1TXIFG)!=UCB1TXIFG);
  while(UCB1CTL1&UCTXSTT); //ack(me)
  UCB1TXBUF=adderss_curr;                   //发送第1个8位数据地址
  while(UCB1CTL1&UCTXSTT); //ack(me)            //等待高位发送完毕
  while((UC1IFG&UCB1TXIFG)!=UCB1TXIFG);
  UCB1TXBUF=data;
  while((UC1IFG&UCB1TXIFG)!=UCB1TXIFG);
  UCB1CTL1 |=UCTXSTP;                     //置位发送停止位
  UC1IFG &=~UCB1TXIFG;
  while(UCB1CTL1&UCTXSTP);                  //等待主发送停止位发送完毕
  msec(1);
}

void EEPROM_I2C_Read_ONEByte(int adderss_pre,int adderss_curr,char *carry)                              //读
{
  UCB1I2CSA=(deviceaddress|adderss_pre);                       //设定从机地址为50
  UCB1CTL1 |= UCTR  ;               
  UCB1CTL1 |= UCTXSTT;                    //发送起始条件
  while((UC1IFG&UCB1TXIFG)!=UCB1TXIFG);
  UCB1TXBUF=adderss_curr;
  while(UCB1CTL1&UCTXSTT);                  //
  while((UC1IFG&UCB1TXIFG)!=UCB1TXIFG);
  UCB1I2CSA=(deviceaddress|adderss_pre);                       //设定从机地址为50
  UCB1CTL1 &=(~UCTR);                         //接收起始条件
  UCB1CTL1|=UCTXSTT;
  UCB1CTL1|=UCTXSTP;   
  while(UCB1CTL1&UCTXSTT);       //
  while((UC1IFG&UCB1TXIFG)!=UCB1TXIFG);
  *carry=UCB1RXIFG;
  while((UC1IFG&UCB1RXIFG)!=UCB1RXIFG);
  UCB1CTL1|=UCTXSTP;                      //接收停止位
  while(UCB1CTL1&UCTXSTP);
  temp=*carry;
}

void EEPROM_I2C_read_write_ONEByte(void)//eeprom读写函数
{
   EEPROM_I2C_Write_ONEByte(0,0,0x02);//eeprom写函数
   EEPROM_I2C_Read_ONEByte(0,0,&carry);//eeprom读函数
}
9#

ming1006

发表于 2013-3-16 15:58:26 | 只看该作者

神韵1206 发表于 2013-3-16 15:55
/#define uchar unsigned char
void init_clock() //时钟初始化
{  

现在就等大神来找茬了,
10#

hjf2002

发表于 2013-3-16 16:32:41 | 只看该作者

用示波器来看你的数据是发的错呢还是收的有问题?
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条