Microprocessor/DSP (TMS320F28x) TR28335 개발 KIT IC2(Inter integrated circuit) 통신
  • 728x90
    반응형

     

    I2C 통신 LoopBack Test

     

    SOURCE TR28335_I2c.h

    /*===============================================
     *
     * FILE  : TR28335_I2c.h .2017
     * TITLE : TR28335 I2C (Inter integrated circuit)
     *
     *===============================================*/
    #ifndef __TR28335_I2C_H__
    #define __TR28335_I2C_H__
    #ifdef __cplusplus
    extern "C" {
    #endif
    #include <main.h>
    
    void InitI2c(void);
    void i2cLpb(void);
    Uint16 I2caWData(Uint16 saddr, Uint16 uumOfByte, Uint16 *data);
    
    #ifdef __cplusplus
    }
    #endif /* extern "C"        */
    #endif /* __TR28335_I2C_H__ */

     

     

    SOURCE TR28335_I2c.c

    /*===============================================
     *
     * FILE  : TR28335_I2c.c .2017
     * TITLE : TR28335 I2C (Inter integrated circuit)
     *
     *===============================================*/
    #include <TR28335_I2c.h>
    #include <Strings.h>
    
    interrupt void i2c_int1a_isr(void);
    
    Uint16 gI2cTxBuff[16];
    Uint16 gI2cRxBuff[16];
    Uint16 gI2cErrorCount;
    Uint16 gI2cIntSource;
    Uint16 gI2cIntCount;
    
    /*==================================
    *
    * Name        : InitI2c
    * Type        : Function
    * Description : I2C Initialization 
    *
    ====================================*/
    void InitI2c(void)
    { 
        bzero(gI2cTxBuff, sizeof(gI2cTxBuff));
        bzero(gI2cRxBuff, sizeof(gI2cRxBuff));
        gI2cErrorCount = 0;
        gI2cIntCount   = 0;
        gI2cIntSource  = 0;
        
        /* Vector Remapping */
        EALLOW;
        PieVectTable.I2CINT1A = &i2c_int1a_isr;
        EDIS;
    
        /* Initialize internal I2C peripheral module */
        InitI2CGpio();                     /* GPIO 를 I2C 통신 용으로 설정                                  */
    
        I2caRegs.I2CMDR.bit.IRS = 0;       /* I2C extended module : I2C module reset bit                    */
        I2caRegs.I2CPSC.all     = 9;       /* Prescaler Register- need 7-12 Mhz on module clk               */
        I2caRegs.I2CCLKL        = 10;      /* I2C Clock Low-Time Divider Regisiter, NOTE : must be non zero */
        I2caRegs.I2CCLKH        = 5;       /* I2C Clock High-Time Divider Register, NOTE : must be non zero */
        I2caRegs.I2COAR         = 0x01;    /* Own Address Register                                          */
        I2caRegs.I2CIER.bit.SCD = 1;       /* Enable SCD interrupts                                         */
        I2caRegs.I2CFFTX.all    = 0x6000;  /* Enable FIFO mode and TXFIFO                                   */
        I2caRegs.I2CFFRX.all    = 0x2040;  /* Enable RXFIFO,   clear RXFFINT                                */
        I2caRegs.I2CMDR.bit.IRS = 1;
    
        /* PIE의 ADC 인터럽트 활성화 */
        PieCtrlRegs.PIEIER8.bit.INTx1 = 1;  /* PIE 인터럽트 (I2CINT1A) 활성화 */
        IER |= M_INT8;                      /* CPU 인터럽트 (INT8) 활성화     */    
    }
    
    /*============================================
    *
    * Name        : i2c_int1a_isr
    * Type        : Interrupt
    * Description : I2C Interrupt Service Routine  
    *
    =============================================*/
    interrupt void i2c_int1a_isr(void)
    {
        Uint16 NumOfByte;
        Uint32 i;
        
        /* Read interrupt source */
        gI2cIntSource = I2caRegs.I2CISRC.all;
        
        NumOfByte = I2caRegs.I2CFFRX.bit.RXFFST;
    
        /* FIFO 에 수신된 데이터를 메모리에 저장 */
        for (i = 0; i < NumOfByte ;i++) 
            gI2cRxBuff[i] = I2caRegs.I2CDRR;
    
        gI2cIntCount++;
    
        /* Enable future I2C (PIE Group 8)interrupts */
        PieCtrlRegs.PIEACK.all = PIEACK_GROUP8;    
    }
    
    /*==================================
    *
    * Name        : i2cLpb
    * Type        : Function
    * Description : I2C Loop Back Test 
    *
    ====================================*/
    void i2cLpb(void)
    {
        Uint32 i;
        
        /* I2C 데이터 송신 */
        while (I2caWData(0x01, sizeof(gI2cTxBuff), gI2cTxBuff) != I2C_SUCCESS);
        DELAY_US(1000000);
        
        for (i = 0; i < sizeof(gI2cTxBuff); i++) {
            if(memcmp(gI2cRxBuff, gI2cTxBuff, sizeof(gI2cTxBuff)) != OK)
                gI2cErrorCount++;
        }
        
        for (i = 0; i < sizeof(gI2cTxBuff); i++) {
            gI2cTxBuff[i] += 1;
            gI2cTxBuff[i] &= 0xFF;
        }    
    }
    
    /*==================================
    *
    * Name        : I2caWData
    * Type        : Function
    * Description : I2C Write Data 
    *
    ====================================*/
    Uint16 I2caWData(Uint16 saddr, Uint16 numOfByte, Uint16 *data)
    {
        Uint16 ret = I2C_SUCCESS;
        Uint32 i;
        
        /* I2C could get confused. */
        if (I2caRegs.I2CMDR.bit.STP == 1)
            ret = I2C_STP_NOT_READY_ERROR;
        else {
            if (I2caRegs.I2CSTR.bit.BB == 1)
                ret = I2C_BUS_BUSY_ERROR;
            else {
                /* 전송할 데이터의 Slave Address 설정 */
                I2caRegs.I2CSAR = saddr;
                /* 전송할 데이터의 Byte 수를 설정 */
                I2caRegs.I2CCNT = numOfByte;
                /* 전송할 데이터를 I2C(FIFO)에 저장 */
                for (i = 0; i < numOfByte; i++)
                    I2caRegs.I2CDXR = *(data+i);
            }
    
            /* Master Transmitter 모드로 데이터 전송 (Digital LoopBack 모드 사용) */
            I2caRegs.I2CMDR.all = 0x2E20;
        }
        
        return ret;
    }

     

    코드 분석

     

    Step 1. I2CINT1A : PIE Vector Table 에 Interrupt service routine 등록 

     

     

    Step .2 I2CMDR - IRS : 0을 쓰면 I2C 모듈을 reset/disabled 시키고, I2CSTR(상태비트) 가 모두 초기화 된다. 1을 쓰면 I2C 모듈을 Enable 시킨다. 

     

    STT, STP 비트는 IRS 가 1일때만 사용이 가능하다.

    • NACKMOD : 오직 수신 동작일때 만 사용한다. 0 이면 슬레이브 수신동작에서 매 확인 주기마다 ACK신호를 송신한다. 1이면 슬레이브 또는 마스터 수신동작에서 다음 확인 주기에 NACK신호를 송신한다. 이 신호가 한번 송신되면 이 bit는 클리어 된다.
    • FREE : Break Point에서의 동작을 제어한다. 0이면 마스터 일때 SCL 신호가 low상태라면, 그 즉시 I2C모듈을 정지시킨다. SCL신호가 high이면 low가 될 때까지 기다렸다가 정지 시킨다. 1이면 Break Point와 상관없이 모든 동작이 그대로 진행된다.
    • STT : 마스터일 때만 사용한다. 1을 쓰면 START 신호를 발생 시킨다. 발생 후에 자동으로 클리어 된다. Repeat Mode(RM=1)를 종료시킬 때도 사용된다. IRS=0 일 때, 이 비트는 사용할 수 없다.
    • STP : 마스터일 때만 사용한다. 1을 쓰면 STOP 신호를 발생 시킨다. 발생 후에 자동으로 클리어 된다. Repeat Mode(RM=1)를 종료 시킬 때도 사용된다 IRS=0 일 때, 이 비트는 사용할 수 없다.
    • MST : 이 비트에 1을 쓰면 마스터가 된다. STOP 신호를 발생시키고 나면, 다시 0으로 바뀐다. 0일 때는 슬레이브가 된다. 
    • TRX : 이 비트에 1을 쓰면, 쓰기모드가 된다. 0을 쓰면 읽기모드가 된다.
    • XA : 이 비트에 1을 쓰면, 10bit addressing mode가 된다. 자신이 슬레이브일 때의 주소(I2COAR의 9-0bit) 또한 10bit이다. 이 비트에 0을 쓰면, 7bit addressing mode가 된다. 자신이 슬레이브일 때의 주소(I2COAR의 6-0bit) 또한 7bit 이다.
    • RM : 이 비트에 1을 쓰면, repeat모드로 설정 된다. 오직 마스터 송신 모드에서만 유용하다. 한 data byte가 각 주기마다 전송된다. START신호를 수동으로 발생 시키거나, FIFO모드에서 FIFO가 바닥날 때까지 I2CDXR 레지스터에 data byte가 쓰여진다. repeat 모드에서 I2CCNT 레지스터의 값은 무시된다. ARDY인터럽트 비트는 I2CDXR 레지스터에 값을 쓸 준비가 되어있는지 또는 모든 데이터가 전송 되었는지를 확인하는데 쓰여질 수 있다. 데이터가 한번 전송 되고 나면 START신호를 발생 시킬 수 있는 기회가 주어진다.

     

    • DLB : 이 비트에 1을 쓰면, 디지털 Loop-Back 모드로 설정된다. 이 모드가 제대로 동작하려면, 반드시 마스터 모드여야 한다.
    • STB : START byte 모드이다. 마스터일 때만 사용한다. 슬레이브 장치에서 START신호를 인식하는데 조금 더 많은 시간이 필요할 때 유용하다. 만약 슬레이브 모드라면, 마스터로부터 전송되는 START byte는 무시된다. START byte가 전송되는 과정은 다음과 같다.

     

    1. START신호 전송
    2. START byte(0000 0001b) 전송
    3. 더미 ACK 신호 전송
    4. 다시 START 신호 전송

     

    • FDF : 이 비트가 1이면, START신호 후에 바로 data byte가 출력된다. Data byte 사이사이에 ACK 신호가 수신된다. Data byte마다 몇bit가 출력될 것인지는, BC field에 의존한다. 반드시 송신부와 수신부 모두 free data 모드를 지원해야 한다. LoopBack 모드(DLB=1)에서는 free data 모드가 지원되지 않는다. 이 비트가 0이면, XA filed에 의해 7또는 10비트 addressing format으로 작동한다.

     

     

    • BC : BC field 이다. BC field 는 다음 송신 또는 수신될 data byte의 bit수를 정의한다. 반드시 다른 장치의 data 사이즈와 일치해야 한다. BC field는 address bytes에 영향을 주지 않으며, address bytes는 항상 8비트이다. 

    BC field가 8비트 보다 낮을 때, 수신 데이터는 I2CDRR(7-0) 레지스터에 오른쪽 정렬되고, I2CDRR의 나머지 bit는 정의되지 않는다. 또한, I2CDXR 레지스터에 쓰여지는 송신 데이터는 반드시 오른쪽 정렬 되어진다.

     

     

    • RM, STT, STP 조합 테이블 : 3개의 bit field 설정에 따라 위와 같은  데이터 전송 순서가 정해진다.

     

     

     

    • MST, FDF 조합 테이블 :
      • 00 : Slave 모드 이므로 TRX비트에 상관없이, 마스터의 명령에 송신 또는 수신자로써 응답한다.
      • 01 : Slave 모드지만, free data 모드이기도 하다. Free data모드에서는 데이터가 전송되는 동안, 송신 또는 수신 상태를 유지해야 한다. 즉 데이터가 전송되는 동안에는 TRX값을 반드시 유지해야 한다.
      • 10 : 그냥 마스터 모드이다. TRX에 따라 송신자 또는 수신자모드가 된다.
      • 11 : 마스터이면서 free data 모드. TRX에 따라 송신자 또는 수신자모드가 되며 데이터가 전송되는 동안 TRX값은 유지되어야 한다.

     

     

     

     

    • Step .3 I2CPSC : I2C 프리스케일러 8비트 레지스터이다. IPSC는 모듈이 리셋될 때 반드시 초기화 되어야 한다. 계산식은 다음과 같다.

    module clock frequency = I2C input clock/(IPSC + 1)
    *I2C input clock == SYSCLKOUT

     

     

     

    • Step .4 I2CCLK & I2CCLKH : SCL의 한 주기의 시간을 Tmst라 하고 이것은 (ICCL+d) + (ICCH+d)를, 위에서 구한 module clock frequency로 나눠주면 된다.

     

     

     

     

    • Step .5 I2COAR : 자신의 슬레이브 주소를 지정하는 레지스터이다. 슬레이브로 동작할 때, 다른 마스터 장치가 자신을 선택할 수 있도록 주소를 지정해 줘야한다.

    7비트 어드레스 모드일 때, 9-7비느는 0으로 채워줘야 한다.

     

     

     

    • Step .6 I2CIER - SCD : 이 비트에 1을 쓰면, I2C버스에 STOP신호가 감지되었을 때 인터럽트가 발생한다.
      • AAS : 이 비트에 1을 쓰면, 슬레이브 모드에서 자신의 주소가 전송 되었을 때, 인터럽트가 발생한다.
      • XRDY : 이 비트에 1을 쓰면, I2CDXR레지스터에서 I2CXSR레지스터로 데이터가 복사되어 I2CDXR레지스터에 데이터를 쓸 준비가 되었을 때, 인터럽트가 발생한다. FIFO모드에서는 이 인터럽트를 사용해서는 안되며, 대신 FIFO인터럽트를 사용해야 한다.
      • RRDY : 이 비트에 1을 쓰면, I2CRSR레지스터에서 I2CDRR레지스터로 데이터가 복사되어 I2CDRR레지스터가 데이터를 읽을 준비가 되었을 때, 인터럽트가 발생한다. FIFO모드에서는 이 인터럽트를 사용해서는 안되며, 대신에 FIFO인터럽트를 사용해야 한다.
      • ARDY : 이 비트에 1을 쓰면, 미리 짜여진 주소, 데이터, 명령 값이 사용 되었을 때, 인터럽트가 발생한다. (I2CSTR레지스터의 ARDY비트를 이용해 폴링방식 인터럽트를 구성할 수 있다.
      • NACK : 이 비트에 1을 쓰면, 현재 마스터 송신모드이면서 슬레이브 수신장치로부터, 확인신호(ACK)를 받지 못하였을 때 인터럽트가 발생한다. 
      • AL : 이 비트에 1을 쓰면, 다른 마스터 송신 장치로부터 START신호가 먼저 발생하여, 마스터로서의 제어권을 상실하게 되었을 때, 인터럽트가 발생한다. (I2CSTR레지스터의 AL비트를 이용해 폴링방식 인터럽트를 구성할 수 있다.)

     

     

     

     

    • Step .7 I2CFFTX : 전체 비트 내용은 아래와 같다.
      • I2CFFEN : 송신/수신 FIFO Enable비트. 송신 그리고 수신 FIFO모드가 동작하려면, 이 비트를 1로 해줘야 한다.
      • TXFFRST : 이 비트가 1이면, 송신 FIFO가 계속해서 동작한다. 0이면, 송신 FIFO가 0000으로 리셋 되고, 그 리셋 상태를 계속 유지한다.
      • TXFFST4-0 : 0~0x10000(0~16)까지 표현 가능하다. 송신 FIFO큐에 몇 바이트의 데이터가 들어왔는지 표시해 준다.
      • TXFFINT : 송신 FIFO 인터럽트의 요청 여부를 표시해주는 상태 비트이다.
      • TXFFINTCLR : 이 비트에 1을 써주면, TXFFINT 비트를 클리어 한다. 
      • TXFFIENA : 송신 FIFO인터럽트를 허용해 준다.
      • TXFFIL4-0 : TXFFST field에 몇바이트가 들어오면 인터럽트를 발생 시킬 것인지의 수위를 조절하는 비트이다. 당연히 0~16까지를 지정할 수 있다. TXFFST와 TXFFIL이 일치하면 인터럽트가 발생한다.

     

     

     

     

    • Step .8 I2CFFRX : 전체 비트 내용은 아래와 같다.
      • RXFFRST : 이 비트가 1이면, 수신 FIFO가 계속해서 동작한다. 0이면 수신 FIFO가 0000으로 되고, 그 리셋 상태를 계속 유지한다.
      • RXFFSTS4-0 : 0~0x10000(0~16)까지 표현 가능하다. 수신 FIFO큐에 몇 바이트의 데이터가 들어왔는지 표시해 준다.
      • RXFFINT : 수신FIFO 인터러트의 요청 여부를 표시해 주는 상태 비트이다.
      • RXFFINTCLR : 이 비트에 1을 써주면 RXFFINT 비트를 클리어 한다.
      • RXFFIENA : 수신 FIFO 인터럽트를 허용해 준다.
      • RXFFIL4-0 : RXFFST field에 몇 바이트가 들어오면 인터럽트를 발생 시킬 것인지의 수위를 조절하는 field이다. 당연히 0~16까지를 지정할 수 있다. RXFFST와 RXFFIL이 일치하면 인터럽트가 발생한다.

     

     

     

    • Step .9 I2CSTR : 전체 비트 내용은 아래와 같다.
      • SDIR : 마스터 장치로 하여금, 슬레이브 송신장치로 지정되었을 때, 1로 set된다. 클리어 되는 조건은 다음 3가지이다. 
        1. 이 비트에 1을 써줌으로써 0으로 클리어 된다. 
        2. DLB모드(Digital loopback mode)가 enable 되었을 때. 
        3. START 또는 STOP 신호가 발생했을 때.
      • NACKSNT : 확인 신호 송신주기 때, NACK(no-acknowledge) 비트를 송신하게 되면, 1로 set된다. (ex : NACKMOD in I2CMDR). 클리어 되는 조건은 다음 2가지이다.
        1. 이 비트에 1을 써줌으로써 0으로 클리어 된다.
        2. I2CMDR레지스터의 IRS비트에 0을 써줌으로써 I2C모듈이 reset되었을 때, 또는 DSP가 리셋 되었을 때.
      • BB : START신호를 송신하거나 수신되어서, Bus가 Busy 상태일 때, 1로 set된다. 클리어 되는 조건은 다음 3가지이다.
        1. STOP 신호를 송신하거나 수신되었을 때.
        2. 이 비트에 1을 써줌으로써 0으로 클리어 된다.
        3. I2CMDR레지스터의 IRS비트에 0을 써줌으로써 I2C모듈이 reset 되었을 때, DSP가 리셋 되었을 때.
      • RSFULL : receive register(I2CDRR)의 데이터를 읽지 않은 상태에서 새로운 데이터가 shift register(I2CRSR)에 도착했을 때 1로 set된다. I2CDRR레지스터를 읽기 전에는 I2CRSR에 있는 데이터가 I2CDRR에 복사 되지 않는다. 이 비트가 클리어되는 조건은 다음 2가지이다.
        1. CPU에 의해 I2CDRR레지스터가 읽혔을 때.
        2. I2CMDR레지스터의 IRS비트에 0을 써줌으로써 I2C모듈이 reset되었을 때, 또는 DSP가 리셋 되었을 때.
      • XSMT : I2CDXR로 부터 I2CXSR에 데이터가 복사되었을 때 1로 set된다. 즉, 사용자가 I2CDXR에 데이터를 써 넣음으로써, 이 비트를 1로 set 시킬 수 있다. 마지막 I2CDXR-to-I2CXRS복사가 일어난 이래로 I2CDXR레지스터에 데이터가 입력되지 않는다면, underflow가 일어나고 이 비트는 클리어 된다. 즉 I2CXSR레지스터가 비어있으면 클리어 된다. 해당주기의 새로운 값이 없으면, 아마 이전 값이 전송될 것이다. I2C모듈이 리셋되면, 이 비트는 1로 set되는 것을 주의하자.
      • AAS : 슬레이브 모드에서 자신의 주소가 마스터로부터 전송 되었을 때 또는, general call(ALL zero)주소가 전송되었을 때 또는 free data format(FDF=1 in I2CMDR) 에서 첫 번째 데이터가 전송 되었을 때, 1로 set된다. 클리어 되는 조건은 다음과 같다.
        1. 7bit-addressing mode 에서 : NACK 신호가 전송되었을 때, STOP신호가 탐지되었을 때, REPEATED START신호가 탐지 되었을 때
        2. 10bit-addressing mode 에서 : NACK 신호가 전송되었을 때, STOP 신호가 탐지되었을 때, 자신의 주소가 아닌 다른 주소가 선택되었을 때.
      • AD0 : general call(All zero) 주소가 전송 되었을 때, 1로 set 된다. START 또는 STOP신호가 감지되면, 클리어 된다.
      • SCD : STOP 신호가 감지되었을 때, 1로 set 된다. 클리어 되는 조건은 다음과 같다.
        1. CPU에 의해 I2CISRC에 있는 110b 값 (STOP신호 감지)이 읽혀 졌을 때. 
        2. 이 비트에 1을 써줌으로써 클리어 된다.
        3. I2CMDR레지스터의 IRS비트에 0을 써줌으로써 I2C모듈이 reset 되었을 때 또는 DSP가 리셋 되었을 때.
      • XRDY : I2CDXR의 이전 값이 I2CXSR레지스터에 복사되어 I2CDXR에 새로운 데이터를 받을 준비가 되면, 1로 set된다. (FIFO 모드가 아닐 때) I2CDRX 에 새로운 값을 입력 하면 클리어된다. 모듈이 reset되었을 때 이 비트는 1로 set된다. (주의)
      • PRDY : I2CRSR레지스터에서 I2CDRR로 데이터가 복사되어, I2CDRR이 데이터를 읽을 준비가 되면 1로 set된다. 클리어 되는 조건은 다음 3가지 이다. 
        1. CPU에 의해 I2CDRR 레지스터가 읽혔을 때.
        2. 1을 써줬을 떄.
        3. I2CMDR레지스터의 IRS비트에 0을 써줌으로써 I2C모듈이 reset 되었을 때 또는 DSP가 리셋 되었을 때.
      • ARDY : 마스터 모드일 때만 적용된다. 미리 짜여진 주소, 데이터, 명령 값이 사용되어서 I2C모듈의 레지스터들의 접근이 준비되었을 때 1로 set된다. repeat모드가 아니고, I2CMDR레지스터의 STP bit가 0일 때(STOP신호가 없을 때), 내부 데이터 카운터가 0까지 카운팅 하면 ARDY는 영향을 받지 않는다. repeat모드 일 때, I2CDXR레지스터의 데이터가 1바이트씩 전송될 때 마다 ARDY비트가 1로 set된다. 클리어 조건은 다음과 같다.
        1. I2C모듈의 레지스터가 사용 중 일 때.
        2. 이 비트에 1을 썼을 때
        3. I2CMDR레지스터의 IRS비트에 0을 써줌으로써 I2C모듈이 reset 되었을 때 또는 DSP가 리셋 되었을 때.
      • NACK : 송신모드로 작동할 때만 적용된다. 수신장치로 부터 NACK 신호를 받으면 1로 set된다. I2C모듈이 heneral call(All zero-Address)로 작동할 때는, 한개 이상의 Slave가 ACK 신호를 보내더라도, 이 비트는 1로 set된다. 클리어 되는 조건은 다음과 같다.
        1. 수신장치로부터 ACK 신호가 전송 되었을 때.
        2. 이 비트에 1을 썼을 때.
        3. I2CMDR레지스터의 IRS비트에 0을 써줌으로써 I2C모듈이 reset되었을 때 또는 DSP가 리셋 되었을 때.
      • AL : 마스터 송신모드로 작동할 때만 적용된다. I2C모듈이 전송을 시도하면 1로 set된다. 클리어 되는 조건은 다음과 같다.
        1. 이 비트에 1을 썼을 때.
        2. CPU가 I2CISRC 레지스터로 부터 001코드를 읽었을 때.
        3. I2CMDR레지스터의 IRS비트에 0을 써줌으로써 I2C모듈이 reset 되었을 때 또는 DSP가 리셋 되었을 때.

     

     

    • Step .10 I2CISRC : 발생된 I2C인터럽트를 표시해 주는 레지스터이다. CPU가 이 레지스터를 읽으면 클리어 된다.
      • 000 : 아무 변화 없음
      • 001 : AL 인터럽트
      • 010 : NACK 인터럽트
      • 011 : ARDY 인터럽트
      • 100 : RRDY 인터럽트 
      • 101 : XRDY 인터럽트
      • 110 : SCD 인터럽트 
      • 111 : AAS 인터럽트 

     

     

    • Step .11 ICSAR : 마스터 송신 모드로 동작할 때, 다음 송신할 슬레이브 주소를 담는 레지스터이다. I2CMDR 레지스터의 FDF field에 의해 7bit 또는 10bit 의 주소를 담을 수 있다. 주소가 0일 경우 general call(모든 슬레이브에게 전송)모드가 된다.

    7비트 어드레스 모드일 때 9-7비트는 0으로 채워줘야 한다.

     

     

    • Step .12 I2CCNT : 송신모드로 작동할 때, 얼마나 많은 데이터 바이트를 송신할 것인지를 설정해 주는 레지스터이다. 마스터 수신모드로 작동할 때는 얼마나 많은 데이터 바이트를 수신할 것인지를 설정해 준다. 이 값은 내부 데이터 카운터에 복사되고, 한 바이트가 전송될 때마다 내부 데이터 카운터의 값이 1씩 감소한다. (단 I2CCNT값은 변하지 않는다.)
      • 0000 :  내부 데이터 카운터에 65536값이 복사 된다. 
      • 1~FFFF : 내부 데이터 카운터에 1~65535값이 복사 된다. 

     

     

    • Step .13 I2CDRR : 최대 8bit 데이터를 저장할 수 있는 레지스터이다. 수신 모드일 때 I2CRSR에 정해진 (I2CMDR레지스터의 BC field 에 의해 정해진) 한 바이트의 데이터가 모두 전송되고 나면, I2CRSR에 있는 데이터가 I2CDRR에 복사된다. CPU는 I2CRSR레지스터에 직접적인 접근이 불가능 하다. 8bit보다 작은 데이터는 I2CDRR레지스터에 오른쪽 정렬되어 저장된다. 예를 들어 I2CMDR레지스터의 BC field 가 011(3-bit data size)이면, 전송된 데이터는 I2CDRR의 2-0 field에 정렬되어 저장되고, 나머지 field 는 정의되지 않는다. 수신 FIFO모드로 동작할 때 I2CDRR레지스터는 수신 FIFO버퍼로 동작한다.

     

     

     

    • Step .14 I2CDXR : 최대 8bit의 데이터를 저장할 수 있는 레지스터이다. 송신 모드일 때 I2CDXR에 정해진 (I2CMDR레지스터의 BC field에 의해 정해진) 송신할 데이터를 입력 하면 I2CDXR에 있는 데이터가 I2CXSR에 복사된다. 모두 복사되면, 수신장치로 데이터가 정송된다. CPU는 I2CXSR레지스터에 직접적인 접근이 불가능하다. I2CDXR레지스터에 8비트보다 작은 데이터 포멧을 입력하면, 데이터는 오른쪽 정렬되어 저장된다. 송신 FIFO모드로 동작할 때 I2CDXR레지스터는 송신 FIFO버퍼로 동작한다.

     

     

    결과

     

     

    TxBuff 로 전송한 데이터가 RxBuff로 수신되는 것 을 알 수 있다.

     

     

     

     

     

     

    728x90
    반응형
상단으로