發新話題
打印

C8051F410的SMBus

C8051F410的SMBus

請問它的SDA和SCL可以任意指定嗎?
還是只能P0.0和P0.1或是P0.2和P0.3這樣連在一起的形式
我是想要一個P0.0,另一個是P1.5
這是因為現有材料的限制orz

還有在SMB0CN中的STA
當software設定它以後,就會馬上傳送一個start bit嗎
如果是,後面有接著slave address和R/W嗎
或是要等到slave那邊ack回來,接收到ack後,再傳送slave address和R/W
照理說,應該市start後面接著slave address和R/W
但是我不懂data sheet上STA的說明:
                              If STA is set by software as an active master,a repeated
                              START will be generated after the next ACK cycle.
我程式上的確是set by software,STA=1後,會產生interrupt,但是slave address有傳出去嗎?
如果有,應該就不用產生repeated start吧
如果沒有,那start bit送出去,接收到回來的ack,再送repeated start,這樣我還能接受

還是它就是連續兩次都是start bit+slave address然後再開始send data

TOP

一個P0.0,另一個是P1.5
==>可以
void SMBus_Init()
{
   SMB0CF |= 0x80;
}

void Port_IO_Init()
{
    // P0.0  -  SDA (SMBus), Push-Pull,  Digital
    // P0.1  -  SCL (SMBus), Push-Pull,  Digital
    XBR1      = 0x40;
        P0MDOUT   = 0x00;
        P0=0x00;
    P0MDOUT   = 0x00;        //use external-resistor
    XBR0      = 0x04;   //smbus
       
        TMOD      = 0x02;   //system clk
    CKCON     = 0x04;   //system clk
    TH0       = 0xD8;   //timer0 count smbus clk=400k

        TCON      = 0x10;   //enable timer 0

}

void delay(unsigned  int  value)
{
        while(value>1)
        value--;
}
//===================================================================
void wr_i2c_byte(unsigned char device, unsigned int addr, unsigned char value)
{
                unsigned char i;
                device <<= 1;
                STA=1;
                while(~SI);
                STA=0;       
                //-------------------------
                SMB0DAT=0xa0 | device;
                SI=0;       
                while(~SI);       
                //-------------------------
                SMB0DAT=addr / 0x100;
                SI=0;
                while(~SI);       
                //-------------------------
                SMB0DAT=addr % 0x100;
                SI=0;
                while(~SI);               
                //--------------------------       
                SMB0DAT=value;
                SI=0;
                while(~SI);       
                //--------------------------
                STO=1;
                SI=0;       
                while(1)
                {
                        i=SMB0CN;
                        if(i==0x02)
                        break;
                }
                STO=0;
                //--------------------------
                delay(write_delay);
}
//===================================================================
unsigned char rd_i2c_byte(unsigned char device, unsigned int addr)
{
                unsigned char i,j;
                device <<= 1;
                STA=1;
                while(~SI);
                STA=0;       
                //-------------------------
                SMB0DAT=0xa0 | device;
                SI=0;       
                while(~SI);       
                //-------------------------
                SMB0DAT=addr / 0x100;
                SI=0;
                while(~SI);       
                //-------------------------
                SMB0DAT=addr % 0x100;
                SI=0;
                while(~SI);               
                //-------------------------
                //-------------------------
                STA=1;
                SI=0;
                while(~SI);
                STA=0;       
                //-------------------------
                SMB0DAT=0xa1 | device;
                SI=0;       
                while(~SI);       
                //-------------------------
                SI=0;
                while(~SI);
               
                j=SMB0DAT;
                STO=1;       
                SI=0;       
                while(1)
                {
                        i=SMB0CN & 0x02;
                        if(i==0x02)
                        break;
                }
                STO=0;       
                return j;
}

TOP

發新話題