OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7752|回复: 13

初学者编写了一个I2c—eeprom的程序·但是一直没有应答,实在想不出了·求帮助

[复制链接]

1

主题

11

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2012-12-29
在线时间
0 小时
发表于 2012-12-29 15:34:10 | 显示全部楼层 |阅读模式


#include <MSP430G2553.h>

#define SDA_1    P1OUT |= BIT7
#define SDA_0    P1OUT &=~ BIT7
#define SCL_1    P1OUT |= BIT6
#define SCL_0    P1OUT &=~ BIT6
#define SDA_out  P1OUT |= BIT7
#define SDA_in   P1OUT &=~ BIT7
unsigned char Readword[12];
void init_clk(void)
{
    unsigned char j;
    do
    {
        IFG1 &=~ OFIFG;
        for( j=10 ; j>0 ; j--)
        {
            _NOP();
        }
    }
   while((IFG1&OFIFG)!=0);
   P1DIR |= BIT6+BIT7;
   P3DIR |= BIT5;
   P3OUT &=~ BIT5;
}
void Delay(void)        //Delay
{
  unsigned char t;
  for(t=0;t<15;t++)
    _NOP();
}
void Long_Delay(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;
  SCL_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 bit : 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)    //写一个字Wchar
{
  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&BIT7 ;        //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&BIT7;
    rchar<<=1;
    if(flag) rchar |= 0x01;
    _NOP();
   // SDA_out;
   // Delay();
    SCL_0;
    Delay();
  }
     SCL_0;
     Delay();
  return rchar;
}
void WriteNbyte(unsigned char address,unsigned char dataaddr,unsigned char *buff,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(buff);
            if(!CheckACK())
            {Stop();return ;}
        }
     Stop();
     Delay();
}
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(0xaf);     //read
     if(!CheckACK())
        {Stop();return ;}
   for(i=0;i<n;i++)
   {
    Readword=Readbyte();
    ACK();
   }
    Stop();
    Delay();
 }
void main(void)
{
    unsigned char write[9],i;
    for(i=0; i<8; i++){
    write =49+i;
    }
   
    WDTCTL = WDTPW + WDTHOLD;
    init_clk();
   // P1SEL = 0xc0;              P1.6,7= SCL&SDA
     while(1)
     {
     //write
     WriteNbyte(0xae,0x00,write,2);
     Long_Delay();
     //read
     ReadNbyte(0xae,0x00,2);
     Long_Delay();
     Long_Delay();
     }
}

加油
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2012-12-29
在线时间
0 小时
 楼主| 发表于 2012-12-29 15:36:14 | 显示全部楼层
单片机用的MSP430g2553,求帮忙·
加油
回复 支持 反对

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2012-12-29
在线时间
0 小时
 楼主| 发表于 2012-12-29 15:44:31 | 显示全部楼层
无应答的话与程序的关系不太大吧·可是硬件的问题我都想了一遍了,实在想不出了
加油
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165353
金钱
165353
注册时间
2010-12-1
在线时间
2108 小时
发表于 2012-12-29 16:56:23 | 显示全部楼层
很大,你的430,IO方向不用配置的么?
IIC的SDA,输出地址和命令的时候,要配置为输出模式。
读取数据的时候,又要配置为输入模式的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2012-12-29
在线时间
0 小时
 楼主| 发表于 2012-12-29 18:55:45 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
谢谢你啊,我试试,我只是在开始的时候配置了DIR--P1DIR |= BIT6+BIT7;不明白这一点,我去调试看看波形。
加油
回复 支持 反对

使用道具 举报

28

主题

306

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
1320
金钱
1320
注册时间
2012-6-3
在线时间
353 小时
发表于 2012-12-29 19:23:16 | 显示全部楼层
回复【楼主位】gebbie:
---------------------------------
设置IO口方向是
#define SDA_out  1DIR |= BIT7
#define SDA_in   1DIR &=~ BIT7,延时用比较精准的延时,
例如下面这个,好用,而且准确,
#define CPU_F ((double) 8000000.0)//当前CPU主频 
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0)),
然后看时序图。
回复 支持 反对

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2012-12-29
在线时间
0 小时
 楼主| 发表于 2012-12-29 19:31:58 | 显示全部楼层
回复【6楼】艾科:
---------------------------------
谢谢啦,这个延时蛮好用啊
加油
回复 支持 反对

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2012-12-29
在线时间
0 小时
 楼主| 发表于 2012-12-29 19:54:19 | 显示全部楼层
还是不行啊各位大神,第九个时钟脉冲就是不应答啊,大的问题是在找不到了
加油
回复 支持 反对

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2012-12-29
在线时间
0 小时
 楼主| 发表于 2012-12-29 20:06:32 | 显示全部楼层
回复【7楼】gebbie:
---------------------------------
艾科·还是不行啊,第九个时钟脉冲就是不应答啊,软硬件·大的问题实在找不到了咋办呢
加油
回复 支持 反对

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2012-12-29
在线时间
0 小时
 楼主| 发表于 2012-12-29 20:07:38 | 显示全部楼层
回复【6楼】艾科:
---------------------------------
艾科·还是不行啊,第九个时钟脉冲就是不应答啊,软硬件·大的问题实在找不到了咋办呢
加油
回复 支持 反对

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1863
金钱
1863
注册时间
2011-3-29
在线时间
139 小时
发表于 2012-12-29 20:41:42 | 显示全部楼层
参考原子的程序啊。。。。
不然看我的。。。:http://www.openedv.com/posts/list/11124.htm
业余程序玩家。
回复 支持 反对

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2012-12-29
在线时间
0 小时
 楼主| 发表于 2012-12-29 20:52:10 | 显示全部楼层
回复【11楼】ofourme:
---------------------------------
我是找了一下原子的程序没找到···才求救的··谢谢你啦··
加油
回复 支持 反对

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1863
金钱
1863
注册时间
2011-3-29
在线时间
139 小时
发表于 2012-12-29 21:20:57 | 显示全部楼层
回复【12楼】gebbie:
---------------------------------
看置顶啊,晕死。
http://www.openedv.com/posts/list/7122.htm
业余程序玩家。
回复 支持 反对

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2012-12-29
在线时间
0 小时
 楼主| 发表于 2012-12-29 21:31:24 | 显示全部楼层
回复【13楼】ofourme:
---------------------------------
啊·谢谢你啦·我是这里的新人·不熟悉环境·谢谢关照
加油
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 11:44

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表