打印

请 问大家一个IIC总线的问题,希望大家说说呀

[复制链接]
1518|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
雨人浪浪|  楼主 | 2010-1-5 17:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 雨人浪浪 于 2010-1-6 21:26 编辑

我自己编的程序老是读不出数据,这是别人的一个程序有些不懂请教大家,也是认为最重要的问题,也就是应答信号方面的问题,问题我标注在程序旁边呢。
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define OP_WRITE 0xa0          // 器件地址以及写入操作
#define OP_READ  0xa1           // 器件地址以及读取操作
uchar code display[2]={0xfe,0xfd};
sbit SDA = P2^3;
sbit SCL = P2^2;
void start();
void stop();
uchar shin();
bit shout(uchar write_data);
void write_byte( uchar addr, uchar write_data);
void fill_byte(uchar fill_size,uchar fill_data);
void delayms(uint ms);
uchar read_current();
uchar read_random(uchar random_addr);
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
/**********************************************************/
main(void)
{
   uchar i;
   SDA = 1;
   SCL = 1;
   fill_byte(2,0xff);          // 将前72字节填充0xff
   for(i = 0 ; i < 2; i++)    //写入显示代码到AT24C02
    {
      write_byte(i,display);
    }
   for(i =0 ;i <2 ; i++)      //从AT24C02移出数据送到P0口显示
   {
      P0 = read_random(i);
      delayms(350);
   }  
}
/**********************************************************/
void start()
//开始位
{
   SDA = 1;
   SCL = 1;
   delayNOP();
   SDA = 0;
   delayNOP();
   SCL = 0;
}
/**********************************************************/
void stop()
// 停止位
{
   SDA = 0;
   delayNOP();
   SCL = 1;
   delayNOP();
   SDA = 1;
}
/**********************************************************/
uchar shin()
// 从AT24C02移出数据到MCU
{
   uchar i,read_data;
   for(i = 0; i < 8; i++)
   {
    SCL = 1;
    read_data <<= 1;
    read_data |= SDA;
    SCL = 0;
   }
    return(read_data);
}
/**********************************************************/
bit shout(uchar write_data)      问题就在这,这个函数里面有应答信号,想问下应答
// 从MCU移出数据到AT24C02     信号一定要有吗?还有假如它返回一个非应答信号单
{                                           片机会做出什么反应(而单片机想要一个应答信号)
   uchar i;                                 请根据整个程序作一些回答。
   bit ack_bit;
   for(i = 0; i < 8; i++)   // 循环移入8个位  我个人的想法,大家看看对不对,假如莫个程序调用了它,假如它返回一个非应答信号,单片机会不会自动识别,并重新开始执行 return ack_bit上面的语句直到返回应答信号,执行下面的语句。(个人感觉它的返回值没有付给任何变量,所以就认为给单片机看的,让它来识别)。希望大家讲讲IIC总线编程要注意的地方。
   {
     SDA = (bit)(write_data & 0x80);
    _nop_();
    SCL = 1;
    delayNOP();
    SCL = 0;
    write_data <<= 1;
   }
   SDA = 1;                     // 读取应答
   delayNOP();
   SCL = 1;
   delayNOP();
   ack_bit = SDA;
   SCL = 0;
   return ack_bit;            // 返回AT24C02应答位
}
/**********************************************************/
void write_byte(uchar addr, uchar write_data)
// 在指定地址addr处写入数据write_data
{
   start();
   shout(OP_WRITE);
   shout(addr);
   shout(write_data);
   stop();
   delayms(10);          // 写入周期
}
/**********************************************************/
void fill_byte(uchar fill_size,uchar fill_data)
// 填充数据fill_data到EEPROM内fill_size字节
{
   uchar i;
   for(i = 0; i < fill_size; i++)
   {
     write_byte(i, fill_data);
   }
}
/**********************************************************/
uchar read_current()
// 在当前地址读取
{
   uchar read_data;
   start();
   shout(OP_READ);
   read_data = shin();
   stop();
   return read_data;
}
/**********************************************************/
uchar read_random(uchar random_addr)
// 在指定地址读取
{
   start();
   shout(OP_WRITE);
   shout(random_addr);
   return(read_current());
}
/**********************************************************/
void delayms(uint ms)  
// 延时子程序
{
   uchar k;
   while(ms--)
   {
      for(k = 0; k < 120; k++);
   }
}

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

37

帖子

0

粉丝