写数据总是显示失败

2019-07-23 14:15发布

msp430向24c02里写数据,总是显示失败

/**************************************
程序功能:将数据存入24c08,然后用led显示存入的数据
*/
#include<msp430x14x.h>
#define uchar unsigned char
#define uint unsigned int

#define SCL_H P1OUT |= BIT2      //高低电平宏定义
#define SCL_L P1OUT &= ~BIT2
#define SDA_H P1OUT |= BIT3
#define SDA_L P1OUT &= ~BIT3

#define SCL_OUT P1DIR |= BIT2    //将P1.2口(SCL)设为输出状态
#define SDA_OUT P1DIR |= BIT3    //将P1.3口(SDA)设为输出状态
#define SDA_IN P1DIR &= ~BIT3    //将P1.3口设为输入状态,判断SDA高低电平
#define SDA_T (P1IN & BIT3)      //用于数据线(SDA)的检测

void delay(uchar n)           //短暂延时函数,用于电平延时
{
  uchar i,j;
  for(i=n;i>0;i--)            
    for(j=0;j<5;j++);      
}

void io_init()        //用于显示
{
  P2DIR = 0XFF;       //用于led显示
}

void iic_init()      //iic总线初始化  
{
  SCL_OUT;           //将P1.2口(SCL)设为输出状态
  SDA_OUT;
  delay(1);
  
  SCL_H;
  delay(1);
  SDA_H;
  delay(1);
}

void start()
{
  SDA_OUT;
  delay(1);
  
  SCL_H;
  delay(1);
  SDA_H;
  delay(1);
  SDA_L;
  delay(1);
}

void stop()
{
  SDA_OUT;
  delay(1);
  
  SCL_H;
  delay(1);
  SDA_L;
  delay(1);
  SDA_H;
  delay(1);
}

void respon()                 //可能有问题 ,简化了应答机制      
{
  uchar i=0;
  SDA_IN;                     //输入,用于读数据
  
  SCL_H;                      //高电平时
  delay(1);
  while((SDA_T==1)&&(i<252))   //等待应答,即SDA拉低0
  {
    i++;
  }
}

void writebyte(uchar data)     //从最高位开始传送
{
  uchar i;
  SDA_OUT;
  
  for(i=0; i<8; i++)
  {
    SCL_L;
    delay(1);
    if((data&0x80)==0x80)
      SDA_H;
    else
      SDA_L;
    delay(1);
   
    SCL_H;
    delay(1);
    data = data << 1;     //data左移7次即可,第8次没给sda
  }
}

uchar readbyte()              //从最高位开始读
{
  uchar i,temp=0;
  SDA_IN;                     //输入,用于读数据
  delay(1);
   
  for(i=0; i<8; i++)
  {
    SCL_L;                      //允许数据变化
    delay(1);
    SCL_H;                    //停止数据变化
    delay(1);
    temp = (temp<<1)|SDA_T;
    delay(1);
  }
  return temp;
}

void write_24c08(uchar add,uchar data)
{
  start();
  writebyte(0xa0);   //单字节写入
  respon();
  writebyte(add);
  respon();
  writebyte(data);
  respon();
  stop();
}

uchar read_24c08(uchar add)
{
  uchar data;
  start();
  writebyte(0xa0);   //单字节写入
  respon();
  writebyte(add);
  respon();
  
  start();
  writebyte(0xa1);   //单字节读
  respon();
  data = readbyte();
  stop();
  return data;
}

void main(void)
{
  uchar data;             //用于存放读出的数据
  WDTCTL = WDTPW + WDTHOLD;
  io_init();
  iic_init();
  
  write_24c08(8,0x55);    //随便写入一个数据      
  data = read_24c08(8);

  P2OUT = data;           //用led显示
  while(1);
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
14条回答
zhaoxqi
1楼-- · 2019-07-23 16:11
又是那么长的代码啊
到底是写24C02操作失败,还是LED操作失败?
wyjie
2楼-- · 2019-07-23 20:03
 精彩回答 2  元偷偷看……
huangchui
3楼-- · 2019-07-24 01:38
看不出。
你最好看下这段应答函数产生的时序,和24c02手册对比一下
jiajs
4楼-- · 2019-07-24 01:52

读写速度有问题吧?
zhenykun
5楼-- · 2019-07-24 06:00
io驱动不足了
wyjie
6楼-- · 2019-07-24 09:48
终于找到原因了,是硬件问题,模拟I2C的两条输出线要加上拉电阻。。。。

一周热门 更多>