【解析新特性】300W单路输出工业电源>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 请教!关于I2C总线发收数据的程序的问题

共8条 1/1 1 跳转至

请教!关于I2C总线发收数据的程序的问题

助工
2013-08-14 16:31:05    评分

我的单片机芯片是 AT89S52 .


以下程序是想通过I2C总线与24C08存储器通信。首先对24C08存储器写入数据,再向24C08存储器读出数据,以该数据来点亮LED灯。
程序如下:
#include<reg52.h>
#include <intrins.h>
sbit scl=P3^4;
sbit sda=P3^5;

void delay()
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
void start()
{
sda=1;
scl=1;  
delay();
sda=0;
delay();
scl=0;
}
void stop()
{
sda=0;
delay();
scl=1;
delay();
sda=1;
delay();
}
void ask()
{  unsigned char i;
sda=1;
delay();        
scl=1;
delay();
while((sda==1)&&(i<250))i++;
scl=0;
delay();
}
void write(unsigned char y)
{  unsigned char i;
    for(i=0;i<8;i++)
{

y=y<<1;
sda=CY;
    delay();
scl=1;
    delay();
scl=0;
    delay();

}
}

unsigned char read()
{ unsigned char t=0;
    unsigned char X;
unsigned char i;
    for(i=0;i<8;i++)
{
  scl=1;
     delay();
  X=sda;
     delay();
  t=t<<1;
  t=X|t;
  scl=0;
     delay();
 
}
  return t;

void main()
{
sda=1;
scl=1;
start();
write(0xa0);
ask();
write(3);
ask();
write(0x7f);
ask();
stop();
delay();
start();
write(0xa0);
ask();
write(3);
ask();
start();
write(0xa1);
ask();
P0=read();
delay();
stop();
while(1);
}

最终结果LED灯  P0.0、P0.1不亮,P0.2~0.7都亮,显然结果错误。我写入的数据是 0x7f 而读出来确不是。哪位高手帮忙解答一下?感激不尽!




关键词: I2C     LED    

助工
2013-08-15 08:24:14    评分
2楼
你得仔细核对你的操作时序是否正确,判断是没写进去,还是读不出出来,网上源代码也较多,你可以弄个试试!

高工
2013-08-15 13:40:04    评分
3楼

1) I2C是慢速协议,一般100K/S--400K/S,你的机器周期是多少,是否delay延时不够?

2) SDA是双向数据线,有没有在读,写,应答时候做输入输出切换


高工
2013-08-15 13:41:21    评分
4楼
补充,上拉电阻有没有接

菜鸟
2013-08-19 08:28:16    评分
5楼
向24C08芯片写数据后,延时一段时间,才能读数据吧

菜鸟
2013-08-20 22:24:03    评分
6楼
正解啊!虽说我这个程序也有延时,但是延时不够长,现在改成更长的延时之后就成功了。谢谢!

菜鸟
2013-08-21 08:43:35    评分
7楼
那你怎么能保证你写进去了哦,至少得通过读验证啊!

助工
2013-08-22 08:21:15    评分
8楼
这是我的 单片机stc89c52
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit scl=P2^1;
sbit sda=P2^0;
/***************************************************************************
                                                                                                延时函数
**************************************************************************/
void delay()
{ ;; }
void delay1(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}
/************************************************************************
                                                                                        初始化函数
*************************************************************************/
void init()
{
        sda=1;
        delay();
        scl=1;
        delay();
}
/*************************************************************************
                                                                                        启动函数
************************************************************************/
void start()
{
        sda=1;
        delay();
        scl=1;
        delay();
        sda=0;
        delay();
}
/***************************************************************************
                                                                                停止函数
************************************************************************/
void stop()
{
        sda=0;
        delay();
        scl=1;
        delay();
        sda=1;
        delay();
}
/*********************************************************************
                                                                                        应答函数
********************************************************************/
void res()
{
        uchar i=0;
        scl=1;
        delay();
        while((sda==1)&&(i<250))
                i++;
        scl=0;
        delay();        
}
/**********************************************************************
                                                                                        写函数
*********************************************************************/
void write_byte(uchar date)
{
        uchar temp,i;
        temp=date;
        for(i=0;i<8;i++)
        {
                temp=temp<<1;
                scl=0;
                delay();
                sda=CY;
                delay();
                scl=1;
                delay();
        }
        scl=0;
        delay();
        sda=1;
        delay();
}
/*****************************************************************
                                                                                读函数
*****************************************************************/
uchar read_byte()
{
        uchar i,k;
        scl=0;
        delay();
        sda=1;
        delay();
        for(i=0;i<8;i++)
        {
                scl=1;
                delay();
                k=(k<<1)|sda;
                scl=0;
                delay();
        }
        return k;
}
/**************************************************************
                                                                        指定定制写一个字符
***************************************************************/
void write_add(uchar add,uchar date)
{
        start();
        write_byte(0xa0);
        res();
        write_byte(add);
        res();
        write_byte(date);
        res();
        stop();
}
/*************************************************************
                                                                相应地址读字符
**************************************************************/
uchar read_add(uchar add)
{
        uchar date;
        start();
        write_byte(0xa0);
        res();
        write_byte(add);
        res();
        start();
        write_byte(0xa1);
        res();
        date=read_byte();
        return date;
}
/*********************************************************
                                                                                主函数
********************************************************/
void main()
{
        init();
        write_add(0,0xfe);
        delay1(100);
        P1=read_add(0);
        while(1);
}

共8条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]