1.I2C協議


1.I2C協議
??
?? 2條雙向串行線,一條數據線SDA,一條時鐘線SCL。
?? SDA傳輸數據是大端傳輸,每次傳輸8bit,即一字節。
?? 支持多主控(multimastering),任何時間點只能有一個主控。
?? 總線上每個設備都有自己的一個addr,共7個bit,廣播地址全0.
?? 系統中可能有多個同種芯片,為此addr分為固定部分和可編程部份,細節視芯片而定,看datasheet。

1.1 I2C位傳輸

?? 數據傳輸:SCL為高電平時,SDA線若保持穩定,那么SDA上是在傳輸數據bit;
???????????? 若SDA發生跳變,則用來表示一個會話的開始或結束(后面講)
?? 數據改變:SCL為低電平時,SDA線才能改變傳輸的bit



1.2 I2C開始和結束信號
???
?? 開始信號:SCL為高電平時,SDA由高電平向低電平跳變,開始傳送數據。
?? 結束信號:SCL為高電平時,SDA由低電平向高電平跳變,結束傳送數據。

??

1.3 I2C應答信號
???
?? Master每發送完8bit數據后等待Slave的ACK。
?? 即在第9個clock,若從IC發ACK,SDA會被拉低。
?? 若沒有ACK,SDA會被置高,這會引起Master發生RESTART或STOP流程,如下所示:



1.4 I2C寫流程

寫寄存器的標準流程為:
1.??? Master發起START
2.??? Master發送I2C addr(7bit)和w操作0(1bit),等待ACK
3.??? Slave發送ACK
4.??? Master發送reg addr(8bit),等待ACK
5.??? Slave發送ACK
6.??? Master發送data(8bit),即要寫入寄存器中的數據,等待ACK
7.??? Slave發送ACK
8.??? 第6步和第7步可以重復多次,即順序寫多個寄存器
9.??? Master發起STOP

寫一個寄存器




寫多個寄存器

1.5 I2C讀流程

讀寄存器的標準流程為:
1.??? Master發送I2C addr(7bit)和w操作1(1bit),等待ACK
2.??? Slave發送ACK
3.??? Master發送reg addr(8bit),等待ACK
4.??? Slave發送ACK
5.??? Master發起START
6.??? Master發送I2C addr(7bit)和r操作1(1bit),等待ACK
7.??? Slave發送ACK
8.??? Slave發送data(8bit),即寄存器里的值
9.??? Master發送ACK
10.??? 第8步和第9步可以重復多次,即順序讀多個寄存器

讀一個寄存器


讀多個寄存器



2. PowerPC的I2C實現

Mpc8560的CCSR中控制I2C的寄存器共有6個。




2.1 I2CADR 地址寄存器

CPU也可以是I2C的Slave,CPU的I2C地址有 I2CADR指定

?

2.2 I2CFDR 頻率設置寄存器

The serial bit clock frequency of SCL is equal to the CCB clock divided by the divider.
用來設置I2C總線頻率



2.3 I2CCR 控制寄存器



MEN: Module Enable.??? 置1時,I2C模塊使能
MIEN:Module Interrupt Enable. 置1時,I2C中斷使能。
MSTA:Master/slave mode. 1 Master mode,0 Slave mode.
??? ??? 當1->0時,CPU發起STOP信號
??? ??? 當0->1時,CPU發起START信號
MTX:Transmit/receive mode select.0 Receive mode,1 Transmit mode
TXAK:Transfer acknowledge. 置1時,CPU在9th clock發送ACK拉低SDA
RSTA:Repeat START. 置1時,CPU發送REPEAT START
BCST:置1,CPU接收廣播信息(信息的slave addr為7個0)

2.4 I2CSR 狀態寄存器




MCF:0? Byte transfer is in process
???? 1? Byte transfer is completed

MAAS:當CPU作為Slave時,若I2CDR與會話中Slaveaddr匹配,此bit被置1

MBB:0 I2C bus idle??
???? 1 I2C bus busy

MAL:若置1,表示仲裁失敗
BCSTM:若置1,表示接收到廣播信息

SRW:When MAAS is set, SRW indicates the value of the R/W command bit of the calling address, which is sent from the master.
?? 0 Slave receive, master writing to slave
?? 1 Slave transmit, master reading from slave

MIF:Module interrupt. The MIF bit is set when an interrupt is pending, causing a processor interrupt request(provided I2CCR[MIEN] is set)

RXAK:若置1,表示收到了ACK

2.5 I2CDR 數據寄存器



這個寄存器儲存CPU將要傳輸的數據。


3. PPC-Linux中I2C的實現

?
? 內核代碼(linux-2.6.24)中,通過I2C總線存取寄存器的函數都在文件drivers/i2c/busses/i2c-mpc.c中
? 最重要的函數是mpc_xfer.
??
  1. static?int?mpc_xfer(struct?i2c_adapter?*adap,?struct?i2c_msg?*msgs,?int?num)
  2. {
  3. ????struct?i2c_msg?*pmsg;
  4. ????int?i;
  5. ????int?ret?=?0;
  6. ????unsigned?long?orig_jiffies?=?jiffies;
  7. ????struct?mpc_i2c?*i2c?=?i2c_get_adapdata(adap);

  8. ????mpc_i2c_start(i2c);????// 設置I2CCR[MEN], 使能I2C module?

  9. ????/* Allow bus up to 1s to become not busy */
  10. ????//一直讀I2CSR[MBB],等待I2C總線空閑下來
  11. ????while?(readb(i2c->base?+?MPC_I2C_SR)?&?CSR_MBB)?{
  12. ????????if?(signal_pending(current))?{
  13. ????????????pr_debug("I2C: Interrupted\n");
  14. ????????????writeccr(i2c,?0);
  15. ????????????return?-EINTR;
  16. ????????}
  17. ????????if?(time_after(jiffies,?orig_jiffies?+?HZ))?{
  18. ????????????pr_debug("I2C: timeout\n");
  19. ????????????if?(readb(i2c->base?+?MPC_I2C_SR)?==
  20. ????????????????(CSR_MCF?|?CSR_MBB?|?CSR_RXAK))
  21. ????????????????mpc_i2c_fixup(i2c);
  22. ????????????return?-EIO;
  23. ????????}
  24. ????????schedule();
  25. ????}

  26. ????for?(i?=?0;?ret?>=?0?&&?i?<?num;?i++)?{
  27. ????????pmsg?=?&msgs[i];
  28. ????????pr_debug("Doing %s %d bytes to 0x%02x - %d of %d messages\n",
  29. ?????????????pmsg->flags?&?I2C_M_RD???"read"?:?"write",
  30. ?????????????pmsg->len,?pmsg->addr,?i?+?1,?num);
  31. ????????//根據消息里的flag進行讀操作或寫操作
  32. ????????if?(pmsg->flags?&?I2C_M_RD)?
  33. ????????????ret?=?mpc_read(i2c,?pmsg->addr,?pmsg->buf,?pmsg->len,?i);
  34. ????????else
  35. ????????????ret?=?mpc_write(i2c,?pmsg->addr,?pmsg->buf,?pmsg->len,?i);
  36. ????}
  37. ????mpc_i2c_stop(i2c);????//保證為I2CCSR[MSTA]為0,保證能觸發STOP
  38. ????return?(ret?<?0)???ret?:?num;
  39. }


  1. static?int?mpc_write(struct?mpc_i2c?*i2c,?int?target,
  2. ?????????????const?u8?*?data,?int?length,?int?restart)
  3. {
  4. ????int?i;
  5. ????unsigned?timeout?=?i2c->adap.timeout;
  6. ????u32 flags?=?restart???CCR_RSTA?:?0;

  7. ????/* Start with MEN */????//以防萬一,保證I2C模塊使能起來
  8. ????if?(!restart)
  9. ????????writeccr(i2c,?CCR_MEN);
  10. ????/* Start as master */???????//寫了I2CCR[CCR_MSTA],觸發CPU發起START信號
  11. ????writeccr(i2c,?CCR_MIEN?|?CCR_MEN?|?CCR_MSTA?|?CCR_MTX?|?flags);
  12. ????/* Write target byte */?????//CPU發送一個字節,slave I2C addr和0 (寫操作bit)?
  13. ????writeb((target?<<?1),?i2c->base?+?MPC_I2C_DR);

  14. ????if?(i2c_wait(i2c,?timeout,?1)?<?0)????//等待slave 發ACK
  15. ????????return?-1;

  16. ????for?(i?=?0;?i?<?length;?i++)?{
  17. ????????/* Write data byte */
  18. ????????writeb(data[i],?i2c->base?+?MPC_I2C_DR);?//CPU接著發數據,包括reg addr和data

  19. ????????if?(i2c_wait(i2c,?timeout,?1)?<?0)???????//等待slave 發ACK
  20. ????????????return?-1;
  21. ????}

  22. ????return?0;
  23. }


  1. static?int?i2c_wait(struct?mpc_i2c?*i2c,?unsigned?timeout,?int?writing)
  2. {
  3. ????unsigned?long?orig_jiffies?=?jiffies;
  4. ????u32 x;
  5. ????int?result?=?0;

  6. ????if?(i2c->irq?==?0)
  7. ????{????//循環讀I2CSR,直到I2CSR[MIF]置1
  8. ????????while?(!(readb(i2c->base?+?MPC_I2C_SR)?&?CSR_MIF))?{
  9. ????????????schedule();
  10. ????????????if?(time_after(jiffies,?orig_jiffies?+?timeout))?{
  11. ????????????????pr_debug("I2C: timeout\n");
  12. ????????????????writeccr(i2c,?0);
  13. ????????????????result?=?-EIO;
  14. ????????????????break;
  15. ????????????}
  16. ????????}
  17. ????????x?=?readb(i2c->base?+?MPC_I2C_SR);
  18. ????????writeb(0,?i2c->base?+?MPC_I2C_SR);
  19. ????}?else?{
  20. ????????/* Interrupt mode */
  21. ????????result?=?wait_event_interruptible_timeout(i2c->queue,
  22. ????????????(i2c->interrupt?&?CSR_MIF),?timeout?*?HZ);

  23. ????????if?(unlikely(result?<?0))?{
  24. ????????????pr_debug("I2C: wait interrupted\n");
  25. ????????????writeccr(i2c,?0);
  26. ????????}?else?if?(unlikely(!(i2c->interrupt?&?CSR_MIF)))?{
  27. ????????????pr_debug("I2C: wait timeout\n");
  28. ????????????writeccr(i2c,?0);
  29. ????????????result?=?-ETIMEDOUT;
  30. ????????}

  31. ????????x?=?i2c->interrupt;
  32. ????????i2c->interrupt?=?0;
  33. ????}

  34. ????if?(result?<?0)
  35. ????????return?result;

  36. ????if?(!(x?&?CSR_MCF))?{
  37. ????????pr_debug("I2C: unfinished\n");
  38. ????????return?-EIO;
  39. ????}

  40. ????if?(x?&?CSR_MAL)?{????//仲裁失敗
  41. ????????pr_debug("I2C: MAL\n");
  42. ????????return?-EIO;
  43. ????}

  44. ????if?(writing?&&?(x?&?CSR_RXAK))?{//寫后沒收到ACK
  45. ????????pr_debug("I2C: No RXAK\n");
  46. ????????/* generate stop */
  47. ????????writeccr(i2c,?CCR_MEN);
  48. ????????return?-EIO;
  49. ????}
  50. ????return?0;
  51. }

  1. static?int?mpc_read(struct?mpc_i2c?*i2c,?int?target,
  2. ????????????u8?*?data,?int?length,?int?restart)
  3. {
  4. ????unsigned?timeout?=?i2c->adap.timeout;
  5. ????int?i;
  6. ????u32 flags?=?restart???CCR_RSTA?:?0;

  7. ????/* Start with MEN */????//以防萬一,保證I2C模塊使能
  8. ????if?(!restart)
  9. ????????writeccr(i2c,?CCR_MEN);
  10. ????/* Switch to read - restart */
  11. ????//注意這里,再次把CCR_MSTA置1,再觸發 START?
  12. ????writeccr(i2c,?CCR_MIEN?|?CCR_MEN?|?CCR_MSTA?|?CCR_MTX?|?flags);


  13. ????/* Write target address byte - this time with the read flag set */?
  14. ????//CPU發送slave I2C addr和讀操作1
  15. ????writeb((target?<<?1)?|?1,?i2c->base?+?MPC_I2C_DR);
??????
???? //等待Slave發ACK
  1. ????if?(i2c_wait(i2c,?timeout,?1)?<?0)
  2. ????????return?-1;

  3. ????if?(length)?{
  4. ????????if?(length?==?1)
  5. ????????????writeccr(i2c,?CCR_MIEN?|?CCR_MEN?|?CCR_MSTA?|?CCR_TXAK);
  6. ????????else?//為什么不置 TXAK
  7. ????????????writeccr(i2c,?CCR_MIEN?|?CCR_MEN?|?CCR_MSTA);
  8. ????????/* Dummy read */
  9. ????????readb(i2c->base?+?MPC_I2C_DR);
  10. ????}

  11. ????for?(i?=?0;?i?<?length;?i++)?{
  12. ????????if?(i2c_wait(i2c,?timeout,?0)?<?0)
  13. ????????????return?-1;

  14. ????????/* Generate txack on next to last byte */
  15. ????????//注意這里TXAK置1,表示CPU每收到1byte數據后,會發送ACK
  16. ????????if?(i?==?length?-?2)?
  17. ????????????writeccr(i2c,?CCR_MIEN?|?CCR_MEN?|?CCR_MSTA?|?CCR_TXAK);

  18. ????????/* Generate stop on last byte */
  19. ????????//注意這里CCR_MSTA [1->0] CPU會觸發STOP
  20. ????????if?(i?==?length?-?1)????
  21. ????????????writeccr(i2c,?CCR_MIEN?|?CCR_MEN?|?CCR_TXAK);

  22. ????????data[i]?=?readb(i2c->base?+?MPC_I2C_DR);
  23. ????}

  24. ????return?length;
  25. }







本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/253194.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/253194.shtml
英文地址,請注明出處:http://en.pswp.cn/news/253194.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

聯想啟天M715E安裝硬盤保護系統和網絡同傳

現還是學生&#xff0c;雖然大四課上的少&#xff0c;實驗室去的也不勤了&#xff0c;但指導老師有事吩咐&#xff0c;還是要辦好的。 沈老師榮升軟件實驗室主任&#xff0c;學校給了2個機房&#xff0c;一個70臺聯想啟天M715E&#xff0c;一個30臺新的70臺新主機&#xff08;配…

圖像--攝像頭數據輸出格式與傳輸接口

一、 數據輸出格式 RAW data 格式: CMOS 在將光信號轉換為電信號時的電平高低的原始記錄&#xff0c;單純地將沒有進行任何處理的圖像數據&#xff0c;即攝像元件直接得到的電信號進行數字化處理而得到的。 每個pixel只能感光R光或者B光或者G光&am…

計算機入門與學習回憶(一)

這個回憶&#xff0c;不是記錄什么成功&#xff0c;而記錄一些失敗的經歷。 大約初中還是高中的時候&#xff0c;就玩過計算機。那是一個很冷的冬天的晚上&#xff0c;一臺華南計算機所造的仿APPLE II的計算機。 這臺計算機很簡陋&#xff0c;只有一個主機&#xff0c;沒有屏幕…

怎么建立微信生態用戶增長模型?

微信最新數據及中國網民最新數據概述截止到2018年&#xff0c;移動網民用戶增長放緩&#xff0c;接近人口大盤。微信作為全國移動網民的一款超級應用&#xff0c;在移動網民的***率超過90%。微信最近一年的新增用戶主要來自中老年用戶群體和鄉鎮用戶群體***。易觀最新發布的8月…

數據庫設計的三大范式

三大范式是為了了更好的設計數據庫 1. 所謂第一范式&#xff08;1NF&#xff09;是指在關系模型中&#xff0c;對列添加的一個規范要求&#xff0c;所有的列都應該是原子性的&#xff0c;即數據庫表的每一列都是不可分割的原子數據項&#xff0c;而不能是集合&#xff0c;數組&…

圖像-攝像頭驅動流程

驅動架構 在Kernel層用camera的驅動將其驅動起來以后&#xff0c;將硬件驅動接口交給Hal&#xff1b; 上層的camera應用程序在andriod實時系統的虛擬機中&#xff0c;加載留給camera公用的庫文 件&#xff0c;調用Hal層的接口來控制camera硬件來實現功能。 驅動流程 打開came…

第四章

選擇結構&#xff08;二&#xff09; 學習本章會用到的單詞&#xff1a; case&#xff1a;實例&#xff0c;情形&#xff0c;情況 switch&#xff1a;轉換&#xff0c;切換&#xff0c;開關 default&#xff1a;系統默認值&#xff0c;違約&#xff0c;預設。缺省 exit&#xf…

tensorflow的一些函數

1.tf.constant(value,dtypeNone,shapeNone,nameConst) 注意這個函數創造的是一個常數tensor&#xff0c;而不是一個具體的常數 value:即可以是list&#xff0c;也可以是value dtype:對應生成的tensor里的元素的類型 # Constant 1-D Tensor populated with value list.tensor t…

生活小常識

1、面試時說三個月試用期可以縮短的不要相信&#xff0c;可以談談別的條件 2、在飯店吃飯滿幾桌送下次吃飯的卷的不要信。可能你會沒時間&#xff0c;或飯店沒地方。&#xff08;談談當時可以送的其他優惠。或者根據自己的需求定桌數&#xff0c;不要被他誘惑湊桌&#xff09;轉…

IP、TCP、UDP數據包長度問題

IP數據包長度問題總結 首先要看TCP/IP協議&#xff0c;涉及到四層&#xff1a;鏈路層&#xff0c;網絡層&#xff0c;傳輸層&#xff0c;應用層。   其中以太網&#xff08;Ethernet&#xff09;的數據幀在鏈路層    IP包在網絡層   TCP或UDP包在傳輸層    TCP或UDP中的…

RK瑞芯微WIFI模組2020最新支持列表,放心使用!

如下所示為RK瑞芯微2020最新支持的WIFIBT模組列表&#xff0c;請參考&#xff01; 標題希望對選型有所幫助&#xff0c;避免踩坑&#xff0c;坑驅動工程師&#xff01; 有事要搞&#xff0c;請私聊&#xff01;

數據類型進階

----------siwuxie095 1、整數類型 如果去掉注釋&#xff0c;報錯&#xff1a;Type mismatch: cannot convert from into byte 即 不能把 int 類型轉換成 byte 類型 如果選擇 Add cast to byte&#xff1a; 即 把 b13 的結果&#xff08;默認為 int 類型&#xff09;強制轉換成…

區塊鏈教程Fabric1.0源代碼分析流言算法Gossip服務端二

區塊鏈教程Fabric1.0源代碼分析流言算法Gossip服務端二 Fabric 1.0源代碼筆記 之 gossip&#xff08;流言算法&#xff09; #GossipServer&#xff08;Gossip服務端&#xff09; 5.2、commImpl結構體方法 //conn.serviceConnection()&#xff0c;啟動連接服務 func (c *commImp…

一段H264數據的分析

&#xfeff;&#xfeff;目錄(?)[-] 分析00 00 00 01 67 42 00 1E 99 A0 B1 31 00 00 00 01分析00 00 00 01 68 CE 38 80 00 00 00 01 分析00 00 00 01 67 42 00 1E 99 A0 B1 31 00 00 00 01 H264的數據流分為兩種&#xff0c;一種是NAL UNIT stream(RTP),一種是 bits stream…

海華模組:WIFI、BT、SoC模組列表

各種模塊廣泛應用于網絡攝像頭、智能機器人、兒童故事機、詞典筆、智能音箱、智能家電等需要實現無線聯網設備的消費類電子產品。 模塊化有很大的有點&#xff1a;集成設計、減少調試工作&#xff0c;避開開發盲區、加速將產品推向市場&#xff01; 下面介紹下海華各類通訊模…

JAVA-初步認識-第七章-構造函數和一般函數的區別

一. 構造函數是對象一創建&#xff0c;就被調用了。(調用這個詞很特殊&#xff0c;是涉及到實體時&#xff0c;才會有調用的過程) 還有一點想說的是&#xff0c;構造函數的聲明應該是固定的&#xff0c;不然沒法隨著對象的創建一起執行&#xff0c;必須是類名括號的形式。 二. …

深入理解哈希表

轉自&#xff1a;https://bestswifter.com/hashtable/ 這篇文章由一個簡單的問題引出: 有兩個字典&#xff0c;分別存有 100 條數據和 10000 條數據&#xff0c;如果用一個不存在的 key 去查找數據&#xff0c;在哪個字典中速度更快&#xff1f; 有些計算機常識的讀者都會立刻回…

Linux服務器ftp+httpd部署

一、ftp安裝 1、安裝vsftpd 命令&#xff1a;yum -y install vsftpd 2、修改ftp配置文件 命令&#xff1a;vim /etc/vsftpd/vsftpd.conf 3、按i進入insert模式后&#xff0c;按以下要求修改 anonymous_enableYES 改為anonymous_enableNO chroot_local_userYES #去掉前面的注釋 …

高清網絡攝像機主流芯片方案之安霸、TI和海思對比

高清網絡視頻監控發展到今天&#xff0c;市場也開始進入真正的高清時代&#xff0c;諸多有實力的高清攝像機廠家的產品線也逐漸完善起來&#xff0c;高清網絡視頻監控的配套產品有更加豐富和成熟。與此同時困擾很多人的高清網絡攝像機與后端平臺或者與后端NVR互聯互通的問題也在…

ios審核4.3被拒,快速通過IOS4.3問題

最近有許多開發者遇到了因為審核條款 4.3&#xff08;后文統一簡稱 4.3&#xff09;審核條款 4.3&#xff08;后文統一簡稱 4.3&#xff09;&#xff0c;這種情況 常見于大家上傳重復應用的時候&#xff0c;因為App Store 已經有了很多相似的應用 而被打回&#xff0c;今天我們…