搜索
bottom↓
回复: 0

请教AT24C64的IIC协议问题

[复制链接]

出0入0汤圆

发表于 2010-4-21 22:49:30 | 显示全部楼层 |阅读模式
我从伟纳单片机论坛找了一个完整的AT24C64读写程序,光把几个关键操作函数贴出来,
这个程序已经成功的用到了我的设计当中,在此对原作者gguoqing表示感谢!

现在有些疑问想请教一下您,
1,按照IIC协议,IIC总线启动时会在SCL为高的时候将SDA拉低,然后将SCL拉低,而总线关闭的时候,会在SCL为高的时候将SDA释放,  而这个程序中,总线关闭操作函数中最后将两条线全部拉低了, 这样的话,会不会造成什么问题呢?

2,按字节发送的操作函数中,每发送一个字节后应该等待应答信号而不是发应答信号吧?
这些都和IIC协议内容不符,但程序确确实实可以用,这点很是奇怪,请指点一下吧~谢谢。



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

  起始信号子函数

  在 SCL 高电平期间,SDA 发生负跳变。

**********************************************************/
void I2C_start()

{
   SDA = 1;
   SCL = 1;
   delayNOP();
   SDA = 0;
   delayNOP();
   SCL = 0;
}

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

  停止信号子函数

  在 SCL 高电平期间,SDA 发生正跳变。

**********************************************************/
void I2C_stop()
{
   SDA = 0;
   SCL = 1;
   delayNOP();
   SDA = 1;
   delayNOP();
   SCL = 0;
   SDA = 0;
}

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

  I2C总线初始化子函数

**********************************************************/
void  I2C_init()
{
   SCL = 0;
   I2C_stop();
}

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

  应答信号子函数

  在 SDA 低电平期间,SCL 发生一个正脉冲。

**********************************************************/
void  I2C_Ack()
{
   SDA = 0;
   SCL = 1;
   delayNOP();
   SCL = 0;
   SDA = 1;
}

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

  非应答信号子函数

  在 SDA 高电平期间,SCL 发生一个正脉冲。

**********************************************************/
void  I2C_NAck()
{
   SDA = 1;
   SCL = 1;
   delayNOP();
   SCL = 0;
   delayNOP();
   SDA = 0;
}

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

  读字节数据子函数

  MCU从IIC读出数据

**********************************************************/
uchar ReadByte()
{
   uchar i,read_data;
   read_data=0x00;
   SDA=1;                     //置数据线为输入方式
   for(i = 0; i < 8; i++)
   {     
     SCL = 1;
     read_data <<= 1;
     read_data |= SDA;
     delayNOP();
     SCL = 0;
delayNOP();
   }
   SCL = 0;
   delayNOP();
   return(read_data);
}

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

  写字节数据子函数

  MCU写数据到IIC,

  每写完一个字节数据后,发送一次应答信号。

**********************************************************/
void WriteByte(uchar write_data)
{
   uchar i;
   for(i = 0; i < 8; i++)    //循环移入8个位
   {
     SDA = (bit)(write_data & 0x80);
     _nop_();
     _nop_();     
     SCL = 1;
     delayNOP();
     SCL = 0;
     write_data <<= 1;
   }
   I2C_Ack();  //应答信号
}

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

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-7-23 04:17

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

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