找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7317|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

IIC器件的讀寫操作,大家看看這個所謂的“教程”!

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:7485 發(fā)表于 2012-9-3 11:26 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式

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

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

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

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

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

 

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


 

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

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

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

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

 

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


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


下面就是這個“教程”的摘錄:

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

 

第十四講 IC卡(24C01)

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

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


#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()      //啟動讀寫時序

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

  35


SDA_IC_ C ARD=1; 

    SCL_IC_ C ARD=1; 

    SDA_ IC _ C AR D= 0 ;             // 啟動start

    SCL_IC_ C ARD=0; 

}

void stop()      //停止操作

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

 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 ();       // 啟動

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

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

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

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

  36


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

      st a rt ();       // 啟動

    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 次讀取一個字節(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 ();       // 啟動

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

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

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

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

      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ù)

  37


{

 int i;

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

}


[此貼子已經(jīng)被作者于2012-10-13 14:54:07編輯過]
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏5 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:21069 發(fā)表于 2020-3-23 14:04 | 只看該作者
學(xué)接口協(xié)議最好不要死記硬背代碼,先學(xué)會看懂傳輸波形,時鐘波形,代碼就能寫出個八成了
回復(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檢測,我寫程序就是這樣的,開發(fā)前期會再第九周期檢測一下從器件是否ack,

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

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

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

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