搜索
bottom↓
回复: 6

IIC 24C02

[复制链接]

出0入0汤圆

发表于 2010-12-1 15:12:04 | 显示全部楼层 |阅读模式
下面是小弟写的一段简单的对430F413的24C02操作的小程序,仿真读不到值,请高手们帮忙看下!
程序大概功能:将a1[0]写入EEPROM,字节地址30,再从30读出a1[0]放入a2[0]!现在问题是读不到值!
#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[2]={0x41,0x00};
uchar a2[2]={0x00,0x01};
w_r_byte(&a1[0],30,&a2[0]);
_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 char  uchar;
typedef unsigned int   uint;
#define SDA_IN  P1DIR&=~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);
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2010-12-1 15:53:42 | 显示全部楼层
望大虾们帮忙,或加qq聊182173700

出0入0汤圆

发表于 2010-12-1 16:11:41 | 显示全部楼层
哈哈! 我自己写的程序我都懒得看。

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

出0入0汤圆

 楼主| 发表于 2010-12-1 19:07:00 | 显示全部楼层
查的我眼睛花了,NND犯了方向性错误了!

出0入0汤圆

发表于 2010-12-7 23:35:34 | 显示全部楼层
我刚刚用5系列写好一个24c01的

出0入0汤圆

发表于 2011-2-23 10:43:43 | 显示全部楼层
回复【4楼】ronaldosw
-----------------------------------------------------------------------

朋友能共享下程序吗

出0入0汤圆

发表于 2011-2-23 16:30:42 | 显示全部楼层
太长了,I2C 主要是时序要对
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-26 03:01

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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