在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            S3C2440 IIC總線接口

            作者: 時(shí)間:2016-11-21 來源:網(wǎng)絡(luò) 收藏
            s3c2440內(nèi)部有一個(gè)IIC總線接口,因此為我們連接帶有IIC通信模塊的外圍設(shè)備提供了便利。它具有四種操作模式:主設(shè)備發(fā)送模式、主設(shè)備接收模式、從設(shè)備發(fā)送模式和從設(shè)備接收模式。
            在這里只把s3c2440當(dāng)做IIC總線的主設(shè)備來使用,因此只介紹前兩種操作模式。在主設(shè)備發(fā)送模式下,它的工作流程為:首先配置IIC模式,然后把從設(shè)備地址寫入接收發(fā)送數(shù)據(jù)移位寄存器IICDS中,再把0xF0寫入控制狀態(tài)寄存器IICSTAT中,這時(shí)等待從設(shè)備發(fā)送應(yīng)答信號,如果想要繼續(xù)發(fā)送數(shù)據(jù),那么在接收到應(yīng)答信號后,再把待發(fā)送的數(shù)據(jù)寫入寄存器IICDS中,清除中斷標(biāo)志后,再次等待應(yīng)答信號;如果不想再發(fā)送數(shù)據(jù)了,那么把0x90寫入寄存器IICSTAT中,清除中斷標(biāo)志并等待停止條件后,即完成了一次主設(shè)備的發(fā)送。在主設(shè)備接收模式下,它的工作流程為:首先配置IIC模式,然后把從設(shè)備地址寫入接收發(fā)送數(shù)據(jù)移位寄存器IICDS中,再把0xB0寫入控制狀態(tài)寄存器IICSTAT中,這時(shí)等待從設(shè)備發(fā)送應(yīng)答信號,如果想要接收數(shù)據(jù),那么在應(yīng)答信號后,讀取寄存器IICDS,清除中斷標(biāo)志;如果不想接收數(shù)據(jù)了,那么就向寄存器IICSTAT寫入0x90,清除中斷標(biāo)志并等待停止條件后,即完成了一次主設(shè)備的接收。在完成上述兩個(gè)模式時(shí),主要用到了控制寄存器IICCON、控制狀態(tài)寄存器IICSTAT和發(fā)送接收數(shù)據(jù)移位寄存器IICDS。由于我們只把s3c2440當(dāng)做主設(shè)備來用,并且系統(tǒng)的IIC總線上只有這么一個(gè)主設(shè)備,因此用來設(shè)置從設(shè)備地址的地址寄存器IICADD,和用于仲裁總線的多主設(shè)備線路控制寄存器IICLC都無需配置。寄存器IICCON的第6位和低4位用于設(shè)置IIC的時(shí)鐘頻率,因?yàn)镮IC的時(shí)鐘線SCL都是由主設(shè)備提供的。s3c2440的IIC時(shí)鐘源為PCLK,當(dāng)系統(tǒng)的PCLK為50MHz,而從設(shè)備最高需要100kHz時(shí),可以將IICCON的第6位置1,IICCON的低4位全為0即可。寄存器IICCON的第7位用于設(shè)置是否發(fā)出應(yīng)答信號,第5位用于是否使能發(fā)送和接收中斷,第4位用于中斷的標(biāo)志,當(dāng)接收或發(fā)送數(shù)據(jù)后一定要對該位進(jìn)行清零,以清除中斷標(biāo)志。寄存器IICSTAT的高2位用于設(shè)置是哪種操作模式,當(dāng)向第5位寫0或?qū)?時(shí),則表示結(jié)束IIC或開始IIC通訊,第4位用于是否使能接收/發(fā)送數(shù)據(jù)。
            上面的一段是摘取網(wǎng)上某人的,寫的很好。
            AT24C02A(時(shí)序圖詳細(xì)見數(shù)據(jù)手冊)
            寫操作有兩種模式:字節(jié)寫和頁寫。
            在字節(jié)寫模式下,主器件發(fā)送起始命令和從器件地址信息(R/W位置零)給從器件。在從器件產(chǎn)生應(yīng)答信號后,主器件發(fā)送AT24C02的字節(jié)地址,主器件在收到從器件的另一個(gè)應(yīng)答信號后,再發(fā)送數(shù)據(jù)到被尋址的存儲單元。AT24C02再次應(yīng)答并在主器件產(chǎn)生停止信號后開始內(nèi)部數(shù)據(jù)的擦寫,在內(nèi)部擦寫過程中,AT24C02不再應(yīng)答主器件的任何請求。
            頁寫操作的啟動(dòng)字節(jié),地址字節(jié)和第一個(gè)數(shù)據(jù)字節(jié)都跟字節(jié)寫的方式一樣,不同在于傳送了一字節(jié)數(shù)據(jù)后并不產(chǎn)生停止信號。主器件被允許發(fā)送8個(gè)字節(jié),每發(fā)送一個(gè)字節(jié)數(shù)據(jù)后AT24C02產(chǎn)生一個(gè)應(yīng)答位并將字節(jié)地址低位加1,高位保持不變。如果在發(fā)送停止信號之前主器件發(fā)送超過8個(gè)字節(jié),地址計(jì)數(shù)器將自動(dòng)翻轉(zhuǎn),先前寫入的數(shù)據(jù)將被覆蓋。只要接收到主器件發(fā)送的停止信號,AT24C02啟動(dòng)內(nèi)部寫周期,將數(shù)據(jù)在一個(gè)寫周期內(nèi)寫到數(shù)據(jù)區(qū)
            讀操作有三種模式:立即地址讀、選擇性讀和連續(xù)讀。
            立即地址讀
            AT24C02包含一個(gè)地址計(jì)數(shù)器,內(nèi)容為最后操作字節(jié)的地址加1。因此,如果上次讀或?qū)懙牟僮鞯刂窞镹,則立即讀的地址從地址N+1開始。AT24C02接收到器件地址信號和R/W位置1后,它首先發(fā)送一個(gè)應(yīng)答信號,然后發(fā)送一個(gè)8位字節(jié)數(shù)據(jù)。主器件不需發(fā)送一個(gè)應(yīng)答信號,但要產(chǎn)生一個(gè)停止信號,這時(shí)AT24C02停止傳輸。
            選擇性讀
            選擇性讀操作允許主器件對寄存器的任意字節(jié)進(jìn)行讀操作。為進(jìn)行這種操作,首先應(yīng)該設(shè)定字節(jié)地址。主器件向AT24C02發(fā)送起始信號和從器件地址,從器件響應(yīng)之后發(fā)送主器件想讀取的字節(jié)數(shù)據(jù)的地址。AT24C02應(yīng)答之后,主器件重新發(fā)送起始信號和從器件地址,此時(shí)R/W位才置1。AT24C02響應(yīng)并發(fā)送應(yīng)答信號,然后輸出所要求的一個(gè)8位字節(jié)數(shù)據(jù),主器件不發(fā)送應(yīng)答信號但產(chǎn)生一個(gè)停止信號,此時(shí)AT24C02停止傳輸。
            連續(xù)讀
            連續(xù)讀操作的啟動(dòng)跟選擇性讀操作一樣,除了在AT24C02發(fā)送完一個(gè)8位字節(jié)數(shù)據(jù)后,主器件產(chǎn)生一個(gè)應(yīng)答信號而不是停止信號,這個(gè)應(yīng)答信號告知AT24C02要求更多的數(shù)據(jù)。對應(yīng)每個(gè)應(yīng)答信號,AT24C02將發(fā)送下一個(gè)地址的8位數(shù)據(jù)字節(jié)。為提供連續(xù)讀操作,AT24C02內(nèi)部地址計(jì)數(shù)器在每次讀操作完成之后遞增。這樣整個(gè)寄存器區(qū)域在可在一個(gè)讀操作內(nèi)全部讀出。
            貼出一個(gè)三星官方IIC測試程序,使用的是中斷查詢發(fā)式
            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讀出的數(shù)據(jù)
            23. SelectFclk(2);//設(shè)置系統(tǒng)時(shí)鐘400M
            24. ChangeClockDivider(2,1);//設(shè)置分頻1:4:8
            25. CalcBusClk();//計(jì)算總線頻率
            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;//關(guān)上拉
            33. rGPECON&=~0xf0000000;
            34. rGPECON|=0xa0000000;//GPE15:IICSDA,GPE14:IICSCL
            35. //使能應(yīng)答,IIC總線時(shí)鐘IICCLK=PCLK/16,使能中斷,發(fā)送時(shí)鐘IICCLK/16
            36. rIICCON=(1<<7)|(0<<6)|(1<<5)|(0xf);
            37. rIICADD=0x10;//2440從機(jī)地址=[7:1]
            38. rIICSTAT=0x10;//IIC總線數(shù)據(jù)輸出使能(Rx/Tx)
            39. Uart_Printf("WritetestdataintoAT24C02n");
            40. for(i=0;i<256;i++)
            41. Wr24C02(0xa0,(U8)i,i);//寫入數(shù)據(jù)到AT24C02
            42. for(i=0;i<256;i++)//數(shù)組數(shù)據(jù)清零
            43. data[i]=0;
            44. Uart_Printf("ReadtestdatafromAT24C02n");
            45. for(i=0;i<256;i++)
            46. Rd24C02(0xa0,(U8)i,&(data[i]));//讀取AT24C02的數(shù)據(jù)放入data數(shù)組中
            47. for(i=0;i<16;i++)
            48. {
            49. for(j=0;j<16;j++)
            50. Uart_Printf("%2x",data[i*16+j]);//打印從AT24C02讀出的數(shù)據(jù)
            51. Uart_Printf("n");
            52. }
            53. }
            54. voidWr24C02(U32slvAddr,U32addr,U8data)//slvAddr為從地址
            55. {//addr為字節(jié)地址,data為寫入的數(shù)據(jù)
            56. iicMode=WRDATA;//寫數(shù)據(jù)模式
            57. iicPt=0;
            58. iicData[0]=(U8)addr;
            59. iicData[1]=data;
            60. iicDataCount=2;//根據(jù)AT24C02字節(jié)寫的發(fā)式,要寫從地址和字節(jié)地址
            61. rIICDS=slvAddr;//把0xa0地址寫入到數(shù)據(jù)移位寄存器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;//設(shè)置要從從機(jī)讀取數(shù)據(jù)的從地址
            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;//讀數(shù)據(jù)模式
            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狀態(tài)寄存器
            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://從從機(jī)中讀取數(shù)據(jù)
            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://寫數(shù)據(jù)到從機(jī)
            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://設(shè)置要從從機(jī)機(jī)讀取數(shù)據(jù)的從機(jī)地址
            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. }





            關(guān)鍵詞: S3C2440IIC總線接

            評論


            技術(shù)專區(qū)

            關(guān)閉