找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 7426|回復(fù): 4
收起左側(cè)

IIC器件的讀寫操作,大家看看這個(gè)所謂的“教程”。

[復(fù)制鏈接]
ID:7485 發(fā)表于 2012-9-3 11:26 | 顯示全部樓層 |閱讀模式

看看下面的這段,是從***的“教程”里摘錄而來,如果是筆誤當(dāng)然無須吹毛求疵。

這里,無論是“接收”,還是“發(fā)送”,都是“ACK”, 其“ACK”的內(nèi)容是(SCL_IC_ C ARD=1;      SCL_IC_ C ARD=0;”)就這些。這樣能行嗎?這個(gè)“老師”連基本的IIC協(xié)議都沒弄懂。這大概不會(huì)是筆誤吧?

在IIC協(xié)議中,不管是主控器件還是從器件,1、向總線發(fā)送一個(gè)字節(jié)數(shù)據(jù)后,就要檢查應(yīng)答信號(hào),看看接收器件是否“字節(jié)接受完成”。

                                                      2、接收器件正確接收到一個(gè)字節(jié)的數(shù)據(jù)后,也要發(fā)送一個(gè)應(yīng)答信號(hào)(1bit),告訴發(fā)送器件“字節(jié)接收完成”

如果接收器件接收不正確,則不會(huì)發(fā)送應(yīng)答信號(hào)。發(fā)送器件就檢測(cè)不到“應(yīng)答信號(hào)”,這時(shí)就要從“開始”步驟重來。

 

這里就有了這么幾個(gè)環(huán)節(jié):“應(yīng)答信號(hào)(1bit,低位)”、“非應(yīng)答信號(hào)(1bit,高位)、“檢測(cè)應(yīng)答信號(hào)”。


 

讀的流程:1發(fā)送開始信號(hào)-->2發(fā)送器件地址(含“寫”指令位)-->3檢測(cè)應(yīng)答-->4發(fā)送字節(jié)地址-->5檢測(cè)應(yīng)答-->6發(fā)送開始信號(hào)(含“讀”指令位)

              -->7檢測(cè)應(yīng)答-->8讀一個(gè)字節(jié)-->9發(fā)送應(yīng)答信號(hào)-->......(重復(fù)第8步)讀第2~N字節(jié))-->發(fā)送非應(yīng)答信號(hào)-->發(fā)送停止信號(hào)

寫的流程:1發(fā)送開始信號(hào)-->2發(fā)送器件地址(含“寫”指令位)-->3檢測(cè)應(yīng)答-->4發(fā)送字節(jié)地址-->5檢測(cè)應(yīng)答-->6寫一個(gè)字節(jié)-->7檢測(cè)應(yīng)答信號(hào)

              -->(......(重復(fù)第6步)寫第2~N字節(jié)-->(重復(fù)第7步)檢測(cè)應(yīng)答信號(hào)-->)發(fā)送停止信號(hào)

 

上面僅就多字節(jié)讀寫做了簡(jiǎn)單的描述,如果是單字節(jié)讀、寫括號(hào)內(nèi)不用。

。


特別說明:無論哪一個(gè)“檢測(cè)應(yīng)答信號(hào)”不成功,都要返回到“發(fā)送開始信號(hào)”處,重新開始。 如果是大容量的,發(fā)送地址分高位、低位2次,都要“檢測(cè)應(yīng)答”。


下面就是這個(gè)“教程”的摘錄:

*****************(鄭重提醒:這是一個(gè)不正確的程序,千萬不要套用)******************                                                    

 

第十四講 IC卡(24C01)

  在日常生活中,IC卡的使用越來越廣泛,而且還有進(jìn)一步擴(kuò)大的趨勢(shì)。因此

有必要掌握這方面的知識(shí),下面以24C01 為例,簡(jiǎn)單地介紹一般使用方法。


#include <reg52.h>

#include <intrins.h>


sb i t   SC L _ IC _ C AR D= P1 ^3 ;                 

sb i t   SDA_ IC _ C AR D= P1 ^4 ;                    

sbit WP_IC_CARD =P1^7;

bdata char com_data;

sbit m o s_bit=com_data^7;

sbit low_bit=com_data^0;


unsigned  char  data  display _buf fer[8];              

v o i d   d e l a y(i n t   n );                                

unsigned char rd_24c01(char a);

void w r_24c01(char a,char b);


ma in()

{

unsigned char i;

 WP_IC_CARD=1;

  for (i=0;i<=7;i++) {display _buf fer=rd_24c01(i);delay (250);}

  for (i=0;i<=7;i++) {w r_24c01(i,display_buf fer);delay (250);}

 while(1);

}


void start()      //啟動(dòng)讀寫時(shí)序

{          // 圖4-22 (c )開始、結(jié)束脈沖時(shí)序

  35


SDA_IC_ C ARD=1; 

    SCL_IC_ C ARD=1; 

    SDA_ IC _ C AR D= 0 ;             // 啟動(dòng)start

    SCL_IC_ C ARD=0; 

}

void stop()      //停止操作

{          // 圖4-22 (c )開始、結(jié)束脈沖時(shí)序

 SDA_IC_ C ARD=0; 

    SCL_IC_ C ARD=1; 

    SDA_IC_ C ARD=1; 

}

void ack()      //應(yīng)答函數(shù)

{          

 SCL_IC_ C ARD=1; 

    SCL_IC_ C ARD=0; 

}

void shift8(char  a)    //8位移位輸出

data unsigned char i;

    com _data=a;

 for(i=0;i<8;i++)

    { 

    SDA_IC_CARD=mo s_bit;

    S C L _ IC _ C AR D= 1 ; 

    S C L _ IC _ C AR D= 0 ; 

    com _data=com_data*2;

    }

}

unsigned char rd_24c01(char a)  // 讀IC 卡函數(shù)

data unsigned char i,comma nd;

    SDA_IC_ C ARD=1; 

    SCL_IC_ C ARD=0; 

      st a rt ();       // 啟動(dòng)

    com ma nd=0X A0 ;      //160;

    shift8(comma nd);      // 送出器件地址       第一步

      a c k ();       // 應(yīng)答

      shift8(a);      //送出存儲(chǔ)器地址

  36


      a c k ();       // 應(yīng)答

      st a rt ();       // 啟動(dòng)

    com ma nd=0X A1       //161;

    shift8(comma nd);      // 送出器件地址              第二步

      a c k ();       // 應(yīng)答

    SDA_IC_ C ARD=1;     //

    for(i=0;i<8;i++)      // 循環(huán)8 次讀取一個(gè)字節(jié)

      { 

      com _data=com_data*2;

  SCL_IC_ C ARD=1; 

      lo w_b it=SDA_ IC_ C ARD;      讀取數(shù)據(jù)

      SC L _ IC _ C AR D= 0 ; 

      }

      st o p ();       // 停止操作

    return(com _data);

}


void w r_24c01(char a,char b)   // 寫IC 卡函數(shù)

data unsigned char comma nd;

    WP_IC_CARD=0;

 _nop_();

 SDA_IC_ C ARD=1; 

    SCL_IC_ C ARD=0; 

      st a rt ();       // 啟動(dòng)

    com ma nd=0X A0 ;      //160;

    shift8(comma nd);      // 送出器件地址             寫IC 卡函數(shù)

      a c k ();       // 應(yīng)答

      shift8(a);      //送出存儲(chǔ)器地址

      a c k ();       // 應(yīng)答

      shift8(b);      //送出欲寫入的數(shù)據(jù)

      a c k ();       // 應(yīng)答

      st o p ();       // 停止操作

 _nop_();

 WP_IC_CARD=1;

}


void delay(int n)    // 延時(shí)函數(shù)

  37


{

 int i;

 for (i=1;i<=n;i++){;}

}


[此貼子已經(jīng)被作者于2012-10-13 14:54:07編輯過]
回復(fù)

使用道具 舉報(bào)

ID:21069 發(fā)表于 2020-3-23 14:04 | 顯示全部樓層
學(xué)接口協(xié)議最好不要死記硬背代碼,先學(xué)會(huì)看懂傳輸波形,時(shí)鐘波形,代碼就能寫出個(gè)八成了
回復(fù)

使用道具 舉報(bào)

ID:344848 發(fā)表于 2024-5-20 21:40 | 顯示全部樓層
使用IIC協(xié)議分析儀,可以發(fā)現(xiàn)程序是否規(guī)范
回復(fù)

使用道具 舉報(bào)

ID:996773 發(fā)表于 2024-5-21 11:06 | 顯示全部樓層
不一定需要ACK檢測(cè),我寫程序就是這樣的,開發(fā)前期會(huì)再第九周期檢測(cè)一下從器件是否ack,

但事實(shí)成品時(shí)候如果從器件沒有接入單片機(jī),會(huì)連程序后面的液晶屏都無法點(diǎn)亮啟動(dòng),無法驗(yàn)證

按鍵和其他部分是否正常,所以程序成熟以后會(huì)不予理睬是否ack,不去檢測(cè),也能一樣正常運(yùn)行
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表