using FPPA make a I2C master interface to write and read ATMEL 24C01A

這是自己寫的 Sample Code 與 Padauke 的 Applicaiton Note 有些許不同
Ref:
Padauke I2C Master Applicaiton Note. get form http://www.padauk.com.tw/vtnews/TW/Softlist.aspx

// Definition I/O
I2CSCL          equ pa.3;
I2CSCLC         equ pac.3;
I2CSDA          equ pa.4;
I2CSDAC         equ pac.4;
I2C_DELAY       equ 0x40;
// Declare variable
int  I2CShiftBits;  // Shift Bits right or lift in the register
int     I2CD8B;
 
 
…….
…….
// FPP0 boot start
FPP0BOOT:
 …… // initial FPPA
 call initIO;
 set1 I2CSDA;
 set1 I2CSCL;
 …….
 
Test:
  call WR24C01;  // write 0x55, 0x0A, 0xA0 to address of EEPROM 0x00, 0x01, 0x02
  call RD24C01;  // read three byte data from address of EEPROM 0x00
   …
 
initIO:
 // IO setting
 // setting PA0 ~ 4 is output
 // pa.0, pa.1, pa.2 is LED(R, G, B)
 // pa.3, pa.4  is I2C_SCLK and I2C_SDA
 // Due to built in pull-up resister is 80KOhm, it is too big.
 // so not use it on I2C bus.
 mov  a, 0x1F;
 mov  pac, a ;
 // pb.0 for IR input, maybe change to pa.7
 mov  a, 0xFC;  //
 mov  pbc, a ;  //
 ret
 
 
 
I2C_START:
    // I2C start condition
 set1 I2CSCL; // assign SCL pin high
 set1 I2CSDA; // assign SDA pin high
 delay   0x4;
 set0 I2CSDA; // assign SDA pin low
 delay   0x4;
 set0    I2CSCL;
 ret
 
I2C_STOP:
    set0    I2CSDA;
    delay   0x4;
    set1    I2CSCL;
    delay   I2C_DELAY;
    set1    I2CSDA;
    delay   0xFF;
    delay   0xFF;
    delay   0xFF;
    delay   0xFF;   
    ret
I2C_WACK:
    // set to input
    set0    I2CSCL;
    delay   0x4;
    set0 I2CSDAC; // setting I2CSDA to input
    delay   I2C_DELAY;
    set1 I2CSCL;
    wait0 I2CSDA;
    delay   I2C_DELAY;
    set0 I2CSCL;
    set1 I2CSDAC; // setting I2CSDA to Output
    ret
   
I2C_SACK:
    set0    I2CSCL;
    delay   I2C_DELAY;
   
    set1 I2CSDAC; // setting I2CSDA to output
    set0    I2CSDA;
    delay   I2C_DELAY;
   
    set1    I2CSCL;
    delay I2C_DELAY;
   
    set0 I2CSCL;
    set0 I2CSDAC; // setting I2CSDA to input
    ret
   
I2C_NOACK:
 set0 I2CSCL;
 delay I2C_DELAY;
    set1 I2CSDAC; // setting I2CSDA to output
 set1 I2CSDA;
 delay I2C_DELAY;
 set1 I2CSCL;
 delay   I2C_DELAY;
 ret
 
I2C_W8BIT:
I2C_WORDADDR:
    mov     a, 0x08;
    mov     I2CShiftBits, a;
 

I2C_WL:
    delay   0x40;
    set0    I2CSCL;
    set0    FlagC;
    sl      I2CD8B;
    swapc   I2CSDA;
    delay   0x40;
    set1    I2CSCL;
    dzsn    I2CShiftBits;
    goto    I2C_WL;
    delay   0x40;
    ret
   
I2C_R8BIT:
    mov     a, 0x08;
    mov     I2CShiftBits, a;
    set0 I2CSDAC;
I2C_RL:
    delay   0x40;
    set0    I2CSCL;
    set0    FlagC;
    swapc   I2CSDA;
    slc     I2CD8B;
    delay   I2C_DELAY;
    set1 I2CSCL;
    dzsn    I2CShiftBits;
    goto    I2C_RL;
    delay   I2C_DELAY;
    ret
   
RD24C01:
 // dummy write, to setting read address of EEPROM
    mov     a, 0xA0;        // device address
    mov     I2CD8B, a;
    call    I2C_START;      // Genarator START condition for I2C
    call I2C_W8BIT;
    call I2C_WACK;
    mov     a, 0x00;
    mov     I2CD8B, a;      // Genarator word address
    call    I2C_WORDADDR;
    call    I2C_WACK;
  
    // read data to eeprom
    mov  a, 0xA1;  // device address
    mov  I2CD8B, a;
    call I2C_START;
    call I2C_W8BIT;
    call I2C_WACK;
   
    // first byte
    mov     I2CD8B, a;
    call    I2C_R8BIT;
    call    I2C_SACK;
    mov     a, I2CD8B;
    // register ‘a’ equal 0x55
    // second byte
    call    I2C_R8BIT;
    call    I2C_SACK;   
    mov     a, I2CD8B;

    // register ‘a’ equal 0x0A
 
    // thrid byte
    call    I2C_R8BIT;
    call    I2C_NOACK;
    mov     a, I2CD8B;

    // register ‘a’ equal 0xA0
 

    // Genaration STOP condition for I2C
    call    I2C_STOP;
    ret
   
WR24C01:
    mov     a, 0xA0;        // device address
    mov     I2CD8B, a;
    call    I2C_START;      // Genaration START condition for I2C
    call    I2C_W8BIT;
    call I2C_WACK;
    mov     a, 0;
    mov     I2CD8B, a;      // Genaration word address
    call    I2C_WORDADDR;
    call    I2C_WACK;
  
    // write data to eeprom
   
    // first byte
    mov     a, 0x55;
    mov     I2CD8B, a;
    call    I2C_W8BIT;
    call    I2C_WACK;
    // second byte
    mov     a, 0x0A;
    mov     I2CD8B, a;
    call    I2C_W8BIT;
    call    I2C_WACK;   
    // thrid byte
    mov     a, 0xA0;
    mov     I2CD8B, a;
    call    I2C_W8BIT;
    call    I2C_WACK;
    // Genaration STOP condition for I2C
    call    I2C_STOP;
    ret

 
Technorati tags: , , , , , ,
廣告

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s

%d 位部落客按了讚: