久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4566|回復: 10
收起左側

單片機IIC連續讀的問題

[復制鏈接]
ID:437615 發表于 2019-9-2 22:59 | 顯示全部樓層 |閱讀模式
20黑幣
IIC連續讀的問題,請大家幫忙看一下這個程序為什么只能讀一個字節,哪里錯了,,還有程序有什么不太好的地方可以修改,不要重新寫的,要在我原有的程序修改并注釋,這樣我才能看的懂,謝謝


iic1.jpg iic2.jpg iic3.jpg iic4.jpg



#include"STC89C5xRC.H"
#define uchar unsigned char
#define uint unsigned int

uchar buf[4];



sbit scl=P3^6;
sbit sda=P3^7;
void start();
void Delay1(uchar);
void delay5us();
//void IIC_write(uchar ,uchar );        
uchar IIC_read(uchar );
void smg(uint);

void AT24C02_writeData(uchar ,uchar ,uchar*);
void AT24C02_readData(uchar ,uchar );


void main (void)
{
                                
                uchar arr[4]={3,4,5,6};

                start();
                AT24C02_writeData(0x00,sizeof(arr),arr);        
                Delay1(5);

        
                AT24C02_readData(0,2);
                smg(buf[1]);        
}

void start()               
{
        sda=1;
        scl=1;
        delay5us();
        sda=0;
        delay5us();
        scl=0;
}

void stop()                        
{
        sda=0;
        delay5us();
        scl=1;
        delay5us();
        sda=1;
        delay5us();
}
void ack()               
{
        uchar i=0;
        scl=1;
        delay5us();
        while((sda==1)&&(i<255))        
        {
                i++;
        }
        delay5us();
        scl=0;
}

void Send_ack()
{
        scl=0;
        sda=0;
        delay5us();
        scl=1;
        delay5us();
        scl=0;
}
void nack()                        
{
        scl=1;
        delay5us();
        sda=1;
        delay5us();
        scl=0;
        delay5us();
}

void write_1(uchar i)
{
        uchar j,temp;
        temp=i;
        
        for(j=8;j>0;j--)               
        {
                temp=temp<<1;               
                scl=0;                                       
                delay5us();
                sda=CY;                                       
                delay5us();
                scl=1;
                delay5us();               
        }
        scl=0;                                
        delay5us();
        sda=1;                                
        delay5us();        
}

uchar read_1()
{
        uchar i,j,k;
        scl = 0;
        delay5us();
        for(i=0; i<8; i++)
                {
                        scl = 1;                                       
                        delay5us();
                        if(sda==1) j = 1;        
                        else j = 0;
                        k = (k<<1)|j;               
                        scl = 0;                                
                        delay5us();
                }
        delay5us();
        return(k);               
}

void IIC_write(uchar address,uchar date)
{                                                                                
        start();                                       
        write_1(0xa0);               
        ack();
        write_1(address);        
        ack();
        write_1(date);               
        ack();
        stop();                                                
        Delay1(5);
}


/*uchar IIC_read(uchar address)        
{
        uchar i;
        start();                                                
        write_1(0xa0);                        
        ack();
        write_1(address);               
        ack();
        start();                                                
        write_1(0xa1);                        
        ack();
        i = read_1();                                
        nack();                                                        
        stop();                                                        
        Delay1(1);
        return(i);                                       
}        */

void delay5us()                        
{
        ; ; ;
}

void Delay1(uchar k)        //Ñóê±5ms
{
  uchar i, j;
        
                for(i=(18*k);i>0;i--)
                {
                        for(j=255;j>0;j--)
                        {}
                }
}


void AT24C02_writeData(uchar address,uchar numBytes,uchar* buf)
{                                                                                                                                                                          
    while(numBytes--)  
    {  
                                IIC_write(address++,*buf++);  
    }  
}  


void AT24C02_readData(uchar beginAddr, uchar dataSize)
{  
                uchar i=0;
               
                start();               
    write_1(0xa0);        
    ack();            
    write_1(beginAddr);   
    ack();            
    start();               
    write_1(0xa1);        
    ack();            

        
        
        while(dataSize--)         
    {  
                                
                                *(buf+i)=read_1();
                                        i++;
                                 Send_ack();
    }
                nack();
    stop();  
                Delay1(1);
               
               
}  

回復

使用道具 舉報

ID:373388 發表于 2019-9-3 10:11 | 顯示全部樓層
不是只讀一個,你是只顯示一位
回復

使用道具 舉報

ID:437615 發表于 2019-9-3 11:07 | 顯示全部樓層
xhaity 發表于 2019-9-3 10:11
不是只讀一個,你是只顯示一位

是這樣的,我把4個都寫進去,然后再讀出來,我先顯示buf[0]是正確的,然后我又顯示buf[1],結果就不對了
回復

使用道具 舉報

ID:365802 發表于 2019-9-3 12:52 | 顯示全部樓層
嗯, 你看看是不是操作太快導致的, 我之前就遇到過.
http://www.zg4o1577.cn/bbs/dpj-151160-1.html
回復

使用道具 舉報

ID:437615 發表于 2019-9-3 17:52 | 顯示全部樓層
ping264888 發表于 2019-9-3 12:52
嗯, 你看看是不是操作太快導致的, 我之前就遇到過.
http://www.zg4o1577.cn/bbs/dpj-151160-1.html

現象是這樣,寫進去后,我用單字節讀,就沒問題,比如

                buf[0]=IIC_read(0 );
                buf[1]=IIC_read(1 );
                buf[2]=IIC_read(2 );
                buf[3]=IIC_read(3 );

這樣就行,所以覺得還是連讀函數有問題
回復

使用道具 舉報

ID:365802 發表于 2019-9-3 18:08 | 顯示全部樓層
zhy123654 發表于 2019-9-3 17:52
現象是這樣,寫進去后,我用單字節讀,就沒問題,比如

                buf[0]=IIC_read(0 );

建議讀操作之間加一些延時嘗試一下
回復

使用道具 舉報

ID:437615 發表于 2019-9-3 19:07 | 顯示全部樓層
延時的問題試了,除非還有什么我不知道的地方,不然還是不行
回復

使用道具 舉報

ID:437615 發表于 2019-9-3 21:35 | 顯示全部樓層
不用想了,沒辦法,最后用單字節讀再加個循環搞定,就是有點浪費資源
回復

使用道具 舉報

ID:540236 發表于 2019-9-4 20:00 | 顯示全部樓層
void AT24C02_readData(uchar beginAddr, uchar dataSize)
{  
                uchar i=0;
               
                start();               
    write_1(0xa0);        
    ack();            
    write_1(beginAddr);   
    ack();            
    start();               
    write_1(0xa1);        
    ack();            

        
        
        while(dataSize--)          //你上面main里給你參數是2,就是里面循環了兩次
    {  
                                
                                *(buf+i)=read_1();
                                        i++;
                                 Send_ack(); //讀兩次是發一個ACK加一個Nack;
    }
                nack();
    stop();  
                Delay1(1);
               
               
}  
回復

使用道具 舉報

ID:111517 發表于 2019-11-1 15:08 | 顯示全部樓層
樓主問題解決了嗎?我也遇見了同樣的問題
回復

使用道具 舉報

ID:633908 發表于 2019-11-1 17:08 | 顯示全部樓層
很好,只要端口反轉時間不低于要求就行
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品国产精品国自产在线 | 欧美色视频免费 | 欧美最猛黑人 | 精品毛片 | 久久久一区二区 | 国产精品久久久久久久久久久免费看 | 999视频 | 韩日在线视频 | 国产精品视频久久久久 | 91精品久久久久久久久久入口 | 在线免费观看黄视频 | 亚洲有码转帖 | 精品国产乱码一区二区三区a | 国产精品成人品 | 一区二区三区在线 | 日本黄色大片免费看 | 亚洲www啪成人一区二区 | 久久综合久色欧美综合狠狠 | 日韩电影一区 | 精品视频国产 | 国产精品视频网 | 亚洲国产精品成人 | 国产一区91精品张津瑜 | 一区二区三区av | 91激情视频 | 最新中文字幕第一页视频 | 久久爱综合 | 一区二区中文字幕 | 狠狠ri| 精品成人在线 | 中文在线一区 | 国产精品大片 | 91最新视频 | 一区二区三区四区免费视频 | 日本偷偷操 | 蜜桃视频在线观看www社区 | 欧美xxxx性xxxxx高清 | 美女久久 | 一区精品视频 | 国产成人a亚洲精品 | 一级毛片色一级 |