awangyafeiz1 发表于 2010-12-1 15:12:04

IIC 24C02

下面是小弟写的一段简单的对430F413的24C02操作的小程序,仿真读不到值,请高手们帮忙看下!
程序大概功能:将a1写入EEPROM,字节地址30,再从30读出a1放入a2!现在问题是读不到值!
#include <msp430x41x.h>
#include"IIC.h"

void InitIIC();
void delay(void);
void start(void);
void stop(void);
void Ack();
void noAck();
unsigned char check();
void write_1 (void);
void write_0(void);
void write_byte(unsigned char input);
unsigned char read_byte();
unsigned char w_r_byte(uchar *p,uchar adr,uchar *p1);

void main()
{
WDTCTL=WDTPW+WDTHOLD;
SCFI0=FLLD_8 ;
EE_ON ;
InitIIC();
uchar a1={0x41,0x00};
uchar a2={0x00,0x01};
w_r_byte(&a1,30,&a2);
_NOP();
LPM4;

}



unsigned char w_r_byte(uchar *p,uchar adr,uchar*p1 )//p写入数据字节地址,P1读出数据存储地址指针
{

start();
write_byte(W_DEVICE_ADR); //写器件地址
   if(check()==1) return 1;
   
   
write_byte(adr);      //写字节地址
   
    if(check()==1) return 1;
write_byte(*p) ;//写入数组a1
   
    if(check()==1) return 1;
stop();
start();//read
write_byte(W_DEVICE_ADR ); //写设备地址
   
    if(check()==1) return 1;
write_byte(adr);   //写字节地址
   
    if(check()==1) return 1;
start();
write_byte(R_DEVICE_ADR);//设备地址—读
   
   if(check()==1) return 1;
*p1=read_byte();//读出放入a2[]
noAck();
stop();
return 0;
}
***************************************************
IIC.h
/******************************************************************

*******************************************************************/
#include <msp430x41x.h>
#ifndef __IIC
#define __IIC
typedef unsigned charuchar;
typedef unsigned int   uint;
#define SDA_INP1DIR&=~BIT6
#define SDA_OUT P1DIR|=BIT6
#define SCL_OUT P1DIR|=BIT7
#define SDA_VAL P1IN&BIT6//0x40
#define SDA_L   P1OUT&=~BIT6
#define SDA_H   P1OUT|=BIT6
#define SCL_L   P1OUT&=~BIT7
#define SCL_H   P1OUT|=BIT7
#define EE_ON(P2OUT &= ~0x01)      //24WC02供电
#define EE_OFF (P2OUT |=0x01)      //24WC02断电
#define W_DEVICE_ADR 0xa0   //24C02 的写地址 A0、A1、A2 均为0
#define R_DEVICE_ADR 0xa1   //24c02 的读地址A0、A1、A2 均为0
#endif


/****************************************************

函数功能:延时
*****************************************************/
void delay(void)
{
_NOP();
}

/******************************************************
函数功能;START
*******************************************************/
void start(void)
{
SDA_OUT;
SDA_H;
delay();
SCL_H;
delay();
SDA_L;
delay();
SCL_L;
delay();
}
/************************************************************

函数功能:STOP
*************************************************************/
void stop(void)
{
SDA_OUT;
SCL_L;
delay();
SDA_L;
delay();
SCL_H;
delay();
SDA_H;
delay();

}


/***************************************
函数功能:设置IIC对应IO为输出方向并输出高
电平
****************************************/
void InitIIC()
{
SCL_OUT; //SCL 管脚为输出
SDA_IN; //SDA管脚为输入
SCL_L;
stop();
}


/**************************************************************
函数功能:ACK
***************************************************************/
void Ack()
{
SDA_OUT;
SDA_L;
delay();
SCL_H;
delay();
SCL_L;
delay();
SDA_H;
}
/**********************************************************
函数功能:NOACK
***********************************************************/
void noAck()
{
SDA_OUT;
SDA_H;
delay();
SCL_H;
delay();
SCL_L;
delay();
}
/**********************************************************
函数功能:check
返回 1:错误
   0:有应答

**********************************************************/
unsigned char check()


{

   unsigned char ack;
   SCL_H;
   delay();
   SDA_IN;
   delay();
   ack=SDA_VAL;
   delay();
   SCL_L;
   delay();
   return(ack);
}




/***************************************
函数功能:对IIC总线写1
****************************************/
void write_1 (void)
{
SDA_H;
delay();
SCL_H;
delay();
SCL_L;
delay();
}

/******************************************
函数功能:对IIC总线写0
*******************************************/
void write_0(void)
{
SDA_L;
delay();
SCL_H;
delay();
SCL_L;
delay();
}

/**********************************************
函数功能:字节写入
***********************************************/
void write_byte(unsigned char input)
{
    unsigned char temp,q0;
    SDA_OUT;
    for(temp=8;temp!=0;temp--)
    {
      q0=input&0x80;
      if(q0==0x80)
      SDA_H;
      else
      SDA_L;
      delay();
      SCL_H;
      delay();
      SCL_L;
      delay();
      input=input<<1;
    }
}


/**********************************************************************
函数功能:IIC 总线读8 位数据
返回值:读出的 8 位数据
***********************************************************************/
unsigned char read_byte()
{
   unsigned char temp,q0,rbyte=0;
   SDA_IN;
   for(temp=8;temp!=0;temp--)
   {
   SCL_H;
   delay();
   rbyte=rbyte<<1;
   SDA_IN;
   q0=SDA_VAL;//P1IN&BIT6
   if(q0==BIT6)
   rbyte=rbyte|0x01;
   delay();
   SCL_L;
   delay();
   }
   return(rbyte);
}

awangyafeiz1 发表于 2010-12-1 15:53:42

望大虾们帮忙,或加qq聊182173700

bzktust 发表于 2010-12-1 16:11:41

哈哈! 我自己写的程序我都懒得看。

你自己好好查查吧,最好摘录主要问题

awangyafeiz1 发表于 2010-12-1 19:07:00

查的我眼睛花了,NND犯了方向性错误了!

ronaldosw 发表于 2010-12-7 23:35:34

我刚刚用5系列写好一个24c01的

xingqing 发表于 2011-2-23 10:43:43

回复【4楼】ronaldosw
-----------------------------------------------------------------------

朋友能共享下程序吗

lovewwy 发表于 2011-2-23 16:30:42

太长了,I2C 主要是时序要对
页: [1]
查看完整版本: IIC 24C02