打印
[PIC®/AVR®/dsPIC®产品]

IIC总线无法读取两个数据

[复制链接]
1557|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
QD_ice|  楼主 | 2015-5-13 15:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用模拟IIC总线读取24c01中的数据时,只能读取一个数据,第二个读取的数据显示为ff,请问这是为什么?
沙发
gmm2015| | 2015-5-13 16:40 | 只看该作者
程序问题。请贴代码。

使用特权

评论回复
板凳
QD_ice|  楼主 | 2015-5-14 09:30 | 只看该作者
gmm2015 发表于 2015-5-13 16:40
程序问题。请贴代码。

#include<pic.h>

#define address 0xa
#define nop() asm("nop")
#define OP_READ 0xa3    /*器件地址以及读取操作*/
#define OP_WRITE 0xa0   /*器件地址以及写入操作*/
#define _XTAL_FREQ 4000000UL

/*端口定义*/
#define SCL RC3
#define SDA RC4
#define SCLIO TRISC3
#define SDAIO TRISC4
unsigned char eepromdata;


/*延时子程序*/
void delay()
{
        int i;
        for(i=0;i<100;i++)
        {;}
}

/*开始信号*/
void start()
{
        SDA=1;
        nop();
        SCL=1;
        nop();nop();nop();nop();nop();
        SDA=0;
        nop();nop();nop();nop();nop();
        SCL=0;
        nop();nop();;
}

/*停止信号*/
void stop()
{
        SDA=0;
        nop();
        SCL=1;
        nop();nop();nop();nop();nop();
        SDA=1;
        nop();nop();nop();nop();
}

/*读取数据*/
unsigned char shin()
{
        unsigned char i,read_data;
        for(i=0;i<8;i++)
        {
                nop();nop();nop();
                SCL=1;
                nop();nop();
                read_data<<=1;
                if(SDA==1)
                        read_data=read_data+1;
                nop();
                SCL=0;
        }
        return (read_data);
}

/*函数功能:向EEPROM写数据  
  入口函数:write_data  
  出口函数:ack_bit */
bit shout(unsigned char write_data)
{
        unsigned char i;
        unsigned char ack_bit;
        for(i=0;i<8;i++)
        {
                if(write_data&0x80)
                        SDA=1;
                else
                        SDA=0;
                        nop();
                SCL=1;
                nop();nop();nop();nop();nop();
                        SCL=0;       
                nop();
                        write_data<<=1;
        }
        nop();nop();
        SDA=1;
        nop();nop();
        SCL=1;
        nop();nop();nop();
        ack_bit=SDA;
        SCL=0;
        nop();nop();
        return ack_bit;/*返回24cxx的应答位*/
}

/*函数功能:向指定地址写数据
  入口函数:addr,write_data*/

void write_byte(unsigned char addr,unsigned char write_data)
        {
        start();
        shout(OP_WRITE);
        shout(addr);
        SDAIO=0; /*在写入数据前SDA应设置为输出*/
        shout(write_data);
        stop();
        delay();
}

/*函数功能:向指定地址读数据
  入口函数:random_addr,
  出口函数:read_data*/
unsigned char read_random(unsigned char random_addr)
{
        unsigned char read_data;
        start();
        shout(OP_WRITE);
        shout(random_addr);
        start();
        shout(OP_READ);
        SDAIO=1;
        read_data=shin();
        stop();
        return(read_data);
}

void Serial_port_init()
{       
        TXSTA=0x24;
        RCSTA=0x90;
        SPBRG=0x19;
        GIE=1;
        PEIE=1;
        RCIE=1;//打开中断


}

void main()
{
        Serial_port_init();
        TRISC=0x00;
        eepromdata=read_random(0x66);
    delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay();
        delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay();
        delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay();delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay();delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay();
        delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay();       
        TXREG=eepromdata;
        eepromdata=read_random(0x68);
    delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay();
        delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay();
        delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay();delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay();delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay();
        delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay();       
        TXREG=eepromdata;
       
}


void interrupt com()
{
        if(RCIF)        //确定可以进入中断
        {       
        RCIF=0;

        }
}

代码如下,请看一下,谢谢你!

使用特权

评论回复
地板
yewuyi| | 2015-5-14 09:44 | 只看该作者
检查应答信号的处理。

使用特权

评论回复
5
QD_ice|  楼主 | 2015-5-14 09:46 | 只看该作者
yewuyi 发表于 2015-5-14 09:44
检查应答信号的处理。

好的,谢谢

使用特权

评论回复
6
MOn51| | 2015-5-18 12:50 | 只看该作者
QD_ice 发表于 2015-5-14 09:30
#include

#define address 0xa
delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay();
         delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay();
         delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay();delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay();delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay();
         delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay(); delay();        
代码太乱了。延时可以用一个函数代替?

使用特权

评论回复
7
lx911gt| | 2015-5-23 08:54 | 只看该作者
你这一堆delay我当时就看不下去了,做一个带参数的delay不就好了么....

使用特权

评论回复
8
huarana| | 2015-5-27 09:21 | 只看该作者
lx911gt 发表于 2015-5-23 08:54
你这一堆delay我当时就看不下去了,做一个带参数的delay不就好了么....

呵呵 是啊。非要用这个的话 好歹也可以用个for循环嘛 - -

使用特权

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

本版积分规则

2

主题

4

帖子

0

粉丝