新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > S3C2440 IIC總線接口

        S3C2440 IIC總線接口

        作者: 時間:2016-11-21 來源:網絡 收藏
        s3c2440內部有一個IIC總線接口,因此為我們連接帶有IIC通信模塊的外圍設備提供了便利。它具有四種操作模式:主設備發送模式、主設備接收模式、從設備發送模式和從設備接收模式。
        在這里只把s3c2440當做IIC總線的主設備來使用,因此只介紹前兩種操作模式。在主設備發送模式下,它的工作流程為:首先配置IIC模式,然后把從設備地址寫入接收發送數據移位寄存器IICDS中,再把0xF0寫入控制狀態寄存器IICSTAT中,這時等待從設備發送應答信號,如果想要繼續發送數據,那么在接收到應答信號后,再把待發送的數據寫入寄存器IICDS中,清除中斷標志后,再次等待應答信號;如果不想再發送數據了,那么把0x90寫入寄存器IICSTAT中,清除中斷標志并等待停止條件后,即完成了一次主設備的發送。在主設備接收模式下,它的工作流程為:首先配置IIC模式,然后把從設備地址寫入接收發送數據移位寄存器IICDS中,再把0xB0寫入控制狀態寄存器IICSTAT中,這時等待從設備發送應答信號,如果想要接收數據,那么在應答信號后,讀取寄存器IICDS,清除中斷標志;如果不想接收數據了,那么就向寄存器IICSTAT寫入0x90,清除中斷標志并等待停止條件后,即完成了一次主設備的接收。在完成上述兩個模式時,主要用到了控制寄存器IICCON、控制狀態寄存器IICSTAT和發送接收數據移位寄存器IICDS。由于我們只把s3c2440當做主設備來用,并且系統的IIC總線上只有這么一個主設備,因此用來設置從設備地址的地址寄存器IICADD,和用于仲裁總線的多主設備線路控制寄存器IICLC都無需配置。寄存器IICCON的第6位和低4位用于設置IIC的時鐘頻率,因為IIC的時鐘線SCL都是由主設備提供的。s3c2440的IIC時鐘源為PCLK,當系統的PCLK為50MHz,而從設備最高需要100kHz時,可以將IICCON的第6位置1,IICCON的低4位全為0即可。寄存器IICCON的第7位用于設置是否發出應答信號,第5位用于是否使能發送和接收中斷,第4位用于中斷的標志,當接收或發送數據后一定要對該位進行清零,以清除中斷標志。寄存器IICSTAT的高2位用于設置是哪種操作模式,當向第5位寫0或寫1時,則表示結束IIC或開始IIC通訊,第4位用于是否使能接收/發送數據。
        上面的一段是摘取網上某人的,寫的很好。
        AT24C02A(時序圖詳細見數據手冊)
        寫操作有兩種模式:字節寫和頁寫。
        在字節寫模式下,主器件發送起始命令和從器件地址信息(R/W位置零)給從器件。在從器件產生應答信號后,主器件發送AT24C02的字節地址,主器件在收到從器件的另一個應答信號后,再發送數據到被尋址的存儲單元。AT24C02再次應答并在主器件產生停止信號后開始內部數據的擦寫,在內部擦寫過程中,AT24C02不再應答主器件的任何請求。
        頁寫操作的啟動字節,地址字節和第一個數據字節都跟字節寫的方式一樣,不同在于傳送了一字節數據后并不產生停止信號。主器件被允許發送8個字節,每發送一個字節數據后AT24C02產生一個應答位并將字節地址低位加1,高位保持不變。如果在發送停止信號之前主器件發送超過8個字節,地址計數器將自動翻轉,先前寫入的數據將被覆蓋。只要接收到主器件發送的停止信號,AT24C02啟動內部寫周期,將數據在一個寫周期內寫到數據區
        讀操作有三種模式:立即地址讀、選擇性讀和連續讀。
        立即地址讀
        AT24C02包含一個地址計數器,內容為最后操作字節的地址加1。因此,如果上次讀或寫的操作地址為N,則立即讀的地址從地址N+1開始。AT24C02接收到器件地址信號和R/W位置1后,它首先發送一個應答信號,然后發送一個8位字節數據。主器件不需發送一個應答信號,但要產生一個停止信號,這時AT24C02停止傳輸。
        選擇性讀
        選擇性讀操作允許主器件對寄存器的任意字節進行讀操作。為進行這種操作,首先應該設定字節地址。主器件向AT24C02發送起始信號和從器件地址,從器件響應之后發送主器件想讀取的字節數據的地址。AT24C02應答之后,主器件重新發送起始信號和從器件地址,此時R/W位才置1。AT24C02響應并發送應答信號,然后輸出所要求的一個8位字節數據,主器件不發送應答信號但產生一個停止信號,此時AT24C02停止傳輸。
        連續讀
        連續讀操作的啟動跟選擇性讀操作一樣,除了在AT24C02發送完一個8位字節數據后,主器件產生一個應答信號而不是停止信號,這個應答信號告知AT24C02要求更多的數據。對應每個應答信號,AT24C02將發送下一個地址的8位數據字節。為提供連續讀操作,AT24C02內部地址計數器在每次讀操作完成之后遞增。這樣整個寄存器區域在可在一個讀操作內全部讀出。
        貼出一個三星官方IIC測試程序,使用的是中斷查詢發式
        1. #include
        2. #include"2440addr.h"
        3. #include"2440lib.h"
        4. #include"def.h"
        5. #defineWRDATA(1)
        6. #definePOLLACK(2)
        7. #defineRDDATA(3)
        8. #defineSETRDADDR(4)
        9. #defineIICBUFSIZE0x20
        10. staticU8iicData[IICBUFSIZE];
        11. staticvolatileintiicDataCount;
        12. staticvolatileintiicStatus;
        13. staticvolatileintiicMode;
        14. staticintiicPt;
        15. voidWr24C02(U32slvAddr,U32addr,U8data);
        16. voidRd24C02(U32slvAddr,U32addr,U8*data);
        17. voidIicPoll(void);
        18. voidRun_IicPoll(void);
        19. voidMain(void)
        20. {
        21. unsignedinti,j;
        22. staticU8data[256];//用于存儲AT24C02讀出的數據
        23. SelectFclk(2);//設置系統時鐘400M
        24. ChangeClockDivider(2,1);//設置分頻1:4:8
        25. CalcBusClk();//計算總線頻率
        26. rGPHCON&=~((3<<4)|(3<<6));
        27. rGPHCON|=(2<<4)|(2<<6);//GPH2--TXD[0];GPH3--RXD[0]
        28. rGPHUP=0x00;//使能上拉功能
        29. Uart_Init(0,115200);
        30. Uart_Select(0);
        31. Uart_Printf("[IICTest(Polling)usingAT24C020]n");
        32. rGPEUP|=0xc000;//關上拉
        33. rGPECON&=~0xf0000000;
        34. rGPECON|=0xa0000000;//GPE15:IICSDA,GPE14:IICSCL
        35. //使能應答,IIC總線時鐘IICCLK=PCLK/16,使能中斷,發送時鐘IICCLK/16
        36. rIICCON=(1<<7)|(0<<6)|(1<<5)|(0xf);
        37. rIICADD=0x10;//2440從機地址=[7:1]
        38. rIICSTAT=0x10;//IIC總線數據輸出使能(Rx/Tx)
        39. Uart_Printf("WritetestdataintoAT24C02n");
        40. for(i=0;i<256;i++)
        41. Wr24C02(0xa0,(U8)i,i);//寫入數據到AT24C02
        42. for(i=0;i<256;i++)//數組數據清零
        43. data[i]=0;
        44. Uart_Printf("ReadtestdatafromAT24C02n");
        45. for(i=0;i<256;i++)
        46. Rd24C02(0xa0,(U8)i,&(data[i]));//讀取AT24C02的數據放入data數組中
        47. for(i=0;i<16;i++)
        48. {
        49. for(j=0;j<16;j++)
        50. Uart_Printf("%2x",data[i*16+j]);//打印從AT24C02讀出的數據
        51. Uart_Printf("n");
        52. }
        53. }
        54. voidWr24C02(U32slvAddr,U32addr,U8data)//slvAddr為從地址
        55. {//addr為字節地址,data為寫入的數據
        56. iicMode=WRDATA;//寫數據模式
        57. iicPt=0;
        58. iicData[0]=(U8)addr;
        59. iicData[1]=data;
        60. iicDataCount=2;//根據AT24C02字節寫的發式,要寫從地址和字節地址
        61. rIICDS=slvAddr;//把0xa0地址寫入到數據移位寄存器IICDS
        62. //MasterTxmode,Start(Write),IIC-busdataoutputenable
        63. //Busarbitrationsucessful,AddressasslavestatusflagCleared,
        64. //Addresszerostatusflagcleared,Lastreceivedbitis0
        65. rIICSTAT=0xf0;//
        66. //Clearingthependingbitisntneededbecausethependingbithasbeencleared.
        67. while(iicDataCount!=-1)
        68. Run_IicPoll();
        69. iicMode=POLLACK;
        70. while(1)
        71. {
        72. rIICDS=slvAddr;
        73. iicStatus=0x100;//Tocheckif_iicStatusischanged
        74. rIICSTAT=0xf0;//MasterTx,Start,OutputEnable,Sucessful,Cleared,Cleared,0
        75. rIICCON=0xaf;//ResumesIICoperation.
        76. while(iicStatus==0x100)
        77. Run_IicPoll();
        78. if(!(iicStatus&0x1))
        79. break;//WhenACKisreceived
        80. }
        81. rIICSTAT=0xd0;//MasterTxcondition,Stop(Write),OutputEnable
        82. rIICCON=0xaf;//ResumesIICoperation.
        83. Delay(1);//Waituntilstopcondtionisineffect.
        84. //Writeiscompleted.
        85. }
        86. //************************[_Rd24C02]********************************
        87. voidRd24C02(U32slvAddr,U32addr,U8*data)
        88. {
        89. iicMode=SETRDADDR;//設置要從從機讀取數據的從地址
        90. iicPt=0;
        91. iicData[0]=(U8)addr;
        92. iicDataCount=1;//寫從地址
        93. rIICDS=slvAddr;
        94. rIICSTAT=0xf0;//MasTx,Start
        95. //Clearingthependingbitisntneededbecausethependingbithasbeencleared.
        96. while(iicDataCount!=-1)
        97. Run_IicPoll();
        98. iicMode=RDDATA;//讀數據模式
        99. iicPt=0;
        100. iicDataCount=1;//
        101. rIICDS=slvAddr;
        102. rIICSTAT=0xb0;//MasterRx,Start
        103. rIICCON=0xaf;//ResumesIICoperation.
        104. while(iicDataCount!=-1)
        105. Run_IicPoll();
        106. *data=iicData[1];
        107. }
        108. voidRun_IicPoll(void)
        109. {
        110. if(rIICCON&0x10)//Tx/Rx中斷使能
        111. IicPoll();
        112. }
        113. voidIicPoll(void)
        114. {
        115. U32iicSt,i;
        116. iicSt=rIICSTAT;//ICC狀態寄存器
        117. if(iicSt&0x8){}//總線仲裁失敗
        118. if(iicSt&0x4){}//從地址與ICCADD地址匹配
        119. if(iicSt&0x2){}//從地址為00000000b
        120. if(iicSt&0x1){}//未收到ACK
        121. switch(iicMode)
        122. {
        123. casePOLLACK:
        124. iicStatus=iicSt;
        125. break;
        126. caseRDDATA://從從機中讀取數據
        127. if((iicDataCount--)==0)
        128. {
        129. iicData[iicPt++]=rIICDS;
        130. rIICSTAT=0x90;//StopMasRxcondition
        131. rIICCON=0xaf;//ResumesIICoperation.
        132. Delay(1);//Waituntilstopcondtionisineffect.
        133. //Toolongtime...
        134. //Thependingbitwillnotbesetafterissuingstopcondition.
        135. break;
        136. }
        137. iicData[iicPt++]=rIICDS;
        138. //Thelastdatahastobereadwithnoack.
        139. if((iicDataCount)==0)
        140. rIICCON=0x2f;//ResumesIICoperationwithNOACK.
        141. else
        142. rIICCON=0xaf;//ResumesIICoperationwithACK
        143. break;
        144. caseWRDATA://寫數據到從機
        145. if((iicDataCount--)==0)
        146. {
        147. rIICSTAT=0xd0;//stopMasTxcondition
        148. rIICCON=0xaf;//resumesIICoperation.
        149. Delay(1);//waituntilstopcondtionisineffect.
        150. //Thependingbitwillnotbesetafterissuingstopcondition.
        151. break;
        152. }
        153. rIICDS=iicData[iicPt++];//iicData[0]hasdummy.
        154. for(i=0;i<10;i++);//forsetuptimeuntilrisingedgeofIICSCL
        155. rIICCON=0xaf;//resumesIICoperation.
        156. break;
        157. caseSETRDADDR://設置要從從機機讀取數據的從機地址
        158. if((iicDataCount--)==0)
        159. {
        160. break;//IICoperationisstoppedbecauseofIICCON[4]
        161. }
        162. rIICDS=iicData[iicPt++];
        163. for(i=0;i<10;i++);//forsetuptimeuntilrisingedgeofIICSCL
        164. rIICCON=0xaf;//resumesIICoperation.
        165. break;
        166. default:
        167. break;
        168. }
        169. }





        關鍵詞: S3C2440IIC總線接

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 洮南市| 师宗县| 乡宁县| 教育| 如东县| 盐城市| 九寨沟县| 洪洞县| 海宁市| 仙桃市| 邻水| 江油市| 通州市| 化德县| 阳信县| 玉环县| 霍林郭勒市| 闵行区| 清苑县| 水富县| 安阳市| 桦川县| 武清区| 平顶山市| 探索| 慈利县| 礼泉县| 沁源县| 鱼台县| 康保县| 竹溪县| 定边县| 云林县| 江西省| 陆河县| 永州市| 武穴市| 荆门市| 淮滨县| 蒙城县| 凌海市|