登录 免费注册 首页 | 行业黑名单 | 帮助
维库电子市场网
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统
驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe

请教有关24C02的问题!

作者:jshong 栏目:单片机
请教有关24C02的问题!
我写了个24C02的读写程序,测试时发现对有些24C02芯片能够正确读写,但有些却不能正确读写.个位高手帮我看看是不是程序的读写时序有问题.谢谢!
下面是我的程序.
#include <reg52.h>
#include <absacc.h>
#include <intrins.h>

typedef unsigned CHAR uCHAR;
typedef unsigned int  uint;

sbit SDA  = P1^0;                     /* iic数据传送位 */
sbit SCL  = P1^1;                     /* iic时钟控制位 */

sbit P1_4 = P1^4;
sbit P1_3 = P1^3;
sbit P1_5 = P1^5;
/* 函数声明 */
void iic_wait(void);                  /* iic延时       */
void iic_start(void);                 /* 开启iic总线   */
void iic_stop(void);                  /* 关闭iic总线   */
void iic_ack(void);                   /* 发送ACK信号   */
void iic_no_ack(void);                /* 发送NOACK信号 */
bit iic_wait_ack(void);               /* 等待ACK信号   */
void iic_send_byte(uCHAR demand);     /* MCU向iic设备发送一个字节 */
uCHAR iic_receive_byte(void);         /* MCU从iic设备接收一个字节 */
/* 声明结束 */
void delay_1s(void)
{
  uCHAR i;
  uCHAR j;

  for(i=0;i<100;i++)
  for(j=0;j<100;j++);
}
/* iic延时       */
void iic_wait(void)
{
  _nop_();
  _nop_();
  _nop_();
  _nop_();
}
/* 开启iic总线   */
void iic_start(void)
{
  SDA = 1;
  SCL = 1;
  iic_wait();
  SDA = 0;
  iic_wait();
  SCL = 0;
}
/* 关闭iic总线   */
void iic_stop(void)
{
  SDA=0;
  SCL=0;
  iic_wait();
  SCL=1;
  iic_wait();
  SDA=1;
}
/* 发送ACK信号   */
void iic_ack(void)
{
  SDA=0;
  iic_wait();
  SCL=1;
  iic_wait();
  SCL=0;
}
/* 发送NOACK信号 */
void iic_no_ack(void)
{
  SDA=1;
  iic_wait();
  SCL=1;
  iic_wait();
  SCL=0;
}
/********************************************************************
函 数 名:iic_wait_ack   
功    能:等待ACK信号
说    明:
入口参数:
返 回 值:1-ACK         0-ERROR         
***********************************************************************/
bit iic_wait_ack(void)
{
  uCHAR errtime=255;
  //uint errtime = 1000;

  SDA=1;
  iic_wait();
  SCL=1;
  iic_wait();

  while(SDA)
  {
    errtime--;
    if(!errtime)
    return 0;
  }
  SCL=0;
  return 1;
}
/********************************************************************
函 数 名:iic_send_byte   
功    能:MCU向iic设备发送一个字节
说    明:
入口参数:sbyte                  待发送的字节数据
返 回 值:         
***********************************************************************/
void iic_send_byte(uCHAR sbyte)
{
  uCHAR i = 8;

  while(i--)
  {
    SCL = 0;
    _nop_();
    SDA = (bit)(sbyte&0x80);
    sbyte <<= 1;
    iic_wait();
    SCL = 1;
    iic_wait();
  }
SCL=0;
}
/********************************************************************
函 数 名:iic_receive_byte  
功    能:MCU从iic设备接收一个字节
说    明:
入口参数:
返 回 值:ddata   接收数据       
***********************************************************************/
uCHAR iic_receive_byte(void)
{
  uCHAR i=8;
  uCHAR ddata=0;

  SDA=1;
  while(i--)
  {
    ddata <<= 1;
    SCL=0;
    iic_wait();
    SCL=1;
    iic_wait();
    ddata |= SDA;
  }
  SCL=0;
  return ddata;
}
/********************************************************************
函 数 名:write_iic_data
功    能:向iic设备写入N个字节
说    明:
入口参数:write_data              存放写入字节的数组
          address                 指定从address处开始写入
          num                     写入的字节数  
返 回 值:无       
***********************************************************************/
void write_iic_data(uCHAR write_data[], uCHAR address, uCHAR num)
{
  uCHAR n;

  iic_start();
  iic_send_byte(0xa0);
  iic_wait_ack();
  iic_send_byte(address);
  iic_wait_ack();
    
  for(n=0; n<num; n++)
  {
    iic_send_byte(write_data[n]);
    iic_wait_ack();
  }
  iic_stop();
}
/********************************************************************
函 数 名:read_iic_data
功    能:从iic设备读取N个字节
说    明:
入口参数:read_data               存放读取字节的数组
          address                 指定从address处开始读取
          num                     读取的字节数
返 回 值:无       
***********************************************************************/<
2楼: >>参与讨论
程序人生
网上有很多标准程序下,自己对照下看
 
3楼: >>参与讨论
huangqi412
呵呵,去看下我的帖子
 
4楼: >>参与讨论
sxl_72
延时长一点试试
 
5楼: >>参与讨论
DSP99
I2C的模拟程序包很多啊~~
 
参与讨论
昵称:
讨论内容:
 
 
相关帖子
请教大家,USB转并口问题~!
请推荐一大RAM大flash的与51完全兼容的单片机,40DIP的,急
伟福v8s仿真器用C51编成出现"印象文件未找到"怎么解决
8253有升级芯片么?
看看哪些型号的单片机符合下面要求:
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入


Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号