新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 十 ARM9(2440)的IIC-理論知識及程序實例

        十 ARM9(2440)的IIC-理論知識及程序實例

        作者: 時間:2016-11-27 來源:網絡 收藏

        //*************************[ Wr24C080 ]****************************
        void Wr24C080(U32 slvAddr,U32 addr,U8 data)//首地址內部地址數據
        {
        _iicMode= WRDATA;//模式標志記為WRDAT
        _iicPt= 0;//指針記為0
        _iicData[0]= (U8)addr;//內部地址
        _iicData[1]= data;// 要寫的數據
        _iicDataCount = 2;

        rIICDS= slvAddr;//0xa0設備地址
        rIICSTAT = 0xf0;//MasTx,Start 啟動發送
        //Clearing the pending bit isnt needed because the pending bit has been cleared.

        while(_iicDataCount!=-1);//未發送完在此等待

        本文引用地址:http://www.104case.com/article/201611/322175.htm

        _iicMode = POLLACK;//發送完后下面等待應答信號ACK

        while(1)
        {
        rIICDS= slvAddr;
        _iicStatus = 0x100;
        rIICSTAT= 0xf0;//MasTx,Start啟動
        rIICCON= 0xaf;//Resumes IIC operation. 恢復IIC總線

        while(_iicStatus==0x100);//未接收到ACk在此等待

        if(!(_iicStatus&0x1))
        break;//When ACK is receivedACK收到后跳出循環
        }
        rIICSTAT = 0xd0;//Stop MasTx condition 停止信號
        rIICCON= 0xaf;//Resumes IIC operation.
        Delay(1);//Wait until stop condtion is in effect.恢復
        //Write is completed.
        }

        //**********************[ Rd24C080 ] ***********************************
        void Rd24C080(U32 slvAddr,U32 addr,U8 *data)//首地址 內部地址 讀取的數據存入的地址
        {
        _iicMode= SETRDADDR;//模式設為SETRDADDR
        _iicPt= 0;
        _iicData[0]= (U8)addr;//_iicData[0]存內部地址
        _iicDataCount = 1;//計數值

        rIICDS= slvAddr;//首地址0xa0
        rIICSTAT = 0xf0;//MasTx,Start啟動
        //Clearing the pending bit isnt needed because the pending bit has been cleared.
        while(_iicDataCount!=-1);//未讀取完成

        _iicMode= RDDATA;//完成后進入讀取數據模式
        _iicPt= 0;
        _iicDataCount = 1;

        rIICDS= slvAddr;
        rIICSTAT= 0xb0;//MasRx,Start設置為主接收模式
        rIICCON= 0xaf;//Resumes IIC operation.恢復IIC總線操作
        while(_iicDataCount!=-1);//讀取未完成

        *data = _iicData[1];//1
        }


        //-------------------------------------------------------------------------
        void __irq IicInt(void)
        {
        U32 iicSt,i;

        rSRCPND = BIT_IIC;//Clear pending bit
        rINTPND = BIT_IIC;
        iicSt= rIICSTAT;//控制狀態寄存器

        if(iicSt & 0x8){}//When bus arbitration is failed.總線仲裁失敗執行空操作
        if(iicSt & 0x4){}//When a slave address is matched with IICADD從地址匹配執行空操作
        if(iicSt & 0x2){}//When a slave address is 0000000b
        if(iicSt & 0x1){}//When ACK isnt received未收到應答信號執行空操作

        switch(_iicMode)
        {
        case POLLACK:
        _iicStatus = iicSt;//控制狀態寄存器的值賦給_iicStatus
        break;

        case RDDATA:
        if((_iicDataCount--)==0)
        {
        _iicData[_iicPt++] = rIICDS;

        rIICSTAT = 0x90;//Stop MasRx condition
        rIICCON= 0xaf;//Resumes IIC operation.
        Delay(1);//Wait until stop condtion is in effect.
        //Too long time...
        //The pending bit will not be set after issuing stop condition.
        break;
        }
        _iicData[_iicPt++] = rIICDS;//The last data has to be read with no ack.

        if((_iicDataCount)==0)
        rIICCON = 0x2f;//Resumes IIC operation with NOACK.第一次不產生應答信號進行第二次讀取并將第二次讀取的
        ///////////////數據存入數組中(第一次和第二次讀取的數據實際一樣)
        else
        rIICCON = 0xaf;//Resumes IIC operation with ACK
        break;

        case WRDATA:
        if((_iicDataCount--)==0)//首地址 ,內部地址和數據都發送完畢后
        {
        rIICSTAT = 0xd0;//Stop MasTx condition 產生停止信號
        rIICCON= 0xaf;//Resumes IIC operation.恢復IIC總線
        Delay(1);//Wait until stop condtion is in effect.
        //The pending bit will not be set after issuing stop condition.
        break;
        }
        rIICDS = _iicData[_iicPt++];//_iicData[0] has dummy.第一次中斷后將內部地址addr的值存入IICDS第二次存入要寫入的數據
        for(i=0;i<10;i++);//for setup time until rising edge of IICSCL//延時

        rIICCON = 0xaf;//resumes IIC operation.恢復IIC總線
        break;

        case SETRDADDR:
        //Uart_Printf("[ S%d ]",_iicDataCount);
        if((_iicDataCount--)==0)
        break;//第二次中斷跳出//IIC operation is stopped because of IICCON[4]
        rIICDS = _iicData[_iicPt++];//第一次中斷將內部地址addr存入移位寄存器
        for(i=0;i<10;i++);//For setup time until rising edge of IICSCL
        rIICCON = 0xaf;//Resumes IIC operation.
        break;

        default:
        break;
        }
        }
        void Delay(int x)
        {
        int k, j;
        while(x)
        {
        for (k=0;k<=0xff;k++)
        for(j=0;j<=0xff;j++);

        x--;
        }
        }


        上一頁 1 2 下一頁

        關鍵詞: ARM92440II

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 崇信县| 长海县| 方山县| 盐城市| 五台县| 三河市| 乌拉特后旗| 三都| 成武县| 乃东县| 麦盖提县| 平罗县| 大化| 台江县| 西乌| 独山县| 志丹县| 紫金县| 佛冈县| 鄂尔多斯市| 揭阳市| 大同市| 林周县| 利川市| 定州市| 琼海市| 延寿县| 驻马店市| 双江| 卢氏县| 大姚县| 滦平县| 长春市| 阳东县| 南充市| 宝鸡市| 安龙县| 南雄市| 钦州市| 浠水县| 孙吴县|