打印

关于MSP430与AT24C02的问题

[复制链接]
1785|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
asffsd|  楼主 | 2015-4-6 22:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
调了几天的存储芯片24C02,感觉程序上没有什么问题啊。可是程序总是卡在ACK()中的while里。不知道什么原因。望有经验的大神帮忙解决下。不胜感激。
#include "msp430x26x.h"

#define uchar unsigned char
#define uint  unsigned int

#define TRUE  1
#define FALSE 0

#define CPU_F ((double)16000000)
#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))

#define SDA_H P4OUT |=BIT5
#define SDA_L P4OUT &=~BIT5
#define SCL_H P4OUT |=BIT6
#define SCL_L P4OUT &=~BIT6
#define SDA_TRUE  P4IN&BIT5

#define SDA_IN  P4DIR &=~BIT5
#define SDA_OUT P4DIR |=BIT5

void AT24C02_Init()          //初始化,需将时钟线和数据线拉高
{
  P4DIR |=BIT5+BIT6;            //AT24C02 SDA SCL
  SDA_H;
  SCL_H;
}
void AT24C02_START()        //起始条件,SCL高电平时候,SDA的一个下降沿
{
  SDA_OUT;
  SDA_H;
  delay_us(10);
  SCL_H;
  delay_us(10);
  SDA_L;
  delay_us(10);
  SCL_L;
}  
void AT24C02_STOP()       //停止条件,SCL高电平时候,SDA的一个上升沿
{
  SDA_OUT;
  SDA_L;
  delay_us(7);
  SCL_H;
  delay_us(7);
  SDA_H;
  delay_us(7);
}  

void ACK()
{
  //unsigned char i=0;
  SDA_H;
  delay_us(10);
  SCL_H;
  delay_us(10);
  SDA_IN;
  //while(SDA_TRUE&&(i<255)) i++;
  while(SDA_TRUE);
  SCL_L;
  delay_us(10);
  SDA_OUT;
}
void AT24C02_send_char(unsigned char data)  //IIC协议要求从高位开始传送,传送1字节
{
  unsigned char i=0;
  SDA_OUT;
  SCL_L;                                    //此时,SCL被拉低,才允许SDA变化
  SDA_H;
  delay_us(5);
  for(i=0;i<8;i++)
  {
    if(data&(0x80>>i))
      SDA_H;
    else
      SDA_L;
    SCL_H;                        //拉高SCL,不允许SDA变化
    delay_us(10);
    SCL_L;
    delay_us(10);                 //拉低SCL,开始下1bit传送
  }

  SDA_H;                         //释放数据线
  delay_us(5);
}

unsigned char AT24C02_receive_char()
{
    //SCL低电平 SDA高电平
  unsigned char temp=0,i=0;
  SCL_L;
  SDA_H;
  SDA_IN;
  for(i=0;i<8;i++)
  {
    SCL_H;
    delay_ms(3);
    if(SDA_TRUE)
      temp=temp|(0x80>>i);
    SCL_L;
    delay_ms(2);
  }
  SDA_OUT;
  return temp;
}

void AT24C02_write_byte(unsigned char address,unsigned char data)
{
  AT24C02_START();
  AT24C02_send_char(0xa0);
  ACK();
  AT24C02_send_char(address);
  ACK();
  AT24C02_send_char(data);
  ACK();
  AT24C02_STOP();
}
unsigned char AT24C02_read_byte(unsigned char address)
{
  unsigned val=0;
  AT24C02_START();
  AT24C02_send_char(0xa0);
  ACK();
  AT24C02_send_char(address);
  ACK();
  AT24C02_START();
  AT24C02_send_char(0xa1);
  ACK();
  val=AT24C02_receive_char();
  AT24C02_STOP();
  return val;
}

void main()
{
  unsigned char r=0;
  WDTCTL =WDTPW+WDTHOLD;                                 //停止开门狗
  CLK_Init();
  AT24C02_Init();

  AT24C02_write_byte(0x10,0x12);
  Delay_ms(5);
  r=AT24C02_read_byte(0x10);
  
  while(1);
}

相关帖子

沙发
asffsd|  楼主 | 2015-4-6 22:09 | 只看该作者
坐等啊

使用特权

评论回复
板凳
dirtwillfly| | 2015-4-6 23:15 | 只看该作者
这个东西,就得用逻辑分析仪或者示波器,看着时序慢慢调

使用特权

评论回复
地板
ccw1986| | 2015-4-8 22:28 | 只看该作者
楼主,还是先看看时序对不对吧

使用特权

评论回复
5
yirongfu| | 2015-4-9 00:21 | 只看该作者
哪款24C02?先确认是5V的还是3.3V的24C02,印象中AT24C02是5V的。5V的不好说的,你懂的。
然后,如果是3.3V的EEPROM,因为你代码里头没有使能IO的内部上拉,那么外部上拉电阻接了吗?

使用特权

评论回复
6
shenmu2012| | 2015-4-9 20:09 | 只看该作者
这个先看下你的硬件上设计有设么没考虑到的吧。

使用特权

评论回复
7
shenmu2012| | 2015-4-9 20:09 | 只看该作者
这个很明显是死在whlie语句那了,跟硬件相关的。

使用特权

评论回复
8
yy_yanyu| | 2015-4-12 20:09 | 只看该作者
楼主调试好了没有?我最近调试这个程序也没成功,就继续向下进行了,加下QQ328550903   希望与楼主多交流,谢谢。

使用特权

评论回复
9
quray1985| | 2015-4-13 21:56 | 只看该作者
初始化未成功,先看看时序对不对

使用特权

评论回复
10
asffsd|  楼主 | 2015-4-15 10:38 | 只看该作者
我的硬件上有10k的上拉电阻,是没问题的。时序我也看了,好像也没什么问题

使用特权

评论回复
11
asffsd|  楼主 | 2015-4-15 10:39 | 只看该作者
yirongfu 发表于 2015-4-9 00:21
哪款24C02?先确认是5V的还是3.3V的24C02,印象中AT24C02是5V的。5V的不好说的,你懂的。
然后,如果是3.3V ...

ATMEL AT24C02芯片。有上拉电阻10K

使用特权

评论回复
12
asffsd|  楼主 | 2015-4-15 10:41 | 只看该作者
shenmu2012 发表于 2015-4-9 20:09
这个很明显是死在whlie语句那了,跟硬件相关的。

这个确实死在while里了。很奇怪的是,发送0xA0后的ACK能收到。再然后发送器件写地址后ACK就收不到了,死在里面了

使用特权

评论回复
13
asffsd|  楼主 | 2015-4-15 16:47 | 只看该作者
quray1985 发表于 2015-4-13 21:56
初始化未成功,先看看时序对不对

阁下,能把24C02的程序,发给我参考一下吗?不胜感激。

使用特权

评论回复
14
quray1985| | 2015-4-15 21:41 | 只看该作者
asffsd 发表于 2015-4-15 16:47
阁下,能把24C02的程序,发给我参考一下吗?不胜感激。

不好意思啊,现在手头上没有,是以前用nxp单片机的时候用过

使用特权

评论回复
15
asffsd|  楼主 | 2015-4-15 22:51 | 只看该作者
quray1985 发表于 2015-4-15 21:41
不好意思啊,现在手头上没有,是以前用nxp单片机的时候用过

恩,谢谢你啊,我现在搞出来了,虽然还有点迷糊。

使用特权

评论回复
16
asffsd|  楼主 | 2015-4-15 22:52 | 只看该作者
我把上拉电阻去掉了,然互启用内置上拉电阻,就可以了。

使用特权

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

本版积分规则

1

主题

10

帖子

1

粉丝