最新免费av在线观看,亚洲综合一区成人在线,中文字幕精品无码一区二区三区,中文人妻av高清一区二区,中文字幕乱偷无码av先锋

登錄 免費(fèi)注冊(cè) 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場(chǎng)網(wǎng)
技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng)
驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe

44b0 IIC 問題,急!。。。!

作者:liyuanhua 欄目:ARM技術(shù)
44b0 IIC 問題,急。。。。!
三星的例程
void Wr24C040(U32 slvAddr,U32 addr,U8 data)
{
    _iicMode=WRDATA;
    _iicPt=0;
    _iicData[0]=(U8)addr;
    _iicData[1]=data;
    _iicDataCount=2;
    rIICDS=slvAddr;//0xa0
    rIICSTAT=0xf0; //MasTx,Start
    //Clearing the pending bit isn''t needed because the pending bit has been cleared.

    while(_iicDataCount!=-1);
    _iicMode=POLLACK;
    while(1)
    {
         rIICDS=slvAddr;
         _iicStatus=0x100;
         rIICSTAT=0xf0; //MasTx,Start
         rIICCON=0xaf; //resumes IIC operation.
         while(_iicStatus==0x100);
         if(!(_iicStatus&0x1))
         break; // when ACK is received
    }
    rIICSTAT=0xd0; //stop MasTx condition
    rIICCON=0xaf;  //resumes IIC operation.
    Delay(1);   //wait until stop condtion is in effect.
               //write is completed.
}
從程序上看,程序一開始就把要寫入的地址和數(shù)據(jù)發(fā)送,然后等待中斷,寫完后,再次START總線,再把從地址發(fā)下去然后再等待ACK,這似乎與2402時(shí)序不符。
請(qǐng)問各位大俠:為什么這個(gè)程序要寫完之后,再START,最后才等ACK,而不是每個(gè)字節(jié)都判斷ACK
再者,我的程序老是在while(_iicStatus==0x100);就一直處在等待狀態(tài),根本就不產(chǎn)生中斷了,程序不往下執(zhí)行了。
望各位大俠幫幫忙,非常感謝



* - 本貼最后修改時(shí)間:2006-6-21 19:50:57 修改者:liyuanhua

2樓: >>參與討論
liyuanhua
頂!
真是急死我了,各位大俠幫幫忙吧

3樓: >>參與討論
huai903
西西哈哈
 
4樓: >>參與討論
huai903
我也是啊
 
5樓: >>參與討論
liyuanhua
re:
其實(shí)就是按照IIC的時(shí)序做就可以了,不必理這個(gè)例子程序,下面是我的程序,
我是試過了的
U8    IIC_DATA[20];

void WRITE_IIC(U8 SLAVE_ADDR,U8 ADDR,U8 *P,U8 NUM)
{
    U8 I;
    IICMODE=WRDATA;
    rI_ISPC=BIT_IIC;
    IIC_PT=0;
    IIC_DATA[0]=ADDR;
    IIC_COUNT=NUM+1;
    for(I=0;I<NUM;I++)    IIC_DATA[I+1]=P[I];
    rIICDS=SLAVE_ADDR;
    rIICSTAT=0XF0;
    
    while(IIC_COUNT!=-1);
    
    /*IICMODE=POLLACK;
    while(1)
    {
        rIICDS=0XA0;
        IICSTATUS=0X100;
        rIICSTAT=0XF0;
        rIICCON=0XAF;
        if(rIICSTAT & 0X01) ;
        while(IICSTATUS==0X100) ;
        if(!(IICSTATUS & 0X01)) ;
            break;
    }*/
    
    rIICSTAT=0XD0;
    rIICCON=0XAF;
    DELAY(2);
}        



6樓: >>參與討論
HUAI903
呵呵,看明白了。
liyuanhua,看中斷服務(wù)程序:

void __irq IicInt(void)
{
    U32 iicSt,i;
    rI_ISPC=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 isn't received這里已經(jīng)對(duì)ACK進(jìn)行了判斷,你可以在其中加代碼的。

    SWITCH(_iicMode)
    {
    case POLLACK:
        _iicStatus=iicSt;
        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.
        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.
        for(i=0;i<10;i++);        //for setup time until rising edge of IICSCL
        rIICCON=0xaf;        //resumes IIC operation.
        break;

    case SETRDADDR:
        //Uart_Printf("[S%d]",_iicDataCount);
        if((_iicDataCount--)==0)
        {
        break;  //IIC operation is stopped because of IICCON[4]    
        }
        rIICDS=_iicData[_iicPt++];
        for(i=0;i<10;i++);  //for setup time until rising edge of IICSCL
        rIICCON=0xaf;        //resumes IIC operation.
        break;

    default:
        break;      
    }
}

呵呵,他的程序是沒有問題的,可以實(shí)際放手跑一下,只要你沒有把全局中斷屏蔽掉,中斷應(yīng)該可以產(chǎn)生的,自己試過的,再說現(xiàn)在這個(gè)程序不知道多少家都用了,最少是學(xué)了,肯定是沒問題的。自己寫當(dāng)然也行了,不過有經(jīng)典的程序方式,還是可以值得學(xué)習(xí)一下的,自己按照IIC時(shí)序?qū)懙囊餐ㄟ^的。
下面是自己調(diào)的時(shí)候?qū)懙腎IC讀的部分:
void RdAT24C08(U32 slvAddr,U32 addr,U8 *data)
{
CHAR recv_byte;
iGetACK = 0;
rIICDS = slvAddr;
rIICSTAT=0xf0;
while(iGetACK == 0);// 等待 ACK
iGetACK = 0;
rIICDS = addr;
rIICCON = 0xaf;
while(iGetACK == 0);
iGetACK = 0;
rIICDS = slvAddr;
rIICSTAT=0xb0; // 主方式Rx 開始
rIICCON=0xaf;
while(iGetACK == 0);
iGetACK = 0;
recv_byte = rIICDS;
rIICCON = 0x2f;
DelayMs(1);
recv_byte = rIICDS;
rIICSTAT = 0x90;
rIICCON = 0xaf;
DelayMs(5);
*data = recv_byte;
}


* - 本貼最后修改時(shí)間:2006-8-23 11:03:28 修改者:HUAI903

參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
請(qǐng)教周公,ADS1.2中的一個(gè)問題.
關(guān)于USB
關(guān)于周立功和杭州立宇泰的開發(fā)板
IAR環(huán)境下Wiggler和H-JTAG使用教程
請(qǐng)大家推薦一款合適的ARM開發(fā)板
免費(fèi)注冊(cè)為維庫電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入


Copyright © 1998-2006 www.udpf.com.cn 浙ICP證030469號(hào)