yangzeyu 发表于 2011-3-9 16:42:54

用过c8051f SMBUS读写eeprom的进来!

用c8051f120 的smbus读写24c16 能正常! 用的是官方的example但读写24c32时不行    个人认为应该是写地址的时候出错了因为24c32要写2个byte的地址    有没有哪位以前遇到过哦   2个byte的地址应该怎么写进去啊??    急急。。。

qinshi1208 发表于 2011-3-9 16:51:12

好像记得是用的中断方式的,一直都不用他这个例程,查询的用得也很稳定

yangzeyu 发表于 2011-3-9 16:58:38

回复【1楼】qinshi1208
-----------------------------------------------------------------------

确实是中断哈不过问题就是不知道是16位两个byte的地址是分两次中断写还是进一次中断就给写完了

Jigsaw 发表于 2011-3-9 17:00:48

要改写的

yangzeyu 发表于 2011-3-9 18:30:15

回复【3楼】Jigsaw
-----------------------------------------------------------------------

知道怎么改不呢嘿嘿

pingsiu 发表于 2011-3-10 00:34:34

//-----------------------------------------------------------------------------
//        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;
                        } 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 = 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;
        }
}

lileistone 发表于 2011-3-10 00:40:52

还是07年用过的。。。太久远了。。。

yangzeyu 发表于 2011-3-12 20:02:55

回复【5楼】pingsiu
-----------------------------------------------------------------------

谢谢不过看的有点晕呼呢

yangzeyu 发表于 2011-3-12 20:04:06

继续求解啊前两天出去了   。。。。

yangzeyu 发表于 2011-3-12 20:09:07

主要是 24c3216位的地址在中断里面怎么处理???

afei8856 发表于 2011-9-23 14:16:54

楼主解决了么 地址怎么处理的

lanjie13515 发表于 2011-9-26 20:54:27

void write_byte(unsigned char addr, unsigned char write_data)
// 在指定地址addr处写入数据write_data
{
        unsigned int adrl = addr%256;
        unsigned int adrh = addr/256;
        start();
        shout(OP_WRITE);
        shout(adrh);
        shout(adrl);
        shout(write_data);
        stop();
        DelayMS(10);                // 写入周期
}

unsigned int adrl = addr%256;
unsigned int adrh = addr/256;
就是你想要的吧,不知道对不对。

edasky 发表于 2012-8-14 08:38:59

如何通过smbus得到电池信息

dory_m 发表于 2012-10-11 09:03:44

学习!!!{:smile:}{:sad:}{:biggrin:}
页: [1]
查看完整版本: 用过c8051f SMBUS读写eeprom的进来!