用过c8051f SMBUS读写eeprom的进来!

2020-02-03 10:12发布

用c8051f120 的smbus  读写24c16 能正常! 用的是官方的example  但读写24c32时不行    个人认为应该是写地址的时候出错了  因为24c32要写2个byte的地址    有没有哪位以前遇到过哦   2个byte的地址应该怎么写进去啊??    急急。。。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
14条回答
pingsiu
2020-02-04 02:46
//-----------------------------------------------------------------------------
//        Functions Prototype
//-----------------------------------------------------------------------------
char EPROM_WriteBlock (unsigned char addr, unsigned char l, unsigned char *da)
{
        unsigned char x;
        unsigned int y;
        //---------------------------------------------------------------
        EEPwp = 0;                                         // write on
        for (x=0; x<l; x++) {
                eep.chipAddr = 0xa0;                 // chip address
                eep.addr1st = addr+x;        
                eep.dataLen = 1;                                // data len
                eep.dataPtr = 0;
                eep.dataArray = da+x;                         // data byte
                eep.step = EEP_WRITE_INT;
                eep.on = ON;
                STO = 0;
                STA = 1;
                while (eep.step != EEP_READY_INT);
                eep.on = OFF;
                for (y=0; y<8192; y++);
        }
        EEPwp = 1;                                         // write OFF
        //---------------------------------------------------------------
        return eep.addr1st;
}
//-----------------------------------------------------------------------------
char EPROM_ReadBlock (unsigned char addr, unsigned char l, unsigned char *da)
{
        unsigned x;
        unsigned int epAddr;
        //---------------------------------------------------------------
        for (x=0; x<l; x++) {
                eep.chipAddr = 0xa0;
                eep.addr1st = addr+x;
                eep.dataLen = 0;
                eep.step = EEP_WRITE_INT;
                eep.on = ON;
                STO = 0;
                STA = 1;
                while (eep.step != EEP_READY_INT);
                //        Read time data from eep.
                eep.chipAddr = 0xa1;
                eep.dataLen = 1;
                eep.dataPtr = 0;
                eep.dataArray = da+x;
                eep.step = EEP_READ_INT;
                STO = 0;
                STA = 1;
                while (eep.step != EEP_READY_INT);
                eep.on = OFF;
        }
        //---------------------------------------------------------------
        return epAddr+1;
}
//-----------------------------------------------------------------------------
//        SMBUS (vector 7) Interrupt handler.
//-----------------------------------------------------------------------------
void smbus_int (void) interrupt SMB_VECTOR using 3
{
        if (eep.on) {
                switch (eep.step) {
                case EEP_READY_INT :
                        break;
                case EEP_WRITE_INT :
                        if (SMB0STA == SMB_START) {
                            SMB0DAT = eep.chipAddr;
                        STA = 0;
                                eep.step++;
                        }
                        break;
                case EEP_WRITE_INT+1 :
                        SMB0DAT = eep.addr1st;
                        eep.step++;
                        break;
                case EEP_WRITE_INT+2 :
                           if (eep.dataPtr < eep.dataLen) {
                                SMB0DAT = eep.dataArray[eep.dataPtr++];
                        } else {
                                STO = 1;
                                eep.step = EEP_READY_INT;
                        }
                        break;
                //-------------------------------------------------------------------------
                case EEP_READ_INT :
                        if (SMB0STA == SMB_START) {
                        STA = 0;
                            SMB0DAT = eep.chipAddr;
                                eep.step++;
                        }
                        break;
                case EEP_READ_INT+1 :
                        if (eep.dataLen == 1)
                                AA = 0;
                        eep.step++;
                        break;
                case EEP_READ_INT+2 :
                        eep.dataArray[eep.dataPtr++] = SMB0DAT;
                        switch (eep.dataLen-eep.dataPtr) {
                        case 0 :
                                AA = 1;
                                STO = 1;
                                eep.step = EEP_READY_INT;
                                break;
                        case 1 :
                                AA = 0;
                                break;
                        default :       
                                break;
                        }
                        break;
                }       
                SI = 0;
        }
}

一周热门 更多>