新聞中心

        S3C2440-IIC

        作者: 時間:2016-12-02 來源:網絡 收藏
        IIC(Inter-Integrated Circuit,I2C)總線是一種由PHILIPS公司開發的兩線式串行總線,用于連接微處理器及其外圍設備,它的最主要優點是簡單和有效。它只需要數據線SDA和時鐘線SCL,就能夠實現CPU與被控IC之間、IC與IC之間進行雙向傳送。
        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位用于是否使能接收/發送數據。
        #include "2440addr.h"
        #define U32 unsigned int
        unsigned char iic_buffer[8];
        U32 length;
        unsigned char add, word;
        int cmd, flag, count, command;
        void delay(int a)
        {
        int k;
        for(k=0;k<a;k++)
        ;
        }
        void __irq UART0_ISR(void){
        char ch;
        rSRCPND |= (0x1<<28);
        rINTPND |= (0x1<<28);
        rSUBSRCPND |= 0x1<<0;
        if(rUTRSTAT0 & 0x1){
        ch = rURXH0;
        while(!(rUTRSTAT0&0x4));
        rUTXH0 = ch;
        if(count == 0)
        command = ch;
        if(command == 0xa1){
        if(count == 1){
        add = ch;
        }
        else
        if(count == 2){
        word = ch;
        }
        else
        if(count == 3){
        length = ch;
        }
        else if(count >= 4)
        {
        iic_buffer[count-4] = ch;
        if(count == length+3){
        count = -1;
        cmd = 0x01;
        }
        }
        count++;
        }
        else if(command == 0xa2)
        {
        if(count == 1)
        add = ch;
        else
        if(count == 2)
        word = ch;
        else
        if(count == 3){
        length = ch;
        count = -1;
        cmd = 0x02;
        }
        count++;
        }
        }
        }
        上一頁 1 2 下一頁

        關鍵詞: S3C2440IIC串行總

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 长治县| 永丰县| 尉犁县| 金山区| 灯塔市| 元氏县| 顺昌县| 绿春县| 乌鲁木齐县| 平顺县| 黎川县| 安岳县| 泽普县| 喀什市| 黑水县| 平原县| 巴彦淖尔市| 临泉县| 洪泽县| 基隆市| 阳信县| 南投县| 洪湖市| 通化县| 青铜峡市| 金阳县| 榆社县| 西平县| 望谟县| 龙江县| 中山市| 洪洞县| 岳西县| 重庆市| 方山县| 宁波市| 溧水县| 阿鲁科尔沁旗| 石门县| 天门市| 邵阳县|