5645|7

6

帖子

1

TA的资源

一粒金砂(中级)

楼主
 

PIC16单片机写的一个24LC08的读写程序,为什么读出来是FF [复制链接]

#include
#define delay2408_TIME 2   //24C08的延迟时间
#define SCL1 RC3   
#define SDA1 RC4
#define uchar unsigned char
#define uint  unsigned int
void I2cinit(void)
{
  //SSP1STAT=0x80;
  SSP1CON1=0x28;
  TRISC4=1;    //SDA配置为输入;
  delay2408(delay2408_TIME);
  TRISC3=1;    //SCL配置为输入;
  delay2408(delay2408_TIME);
}
void  delay2408(unsigned int t)  //24c08的延时函数,微妙延迟
{
  while(t--);
   
}

void I2C_Start(void)
{
  /*启动I2C总线的函数,当SCL为高电平时使SDA产生一个负跳变*/
  //SCL1=0;
  SDA1=1;
  delay2408(delay2408_TIME);
  SCL1=1;
  delay2408(delay2408_TIME);
  SDA1=0;
  delay2408(delay2408_TIME);
  //SCL1=0;
  //delay2408(delay2408_TIME);
}
void I2C_Stop(void)
{
/*终止I2C总线,当SCL为高电平时使SDA产生一个正跳变*/
  //SCL1=0;
  SDA1=0;
  delay2408(delay2408_TIME);
  SCL1=1;
  delay2408(delay2408_TIME);
  SDA1=1;
  delay2408(delay2408_TIME);
  //SCL1=0;
  //delay2408(delay2408_TIME);
}
void SEND_0(void)  /*SEND ACK*/
{
  /*发送0,在SCL为高电平时使SDA信号为低*/
  SDA1=0;
  delay2408(delay2408_TIME);
  SCL1=1;
  delay2408(delay2408_TIME);
  SCL1=0;
  delay2408(delay2408_TIME);
}
void SEND_1(void)  
{
  /*发送1,在SCL为高电平时使SDA信号为高*/
  SDA1=1;
  delay2408(delay2408_TIME);
  SCL1=1;
  delay2408(delay2408_TIME);
  SCL1=0;
  delay2408(delay2408_TIME);
}
void Check_Acknowledge(void)
{
  /*发送完一个字节后检验设备的应答信号*/
  uchar a;
  //SCL1=0;
  //delay2408(delay2408_TIME);
  //SDA1=1;
  //delay2408(delay2408_TIME);
  SCL1=1;
  delay2408(delay2408_TIME);
  a=255;
  while(SDA1==1)
   {
    a--;
    if(a==0)  
       { SCL1=0;
         
       }
    }
   SCL1=0;
  delay2408(delay2408_TIME);
}
void WriteI2CByte(uchar b)
{
  /*向I2C总线写一个字节*/
   unsigned char i;
   i=0;
  for(i=0;i<8;i++)
     {
      if((b<           SEND_1();
          else
            SEND_0();
      }
   SDA1=1;
   delay2408(delay2408_TIME);
}
unsigned char ReadI2CByte(void)
{
   /*从I2C总线读一个字节*/
   unsigned char b=0,i;
   for(i=0;i<8;i++)
     {
        SCL1=0;
        delay2408(delay2408_TIME);
        //SDA1=1;       /*释放总线*/
        //delay2408(4);
        SCL1=1;     /*接受总线*/
        delay2408(delay2408_TIME);
        if(SDA1==1)
          {
            b=b<<1;
            b=b|0x01;
           }
           else
              b=b<<1;
         delay2408(4);
         SCL1=0;
       }
  return b;
}
/******24c08的读写函数********************/
void Write_One_Byte(unsigned char addr,unsigned char thedata)
{
  I2C_Start();
  WriteI2CByte(0xa0);
  Check_Acknowledge();   //应答信号判断,这里应该需要确定它的应答信号
  WriteI2CByte(addr);
  Check_Acknowledge();
  WriteI2CByte(thedata);
  Check_Acknowledge();
  I2C_Stop();
  delay2408(2);
}
unsigned char Read_One_Byte(unsigned char addr)
{
  unsigned char mydata;
  /*read a byte from mem*/
  I2C_Start();
  WriteI2CByte(0xa0);
  Check_Acknowledge();
  WriteI2CByte(addr);
  Check_Acknowledge();
  I2C_Start();
  WriteI2CByte(0xa1);
  Check_Acknowledge();
  mydata=ReadI2CByte();
  delay2408(delay2408_TIME);
  I2C_Stop();
  return mydata;
  
}
void main()
{
  unsigned char data;
  data=0;
  Write_One_Byte(0x20,0x21);
  data=Read_One_Byte(0x20);
}



最新回复

在进行写数据和读数据时最好把SDA写和读时的方向寄存器TRISC进行设置一下  详情 回复 发表于 2015-4-5 22:49
点赞 关注
 

回复
举报

1万

帖子

24

TA的资源

版主

沙发
 
应该是I2C时序上的问题,你可以在protues中用I2C仪表去检查一下I2C总线。

点评

第一次用这个~请问需要对单片机进行特殊的配置吗?  详情 回复 发表于 2015-3-13 11:53
 
 
 

回复

6

帖子

1

TA的资源

一粒金砂(中级)

板凳
 
dcexpert 发表于 2015-3-13 11:50
应该是I2C时序上的问题,你可以在protues中用I2C仪表去检查一下I2C总线。
第一次用这个~请问需要对单片机进行特殊的配置吗?



 
 
 

回复

1万

帖子

24

TA的资源

版主

4
 
pic16很久没有用过了,细节记得不清楚了。你这里主要就是IO模拟I2C,其他部分影响不大。

点评

很是蛋疼~还不确定这能不能实现读写的功能。  详情 回复 发表于 2015-3-13 15:33
 
 
 

回复

32

帖子

0

TA的资源

一粒金砂(中级)

5
 
写后要延时,写与读之间不能太紧凑!

点评

试了一下~还是不行。能帮我看看程序的问题出现在哪了吗?  详情 回复 发表于 2015-3-13 15:30
 
 
 

回复

6

帖子

1

TA的资源

一粒金砂(中级)

6
 
新新科技 发表于 2015-3-13 12:51
写后要延时,写与读之间不能太紧凑!


试了一下~还是不行。能帮我看看程序的问题出现在哪了吗?

 
 
 

回复

6

帖子

1

TA的资源

一粒金砂(中级)

7
 
dcexpert 发表于 2015-3-13 12:48
pic16很久没有用过了,细节记得不清楚了。你这里主要就是IO模拟I2C,其他部分影响不大。
很是蛋疼~还不确定这能不能实现读写的功能。



 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

8
 
在进行写数据和读数据时最好把SDA写和读时的方向寄存器TRISC进行设置一下
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表